c ++多线程对象超出范围

时间:2015-04-21 14:00:31

标签: c++ multithreading

我从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
}

现在我想到的一些可能的解决方案是:

  • 制作'CDataProcess obj;' UI类的成员,因此它不会超出范围。但我故意在当地保留它。
  • 在UI类button_event()中使用WaitForSignleObject等待工作线程完成信号或在worker类中写入等待函数。

还有什么可能是正确的解决方案?

3 个答案:

答案 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)环境中。您可以使用任何"任务池"技巧(再一次,取决于你想要实现的目标)。连接点,线程池 - 您可以为其命名。如何检测任务何时完成?如何向用户展示?你会允许用户取消任务吗?等等。