【发布时间】:2009-11-13 06:40:18
【问题描述】:
我想为一些不应该阻塞用户界面的数据库写入创建一个线程,以防数据库不存在。为了与主线程同步,我想使用 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。
其他同步构造不时阻塞其中一个线程(临界区、信号量、互斥锁)。至于评论中提到的事件 - 我不知道。
【问题讨论】:
-
我很好奇,为什么要使用windows消息而不是线程同步对象(如事件)?
-
通过
PostThreadMesssage和GetMessage使用windows消息相对容易,因为你可以传递一些参数。
标签: multithreading winapi