【问题标题】:MFC form in separate thread单独线程中的 MFC 表单
【发布时间】:2014-04-09 15:39:28
【问题描述】:

我有一个由一个表单组成的控制台 MFC 表单应用程序。在 MFC 应用程序构造器线程中启动任务:

CfbSrvApp::CfbSrvApp()
{
AfxBeginThread(MTServerThread,0);
}

MTServerThread 程序有时需要显示简单的文本输入或是/否形式。

如何在单独的MTServerThread 中创建 MFC 表单。

主表单有时可以最小化到托盘,但输入表单无论如何都应该出现在桌面上。

【问题讨论】:

    标签: c++ visual-studio-2010 visual-c++ mfc


    【解决方案1】:
    1. 从 CWinThread 派生一个类。
    2. 覆盖初始化实例
    3. 使用 DoModal 在那里创建对话框
    4. 使用 AfxBeginThread 和 RUNTIME_CLASS(CYourNewCWiNThreadClass) 创建新线程

    【讨论】:

      【解决方案2】:

      主表单有时可以最小化到托盘,但输入表单应该 无论如何都会出现在桌面上。

      对于您想要实现的目标,最好在主线程本身中创建无模式对话框。让后台服务器线程通过向主线程发送消息来更新无模式对话框的 UI。这样您可以最​​小化托盘中的主窗体,但仍显示无模式对话框。

      【讨论】:

      • 感谢您的回答!如何将消息从服​​务器线程发送到主窗体?
      • 创建无模式对话框并通过 void * data 参数将其句柄 (HWND) 提供给服务器线程。使用 PostMessage 或 SendMessage 将消息从服​​务器线程发送到无模式对话框。请注意您希望无模式对话框处理的数据。即使在 PostMessage 返回之后,数据也应该可供服务器线程使用,因为它只会发布并立即返回。
      • 我可以向 CWinThread 派生类对象发送消息,还是需要在 InitInstance 内部创建一些 CFrameWnd 并向其发送消息?
      • 我上面的建议是将消息发送到包含无模式对话框的主线程。如果您使用@xMRi 建议的方法,那么您将在您将向其发送消息的 CWinThread 派生类对象中创建无模式对话框。后一种方法更复杂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多