单独线程中的 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 表单的主要内容,如果未能解决你的问题,请参考以下文章