gpt4 book ai didi

c++ - 如何终止长时间运行的 Qt 线程

转载 作者:太空狗 更新时间:2023-10-29 23:08:32 25 4
gpt4 key购买 nike

我有一个线程应用程序,其中主线程是 gui 线程,辅助线程是在嵌套 for 循环中进行主要计算的线程。现在的问题是如何终止辅助线程。当我按下 GUI 线程上的停止按钮时,它会调用辅助线程中的一个插槽,将停止变量设置为 true。这种技术的问题在于,在 for 循环(如下所示)中测试停止变量是不够的。因为如果在线程进入第三个 for 循环后立即按下停止按钮,它将在检查停止标志之前执行所有冗长的函数。这就是为什么我们需要在执行其内容之前在每个函数中对其进行测试,我认为这不是一个非常优雅的解决方案。我无法在此线程上调用终止,因为此线程分配了相当数量的内存,调用终止将导致内存泄漏。

那么对于这种情况,终止线程和任何点的最佳方法是什么?

以下代码框架只是为了让您了解我/正在谈论的内容

void run( ) {

for(int i = 0; i < 4 && !stop; i++) {
for(int j = 0; j < 3 && !stop; j++) {
for(int k; k < 6 && !stop; k++) {
callA( );
callB( );
callC( );
callD( );
callE( );
callF( );
callF( );
callG( );
}
}
}
}

callA( ) { callL( ); }

callB( ) { callM( ); }

callC( ) { callN( ); }

callD( ) { callO( ); }

callE( ) { callP( ); }

callF( ) { callQ( ); }

callF( ) { callR( ); }

callG( ) { callS( ); }

callL( ) { sleep(20); }

callM( ) { sleep(60); }

callN( ) { QProcess( ); }

callO( ) { sleep(30);}

callP( ) { QProcess( ); }

callQ( ) { }

callR( ) { sleep(60); }

callS( ) { QProcess( ); }

最佳答案

您可以在工作循环中调用 QApplication::processEvents() 以允许线程接收事件。例如,一个事件可以是您的主线程调用一个插槽来设置您检查是否应该中断您的工作的变量。

//main thread calls this slot
void interupt_slot()
{
stop_was_called = true;
}

void do_work()
{
for(;;)
{
QApplication::processEvents();
if(stop_was_called)
break;

//Work
}

//Exectution is over and the thread can be stopped etc
emit its_over();

编辑:

它不会中断线程的休眠。如果主线程在线程休眠时调用 interupt_slot() 插槽,则在 sleep(n) 结束时将调用该插槽。但是你也可以通过在定时器调用的槽中完成工作来假装 sleep 。

关于c++ - 如何终止长时间运行的 Qt 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9169193/

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