标签: message-loop

为什么 win32 消息循环在线程化时停止工作?

我正在尝试创建一个 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)

c++ windows winapi multithreading message-loop

3
推荐指数
1
解决办法
1514
查看次数

Windows消息循环中的Sleep()?

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)

c++ winapi sleep message-loop

1
推荐指数
1
解决办法
2824
查看次数

Application.DoEvents()并在某台机器上冻结

我有一个winforms应用程序,它调用Application.DoEvents().现在,应用程序在调用此方法时会冻结(毫不奇怪).

但是,这只发生在某些机器上.公平地说,这可能是由于机器本身还是仍然是代码/ application.doevents()?在这种情况下,应该重构使用backgroundworker.

这会是机器/环境问题还是使用背景工作者的机会?

.net c# backgroundworker doevents message-loop

1
推荐指数
1
解决办法
1831
查看次数

是否可以在 C++ 中不创建窗口的情况下创建消息循环

我正在使用一些蓝牙库,对于一些蓝牙回调,有必要使用 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 应用程序上获得了回调。如何使用消息循环接收回调,因为库文档说需要消息循环。

c++ windows-messages message-loop visual-c++

1
推荐指数
1
解决办法
2267
查看次数