Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Как “выключить” поток?

По моей задумке, я создаю вектор потоков, запускаю его на нажатие CheckBox-а, на отжатие CheckBox-а происходит завершение потока.
На деле при нажатии CheckBox-а он запускает отдельный поток, НО при отжатии CheckBox-а не отрабатывается завершение потока.
Что я делаю не так ??
Вот кусок кода где происходит данное действо:
void MainWindow::start_sending(bool Value) { NewsThread *two_cl = new NewsThread(); // инициализируем второй класс
if (test_checkbox_old == 0) { test_checkbox_old = test_checkbox.length(); qDebug() << "test_checkbox_old" < for(int i =0; i< test_checkbox.length();i++) { if (Value == true) { if(test_checkbox[i]->isChecked() == true) { if(togled_checked_sensor[i] == 0) { qDebug() << " светлая сторона " << i; togled_checked_sensor[i] = 1; connect(test_checkbox[i], SIGNAL(stateChanged(int, QString, int)), two_cl , SLOT(run_NEW(int, QString, int)));// от кого, "реакция", кому, "выполнение"
two_cl->moveToThread(vector_thread[i]); vector_thread[i]->start(); } } } // обратный метод очистки if(Value == false) { if(test_checkbox[i]->isChecked() == false) { if(togled_checked_sensor[i] == 1) { togled_checked_sensor[i] = 0; qDebug() << " темная сторона " << i; // vector_thread[i]->quit(); // чёт не работает vector_thread[i]->exit(); // чет тоже не работает } } } }
void MainWindow::seting_clear(int i) { for (int f =0 ; f } } void MainWindow::seting_clear(int i, int f) { f = f-i; for(int a =0; a } }
а вот где "работает" циклом поток
void NewsThread::run_NEW(int i, QString str, int f) {
// -- вот тут механизм гетеров сетеров Foo *FO = new Foo(); FO->setData(155);
for(;;){ // вечный цикл if( QThread::currentThread()->isInterruptionRequested() ) { for (int i=0; i<500; i++) { qDebug()<< "Число :" << i <<"номер \"потока\" :" << str ; qDebug()<< "Тут переменная котрая задаётся в маинвиндовс класе переходит в майчекбокс и возвращаеться сюда: " ; qDebug()<< "QThread::currentThreadId() : "<< QThread::currentThreadId(); qDebug()<< "Число переданное из майчекбокс :" << f <<" FO.getData: " << FO->getData() ; usleep(100); } } } }


Ответ

Пользователь @vegorov дал ответ.
Надо было отказаться от вечного цикла, и воспользоваться функцией requestInterruption()
Вот код который изменился (всё остальное осталось прежним)
// обратный метод очистки if(Value == false) { if(test_checkbox[i]->isChecked() == false) { if(togled_checked_sensor[i] == 1) { togled_checked_sensor[i] = 0; qDebug() << " темная сторона " << i; // vector_thread[i]->quit(); vector_thread[i]->requestInterruption(); // !!! НОВЫЙ ДОБАВЛЕННЫЙ КОД vector_thread[i]->exit(); } } }
А вот функция вызова
void NewsThread::run_NEW(int i, QString str, int f) {
// -- вот тут механизм гетеров сетеров Foo *FO = new Foo(); FO->setData(155); // Отказался от вечного цикла for(int i=0; i<500; i++) { qDebug()<< "Число :" << i <<"номер \"потока\" :" << str ; qDebug()<< "QThread::currentThreadId() : "<< QThread::currentThreadId(); qDebug()<< "Число переданное из майчекбокс :" << f <<" FO.getData: " << FO->getData() ; usleep(100);
if (i == 499) { if( QThread::currentThread()->isInterruptionRequested() == true ) // !!! НОВЫЙ ДОБАВЛЕННЫЙ КОД { qDebug() << " tyt"; return; } else i = 0; } } }

Комментариев нет:

Отправить комментарий