我正在尝试创建一个 WIN32 (C++) 程序,在该程序中我必须同时处理消息并运行 while 循环。为了做到这一点,我想使用线程。
当我将消息循环移动到一个单独的过程(从函数 WinMain 调用)时,所有事情都工作正常。但是,当我使用下面的代码来线程化该过程时,而不是简单地从主进程中调用它,窗口变得无响应。
你知道为什么会这样吗?
在 WinMain 内部,创建主窗口后,我删除了消息循环和返回值,添加了以下代码:
std::thread t1(message_loop);
t1.join();
return return_val;
Run Code Online (Sandbox Code Playgroud)
return_val是一个全局变量,我将用它来接收消息循环结束时 WinMain 应返回的值。
另外,函数message_loop如下:
void message_loop()
{
MSG messages;
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
return_val = messages.wParam;
}
Run Code Online (Sandbox Code Playgroud) aSleep(sometime)在典型的无限窗口消息循环中是否有用,或者它只是无用甚至有害?
有些示例包含Sleep,但大多数示例不包含。
// Main message loop:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
Sleep(500); // As pointed out below, completely nonsense
Sleep(5); // Would have been the better example, but still bad
}
Run Code Online (Sandbox Code Playgroud) 我有一个winforms应用程序,它调用Application.DoEvents().现在,应用程序在调用此方法时会冻结(毫不奇怪).
但是,这只发生在某些机器上.公平地说,这可能是由于机器本身还是仍然是代码/ application.doevents()?在这种情况下,应该重构使用backgroundworker.
这会是机器/环境问题还是使用背景工作者的机会?
我正在使用一些蓝牙库,对于一些蓝牙回调,有必要使用 Windows 消息循环。但是根据我的要求,我需要创建一个没有任何 GUI 的普通 C++ 程序。是否可以在没有窗口的情况下创建消息循环?
main(){
Discovery disc;
disc.startDiscovery();
}
Discovery::startDiscovery(){
__hook(&CallBackFromLibrary::OnDiscoveryStarted, &obj, &Discovery::OnDiscoveryStarted);
__hook(&CallBackFromLibrary::OnDiscoveryComplete, &obj, &Discovery::OnDiscoveryComplete);
}
apiObject.discoverBluetoothDevices();
Run Code Online (Sandbox Code Playgroud)
在此示例代码中,我应该在调用 apiObject.discoverBluetoothDevices() 后接收作为 OnDiscoveryStarted 和 OnDiscoveryComplete 的回调。
由于他们使用消息循环进行回调,因此我只在 GUI 应用程序上获得了回调。如何使用消息循环接收回调,因为库文档说需要消息循环。