gpt4 book ai didi

c++ - 使用父窗口在对象中启动线程

转载 作者:可可西里 更新时间:2023-11-01 10:21:49 26 4
gpt4 key购买 nike

我有一些旧的 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 消息。

最佳答案

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

您没有提供足够的详细信息以获得准确的建议,但我认为您处于经典用例中,主线程专用于处理 UI 事件(确保响应式 UI)和工作线程用于后台计算。恕我直言,您必须在 UI 对象和 TCPIP 线程之间实现一种通信机制。但是在 setter 方法上进行一些同步通常就足够了。

关于c++ - 使用父窗口在对象中启动线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26902146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com