我从UI事件(单独的类)开始一个工作线程(写在一个新类中)。现在,当从主UI线程创建新的工作线程时,它立即从控件返回,这导致工作线程类对象被销毁。通过检查以下代码可以找到更好的解释。
//class - UI
void CUIClass::button_click()
{
CDataProcess obj;
obj.Start();
}
//class - DataProcess
CDataProcess::CDataProcess()
{
}
CDataProcess::~CDataProcess()
{
}
void CDataProcess::Start()
{
CWinThread *pThread = AfxBeginThread(DataProcessingThread, this);
}
UINT CDataProcess::DataProcessingThread()
{
//some processing
}
现在我想到的一些可能的解决方案是:
还有什么可能是正确的解决方案?
答案 0 :(得分:1)
好吧,如果您打算在每次点击按钮时打开一个线程(我认为您需要重新考虑),这里最适合使用线程池。
基本上,你想在一个函数(可能会调用其他函数和对象)中编写onClick逻辑,这将是onClick事件的回调函数。然后你要求你的线程池执行回调asynchrounosly。
您可能还想阅读有关std::async
启动函数asynchrounosly的信息,但请记住,如果您的线程很重,您可能还是想使用线程池。
答案 1 :(得分:0)
嗯,我想我为我制造了一些严重的麻烦。我应该坚持使用单独的类中的DataProcess功能,该类可以从UI类启动的线程中调用。这样它就解决了每一个问题。
答案 2 :(得分:-1)
这取决于你想要实现的目标。显然,您需要创建一个寿命超过button_click
回调的工作对象:
CDataProcess* obj = new CDataProcess();
obj->Start();
假设名称AfxBeginThread
,您在Windows(更具体,MFC)环境中。您可以使用任何"任务池"技巧(再一次,取决于你想要实现的目标)。连接点,线程池 - 您可以为其命名。如何检测任务何时完成?如何向用户展示?你会允许用户取消任务吗?等等。