
在C++控制台程序中,使用for(;;)和while(TRUE)实现无限循环是非常常见的做法。这两种循环结构的主要区别在于使用break或return语句可以跳出循环。在某些情况下,我们可能会使用全局变量来实现线程间的交互,例如通过BOOL bStop变量来指示线程是否应该停止。主线程设置bStop为TRUE时,可以通知工作线程结束任务。
在进行线程间通信时,可以利用PeekMessage函数来检测消息队列是否为空。PeekMessage不会阻塞,最后一个参数传入PM_NOREMOVE,表示不从队列中移除消息,适用于检测消息队列。例如,当使用全局变量BOOL bStop表示线程是否停止时,主线程设置bStop为TRUE,可以通知工作线程停止运行。具体代码如下:
if (PeekMessage(&iMsg, NULL, 0, 0, PM_NOREMOVE)) {
if (!GetMessage(&iMsg, NULL, 0, 0)) return iMsg.wParam;
TranslateMessage(&iMsg);
DispatchMessage(&iMsg);
} else {
if (bStop) break; /* 结束 */
}
如果你正在开发一个多线程程序,通过Win32控制台程序编写,并使用socket进行端口监听,为了将程序最小化到托盘,采用了消息循环,但不确定如何将监听代码放入循环中,可以考虑增加一个专门用于监听的线程。然而,这并不是唯一的方法。为了实现窗口托盘化,可以将消息循环放在主线程,同时将端口监听放在另一个线程中。这样,主线程可以处理界面消息,而另一个线程可以专注于网络操作。
在使用消息循环时,关键在于能够响应用户操作,如最小化窗口。通常,GetMessage后会取出消息并保存在iMsg中,然后通过DispatchMessage(&iMsg)将消息传递给对应的窗口消息处理函数。在注册窗口类时定义的窗口消息处理函数中,可以处理最小化消息。最小化消息是由WM_SYSCOMMAND消息发送的,其中wParam等于SC_MINIMIZE时代表最小化操作。