我正在尝试使用Qthread,但似乎无法弄清楚线程实际执行的时间。我只能在创建线程的函数退出时看到它的执行,但我不希望我的当前函数在单次执行后退出。我想在这个函数的循环中多次运行该线程。
/////////////////////////////////////////////// ///////////////////////
// --- PROCESS ---
// Start processing data.
void GrayDisplay::process()
{
std::cout << "Thread context!" << std::endl; //I never see this print
emit finished();
}
void gig::OnPlay()
{
//Create thread and assign selected
QThread* thread = new QThread;
if(ui->colorBox->currentIndex() == 0 )
{
GrayDisplay* display = new GrayDisplay();
display->moveToThread(thread);
connect(display, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
connect(thread, SIGNAL(started()), display, SLOT(process()));
connect(display, SIGNAL(finished()), thread, SLOT(quit()));
connect(display, SIGNAL(finished()), display, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
std::cout << "Creating Thread!" << std::endl;
}
else
{
cout << "\nInvalid mode selected";
return;
}
pSemaphore->acquire();
run = true;
pSemaphore->release();
//Read data
while(run) //set false by click event
{
QCoreApplication::processEvents();
Sleep(33);
if (thread->isRunning()) //Always prints and I expect just the first loop iteration to print, not infinitely as it does
cout << "Worker is-STILL-Running\n";
thread->start();
QApplication::exec();
QCoreApplication::processEvents();
// while (!thread->isFinished())
// {
// QApplication::exec();
// QCoreApplication::processEvents();
// } //Never returns
} //WHILE RUN LOOP
return;
}
我在这里看过类似的线程,但解决方案似乎总是: QCoreApplication :: processEvents(); 这似乎对我没有帮助。如果我创建并启动线程,它似乎总是在运行但从不做任何事情(从不看我的print语句)并且永远不会完成。我添加了sleep来模拟每个循环在需要启动新线程之前完成每个循环所需的时间。我希望之前的线程已经完成了。我试图让一个简单的版本正常工作,但无法弄清楚我错过了什么。我只想在离开OnPlay()函数时删除该线程,但多次执行该线程,直到我决定退出。
答案 0 :(得分:0)
我认为您在以下主题中遇到与我相同的问题:Why do my threads not exit gracefully?。
问题是你的线程的事件循环只有在 process()返回后才会建立。这意味着将删除在此时间之前发送到您的线程的所有退出事件。
qeventloop.cpp:
// remove posted quit events when entering a new event loop
QCoreApplication *app = QCoreApplication::instance();
if (app && app->thread() == thread())
QCoreApplication::removePostedEvents(app, QEvent::Quit);
在我的情况下,一个简单的
QThread::currentThread()->quit();
在process()结束时完成了这个伎俩。