【发布时间】:2016-02-02 23:57:41
【问题描述】:
我正在开发 Qt 5.5,并创建了一个使用 3rd 方库 API 的单独线程。这个 Api 函数在执行时会消耗所有资源,并且不允许任何其他函数在该线程中执行。
这个新线程以单击“开始”按钮开始,当我按下停止按钮时,我只是不知道如何停止或终止线程。下面是我的示例
threadWorking = new QThread();
workHeavy = new WorkingHard;
workHeavy->moveToThread( threadWorking );
connect( threadWorking, SIGNAL( started() ), workHeavy, SLOT( slotStartStream() ) );
connect( workHeavy, SIGNAL( sigStopStream() ), threadWorking, SLOT( quit() ) );
connect( workHeavy, SIGNAL( sigStopStream() ), workHeavy, SLOT(deleteLater() ) );
connect( threadWorking, SIGNAL( finished() ), threadWorking, SLOT(deleteLater() ) );
connect( workHeavy, SIGNAL( sigStartStream() ), this, SLOT( slotTrueStreamRun() ) );
connect( workHeavy, SIGNAL( sigStopStream() ), this, SLOT( slotFalseStreamRun() ) );
connect( this, SIGNAL( sigMopsCamStopCmd() ), workHeavy, SLOT(slotStopStream() ) );
threadWorking->start();
Also// void WorkingHard::slotStartStream()
{
g_main_loop_run( gloop ); // this consumes all resources.
}
void WorkingHard::slotStopStream()
{
// clean up mess
g_main_loop_quit( gloop );
gst_element_set_state (pipeline, GST_STATE_NULL);
// g_main_loop_quit( gloop );
releaseMemory();
}
请建议我根据 id 或其他内容杀死线程。有一点很清楚,当函数运行时我不能进入线程。
正如人们建议使用终止。如果我使用 terminate() 是否还需要像我在函数 slotStopStream 中指出的那样释放内存??
【问题讨论】:
-
您的示例远非完整和最小,如要求。也就是说,研究术语“线程取消”以及为什么会有问题。使用不同的流程可能是一种替代方法。
-
你应该展示你的
WorkingHard工作循环。这就是你应该放置线程终止检测的地方,但是如果不知道你在那里有什么样的代码,就很难给出建议。 -
正如人们建议的终止。如果我使用 terminate() 是否还需要像我在函数 slotStopStream 中指出的那样释放内存??
-
当然,如果你可以通过释放资源让它更干净,你应该这样做。
-
@samprat Thread terminate 在那里结束线程,然后可能使数据结构处于无效状态。如果您确实没有其他方法可以告诉线程以可接受的延迟停止,请仅将其用作最后的手段。
标签: multithreading qt qthread