将消息记录到窗口,游戏应用程序

时间:2011-08-15 01:41:25

标签: c++ winapi

我有一个高速渲染应用程序,我想将日志消息输出到单独的窗口。应用程序是多线程的,并且所有线程都可能在任何给定时间记录某些内容。

我已经在使用控制台输出了,这很好用!

我做的是:

  • 创建logMessage队列
  • 每当线程有话要说时,它会锁定队列并将其消息插入队列
  • 有一个一个“刷新”线程,直到某个线程记录某些内容(在任何线程上调用log()的行为唤醒刷新线程)并且其工作是刷新所有将消息记录到文件和控制台。

这对于文件和控制台日志记录都很好:既不关心他们接收打印调用的线程也不同于应用程序的主线程。但是,any other window you create does care。所以现在当我尝试打印到我创建的separate RichText window时,刷新线程不起作用。

所以这令人失望。现在唯一的解决方案是将 flush 线程代码移动到主线程(运行渲染循环的那个),这意味着显示可能会有很长的延迟一个框架(如果等待锁定日志队列以便输出它们),这是我不想要的。

1 个答案:

答案 0 :(得分:0)

看起来你的冲洗线程看起来像冲突了:

  • 这是一个工作线程,希望能够在没有工作要做的时候睡觉 - 可能在事件句柄上使用WaitForSingleObject

  • 但是,如果线程创建了一个窗口,它现在需要表现为GUI线程 - 这意味着它不允许阻塞或等待,而是必须返回消息循环(GetMessage / TranslateMessage / DispatchMessage)当它完成它的工作时。

解决这种明显冲突的一种方法如下:

  • 使用MsgWaitForMultipleObjects:这基本上是WaitFor ...的一个版本,如果事件被触发将被唤醒,如果有一条消息表明richedit需要处理 - 然后你使用它来处理GetMessage()等,完成后,返回MsgWaitFor ...并重新开始,等待事件或GUI消息。它允许线程既是GUI线程又是工作线程。

另一种方法(可能更多的工作,我认为上面的方法更可能更适合您现有的代码 - 但无论如何都提到这一点)如下:

  • 不要让工作线程通过使用WaitForSingleObject进入休眠状态,而是利用它是GUI线程的事实;它通过调用GetMessage()有效地结束睡眠,并且如果另一个线程向其发布消息,它将被唤醒。这将需要一个隐藏的窗口,线程拥有,您可以发布消息。 (您也可以使用PostThreadMessage来避免创建隐藏窗口,但它有一些棘手的问题,如果线程显示消息框或对话框,消息可能会“丢失”,因此隐藏窗口是最安全的的方法。)
相关问题