В моей программе я открываю окно и запускаю большой цикл. Я отображаю прогресс в QTextEdit
. Я добавил кнопку отмены, чтобы остановить большой цикл.
Итак, в конструкторе окна я запускаю метод, который выглядит так:
void start()
{
for (size_t i=0, i<10000000; ++i)
{
// do some computing
QApplication::processEvents(); // Else clicking the stop button has no effect until the end of the loop
if (m_stop) break; // member m_stop set to false at start.
}
}
Итак, когда я нажимаю кнопку остановки, он запускает слот
void stopLoop()
{
m_stop = true;
}
Проблема с этим методом заключается в том, что processEvents()
слишком сильно замедляет время выполнения.. Но, возможно, это неизбежно..
Я хотел попробовать это с сигналами и слотами, но я не могу придумать, как я мог бы соединить нажатую кнопку остановки с петлей.
Или, сигналы и слоты или нет, может быть, у кого-то есть лучший способ добиться этого?
ИЗМЕНИТЬ
Следуя этому совету, у меня теперь есть сценарий worker/thread. Итак, у меня есть конструктор окна
Worker *worker;
QThread *thread ;
worker->moveToThread(thread);
connect(thread, SIGNAL(started()), worker, SLOT(work()));
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
Который, кажется, работает нормально. Но как я мог представить QTimer
сейчас?
Должен ли я подключить QTimer
к функции start()
потока
connect(timer, &QTimer::timeout, thread, &QThread::start);
Или мне следует подключить поток к функции start()
QTimer
?
connect(thread, SIGNAL(started()), timer, &QTimer::start());
Или ни то ни другое... но тогда как?