我有 C++ 库(Win32 控制台),我在其中使用计时器实现了异步函数。异步方法返回设备信息。
我创建了一个单独的线程“Timer Thread”来创建一个隐藏窗口,然后调用 SetTimer()
,然后调用实现的消息循环。
当计时器到期时,它会启用回调。
当我在控制台应用程序中使用该库时,它工作正常。
在 MFC 中应用程序我正在做一个发布消息来在回调触发时更新用户界面。发布消息无效。
如果我删除库中的消息循环,它在 MFC 应用程序中工作正常。
我得出的结论是:
我猜问题出在两个消息循环上,一个是MFC(主线程),一个是TimerThread消息循环。所以当回调被调用和后续的PostMessage
结果在TimerThread消息循环中并没有在MFC(主线程)消息循环中报告。
如果我删除 TimerThread 消息循环,那么它在 MFC 应用程序中工作正常,但在控制台应用程序中无法工作。
我该如何克服这个问题?
class IDeviceEnumerationCallback
{
public:
virtual void onDeviceDiscovered(DeviceInfo* pDeviceInfo,unsigned short nNoOfDevice) = 0;
};
class IDeviceDiscovery
{
public:
virtual int InitialiseDiscovery(IDeviceEnumerationCallback*) = 0;
virtual void UnInitialiseDiscovery() = 0;
virtual int EnumerateDevice() = 0;
};
class CDeviceDiscovery:IDeviceDiscovery
{
//Implementation
}
在 MFC/控制台应用程序中,我正在实现 IDeviceEnumerationCallback
以获取回调。
我正在使用 Bonjour API 来枚举设备,Bonjour API 中的所有方法都是回调。
我正在等待一段时间以使用 Bonjour API 枚举设备,然后说在 400 毫秒后我正在调用回调以返回结果。在调用回调时的 MFC 应用程序中,我正在执行 PostMessage()
来更新用户界面。
之前我尝试过不使用 Windows 消息泵。我有一个 SetTimer
函数,它与 MFC 应用程序一起工作,但对于控制台应用程序,永远不会调用回调,所以我在这里实现了一个消息泵。现在它不适用于 MFC 应用程序。
最佳答案
首先,没有理由做你所做的事情:创建一个单独的线程,然后在其中创建一个窗口,设置窗口计时器,运行消息循环,响应 WM_TIMER
消息并调用回调。
如果您创建“您自己的”线程 - 您实际上并不需要所有这些。您可以使用 Sleep
(如果您想要中止选项,则可以使用 WaitForXXXX
)实现一个简单的循环,然后调用您的回调。
通常会创建一个带有计时器的隐藏窗口,以避免创建一个额外的线程。也就是说,在操作 GUI 的线程中(因此运行消息循环),您创建了一个窗口,它将由消息循环提供服务。实际上,这是您可以在 MFC 应用程序中执行的操作。
但是,正如您所说,您需要 MFC 和控制台应用程序的通用代码。
In MFC application I am doing post message to update UI when the callback triggers.the post message is Not wokring.
“diung post message”到底是什么意思?该消息应发布到特定窗口或线程。在第一种情况下,它被分派(dispatch)到窗口过程,在第二种情况下,消息循环实现负责处理消息。
如果您将消息发布到特定窗口 - 如何获得它的句柄 (HWND
)?它是您应用程序的主窗口 (AfxGetMainWnd
) 吗?您的线程是在 MFC 创建主窗口之后还是更早开始工作的?
我问所有这些问题是因为你似乎是一个新手(没有冒犯),而且这些都是典型的错误。
关于c++ - 使用 Windows 消息循环实现回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8656946/