c++ - 使用 Windows 消息循环实现回调

标签 c++ winapi mfc callback

我有 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/

相关文章:

c++ - 当可插入的 Cocoa 应用程序仅公开 C++ API 时,如何在插件中显示一个窗口?

c++ - 多显示器环境中的鼠标环绕

c++ - vector +for+if

winapi - 我们如何检测其他应用程序注册的热键?

c++ - 将用户定义的文字与方法调用相结合

winapi - WaitForSingleObjectEx 是否允许提前唤醒?

c# - 在 C++ dll 中使用 COM 对象

c++ - C WinAPI 和 C++ MFC 资源

c++ - 一个通过 occi 连接 oracle db 的 MFC 应用程序。但它在 64 位机器上运行时给出错误 0xC000007b?

mfc - 在 MFC (VS2005) 中显示非模态子对话框的正确方法是什么?