У меня есть потоковое приложение, в котором основной поток является потоком графического интерфейса, а вторичный поток выполняет основные вычисления внутри вложенных циклов. Теперь проблема заключается в том, как прекратить вторичный поток. Когда я нажимаю кнопку остановки в потоке GUI, он вызывает слот во вторичном потоке, который устанавливает переменную остановки в значение true. Проблема с этой техникой заключается в том, что тестирование переменной stop в циклах 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( ); }