我有一些旧的MFC代码,其中一个对象继承了CDialog
class MYCLASS : public CDialog
使用标准构造函数
MYCLASS (CWnd* pParent = NULL);
此类的每个实例都是从主窗口初始化的,Overridden Create函数创建一个无模式对话框
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消息。
答案 0 :(得分:1)
您将遇到事件循环问题。你的班级是CDialog和主窗口的孩子。因此,它处理在主线程事件循环中传递的UI事件。所以MYCLASS::WindowProc
将始终在主线程的上下文中调用。
您没有提供足够的详细信息以获得精确的建议,但我认为您处于一个经典的用例中,主要线程专门用于处理UI事件(确保响应式UI)和后台计算的工作线程。恕我直言,您必须在UI对象和TCPIP线程之间实现通信机制。但是在setter方法上的一些同步通常就足够了。
答案 1 :(得分:1)
如果使ProcessCommunications成为静态函数,它可以作为工作线程执行,如下所示:
AfxBeginThread(ProcessCommunications, this);