单独线程中的 MFC 表单

Posted

技术标签:

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

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

CfbSrvApp::CfbSrvApp()

AfxBeginThread(MTServerThread,0);

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

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

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

【问题讨论】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

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

以上是关于单独线程中的 MFC 表单的主要内容,如果未能解决你的问题,请参考以下文章

在单独的线程中运行 Tkinter 表单

从单独的线程在表单上绘制图像

在 mfc 中打开另一个表单

接收 MFC 对话框的 PostMessage 消息

是否有可能/有必要在单独的线程中调用 OnDraw [MFC]

使用来自单独表单 Access 2007 的用户输入自动填充表单中的字段