用父窗口在对象中启动一个线程

我有一些旧的MFC代码的对象inheritanceCDialog

class MYCLASS : public CDialog 

与标准的构造函数

 MYCLASS (CWnd* pParent = NULL); 

这个类的每个实例都是从主窗口初始化的,Overridden Create函数创build一个无模式的对话框

 BOOL MYCLASS ::Create(CWnd* pParentWnd,long iPort) { // create the dialogue that I required ! CDialog::Create(MYCLASS ::IDD, pParentWnd); // other stuff.... } 

然后实现它自己的WindowProc。

 LRESULT MYCLASS ::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // check for our timer event ! switch (message) { case WM_TIMER : switch (wParam) { case timerPROCESSCOMMS : ProcessCommunications(); break; } break; } } 

这个类处理各种自定义的TCPIP通信和ProcessCommunications已经变得更大,所以我想使用一个新的线程,但因为这个线程是主窗口的孩子,我不确定如何最好地启动一个新的线程这个情况。

据我所知,windowsproc必须在调用CreateWindow函数的同一线程中实现。 现在我猜CDialog::Create()必须调用CreateWindow()沿线的某处,所以我应该在构造函数中启动一个线程?

我以前使用的线程只有一个Run()函数,当我需要一个任务或计算,或者只是运行并退出时,我已经循环了,但是我不知道如何处理线程需要的情况不退出,但与Windows消息链接。

你将会遇到事件循环的问题。 你的课是一个CDialog和主窗口的孩子。 因此,它处理在主线程事件循环中传递的UI事件。 所以MYCLASS::WindowProc总是在主线程的上下文中被调用。

你没有给出足够的细节来提供一个精确的建议,但是我认为你处在一个经典的用例中,主线程专门处理UI事件(确保响应式UI)和工作线程,用于后台计算。 恕我直言,你必须实现UI对象和TCPIP线程之间的通信机制。 但是setter方法的一些同步往往就足够了。

如果您将ProcessCommunications设置为静态函数,则可以将其作为工作线程执行,如下所示:

 AfxBeginThread(ProcessCommunications, this);