【发布时间】:2012-10-04 02:58:25
【问题描述】:
我有一个 Windows 应用程序需要非常快速地处理所有传入的消息,否则我想它会严重削弱系统性能。我想到的是一种为每条消息生成和加入线程的方法,以便按顺序处理它们。但是这种方法有一个严重的问题:当我产生线程并尝试加入顶级线程时,我怎么知道它是否可用于加入?当然,我可以检查它是否可连接(我使用 std::thread),但是当我这样做时,它可能会变得不可连接并且线程不是互斥锁 - 我不能只是阻止它并再次检查。所以我需要的是某种非阻塞的延迟任务池或任务查询,至少对于消息线程。同样,我可以生成等待该查询的线程并添加任务以便对其进行处理,但这真的是很好的解决方案吗?
这不一定是开箱即用的东西,我可以实现任何并发模式。
inb4: Windows、WinAPI、C++11、std::thread 用于线程。 对不起我的英语,真的找不到时间改进它。
感谢您的回答,看来我在问题描述方面做错了。确切地说,我只需要让 WNDPROC 尽快返回它的结果,因此可以从消息队列中弹出下一条消息。我需要这个,因为我记录了发送消息的时间,所以我需要快速完成它,这样它就不会影响时间测量。此外,这些消息对系统来说很紧急,我的窗口需要快速处理它们,否则会以某种方式影响性能。
再次:我需要以某种方式将确切的消息处理移动到其他线程,现在它看起来像这样:
case WM_INPUT:
int timestamp = PushTimeStampToAsyncTimestampQueue();
launchLongChainOfMessageProcessing(message,timestamp);
return 0;
我需要摆脱那个 launchLongChainOfMessageProcessing 并用类似的东西替换它
case WM_INPUT:
int timestamp = PushTimeStampToAsyncTimestampQueue();
std::thread processThread([]() { do_work(message, timestamp);});
return 0;
【问题讨论】:
-
您只能通过处理消息的速度慢来使您的应用程序陷入困境。请注意,消息循环和 MOST 消息几乎可以立即处理。如果您有任何需要一段时间(1 秒以上)的内容,您可以将其移至另一个线程。
-
更新后的问题:所以您想捏造结果以提供更好的明显性能?
标签: c++ winapi design-patterns concurrency c++11