Kri*_* CN 1 c++ windows-messages message-loop visual-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 应用程序上获得了回调。如何使用消息循环接收回调,因为库文档说需要消息循环。
是的,这是可能的——当/如果线程尝试使用一个线程时,Windows 会将一个消息队列与一个线程相关联。不过,这样做时会有一点竞争条件。要发布到线程的消息队列,请使用PostThreadMessage. 但是,线程在调用函数尝试从消息队列中读取之前不会有消息队列(即,在线程尝试使用消息队列之前,Windows 不会为该线程创建消息队列)。
为了防止竞争条件,您通常希望按以下顺序执行某些操作:
CreateThread,将要传递给新线程的事件句柄传递给它PeekMessage(不期望任何结果,因为尚未创建队列 - 但这会强制其创建)。PostThreadMessage在子级具有消息队列的“知识”中使用安全,因此这将起作用。另一种可能性是让孩子创建一个窗口,但将其隐藏。这里的明显优势是与期望使用SendMessage、PostMessage、SendMessageTimeout等而不是特殊的PostThreadMessage. 另一个明显的优点是它避免了上面概述的线程消息队列舞蹈。
当您深入了解它时,Windows“窗口”的主要特征不是显示器上的某些东西——它是一个消息队列,显示器上显示的只是响应某些特定消息而完成的绘图。隐藏窗口只不过是一个消息队列。
| 归档时间: |
|
| 查看次数: |
2267 次 |
| 最近记录: |