在窗口构造函数中,我创建了一个 Runnable 对象:
testTask = new TestTask();
testTask->setAutoDelete(true);
connect(testTask, &TestTask::endTest, this, &MainWindow::endTest);
在按钮单击我运行:
void MainWindow::runTest()
{
// Если тест не запущен, то запускаем.
if (!testRunning)
{
bool startedTest = QThreadPool::globalInstance()->tryStart(testTask);
if (!startedTest)
{
syslog("Тест не был запущен, нет свободных потоков", E);
}
else
{
testRunning = true; // помечаем, что тест уже запущен
syslog("Тест запущен", I);
}
}
else
{
syslog("Тест уже выполняется, ожидайте", E);
}
}
接收到测试完成信号时:
void MainWindow::endTest()
{
QThreadPool::globalInstance()->waitForDone(); // нужно ли?
testRunning = false; // помечаем, что тест уже окончен
syslog("Тест окончен", I);
}
任务代码:
void TestTask::run()
{
qDebug() << "Hello world from thread" << QThread::currentThread();
// имитация работы процесса
QThread::sleep (5);
emit endTest();
}
结果:
"Тест запущен"
Hello world from thread QThread(0x274c4338, name = "Thread (pooled)")
"Тест окончен"
再次按下按钮后,在第一次测试结束后,我得到
"Тест запущен"
pure virtual method called
并且程序崩溃了。如果我将 Runnable 对象的创建放在按钮单击槽中,那么一切正常。那些。每次单击按钮时,都会创建一个新对象,并在其上运行 run。但是文档说 tryStart 可以在同一个 Runnable 上多次调用。
好吧,你自己指出
testTask->setAutoDelete(true);
,任务完成后,QThreadPool
就被删除了,等你再次尝试开始执行的时候,testTask
- 已被删除并指向垃圾箱。有两个出口:
testTask->setAutoDelete(false);
,但不要忘记在析构函数中自己删除它。当你点击一个按钮时,每次创建一个新的
TestTask
PS 我没有在文档中找到
tryStart
可以多次调用它的指示。