gpt4 book ai didi

multithreading - "window procedure"新建线程无窗口

转载 作者:行者123 更新时间:2023-12-03 12:47:05 24 4
gpt4 key购买 nike

我想为一些数据库写入创建一个线程,在数据库不存在的情况下不应阻塞用户界面。为了与主线程同步,我想使用 Windows 消息。主线程将要写入的数据发送给写线程。

发送没有问题,因为 CreateThread 返回新创建线程的句柄。我考虑过创建一个标准的 Windows 事件循环来处理消息。但是,如何在没有窗口的情况下将窗口过程作为 DispatchMessage 的目标?

标准 Windows 事件循环(来自 MSDN):

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

为什么是 Windows 消息?因为它们速度快(Windows 依赖于它们)并且线程安全。这种情况也很特殊,因为第二个线程不需要读取任何数据。它只需要接收数据,将其写入数据库,然后等待下一个数据到达。但这正是标准事件循环所做的。 GetMessage等待数据,然后处理数据,一切重新开始。甚至还有一个很好理解的用于终止线程的定义信号 - WM_QUIT。

其他同步构造时不时地阻塞其中一个线程(临界区、信号量、互斥量)。至于评论中提到的事件 - 我不知道。

最佳答案

这似乎违反常识,但对于没有窗口的消息,实际上用你的窗口过程创建一个隐藏窗口比手动过滤 GetMessage() 的结果更好在消息泵中。

您拥有 HWND 的事实意味着只要正确的线程有消息泵在运行,消息就会被路由到某个地方。考虑到许多函数,甚至是内部 Win32 函数,都有自己的消息泵(例如 MessageBox())。并且 MessageBox() 的代码不会知道在它的 GetMessage() 之后调用您的自定义代码,除非有一个窗口句柄和窗口过程 DispatchMessage() 会知道。

通过创建一个隐藏窗口,您将被线程中运行的任何消息泵所覆盖,即使它不是您编写的。

编辑:但不要只相信我的话,请查看 Microsoft 的 Raymond Chen 的这些文章。

关于multithreading - "window procedure"新建线程无窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1727539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com