QT 线程从不运行

Posted

技术标签:

【中文标题】QT 线程从不运行【英文标题】:QT thread never runs 【发布时间】:2013-03-15 00:27:04 【问题描述】:

我正在尝试使用 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 语句)并且永远不会完成。我添加了睡眠来模拟每个循环在需要启动新线程之前完成每个循环所花费的时间。我希望上一个线程到那时已经完成。我试图让一个简单的版本正常工作,但无法弄清楚我错过了什么。我只想在离开 OnPlay() 函数时删除线程但多次执行线程直到我决定退出。

【问题讨论】:

你里面为什么有QApplication::exec(); 没有循环,因为 QApplication::exec();永远不会结束。 只是有人在我搜索的众多论坛之一上提出的建议,所以我想我会尝试一下。看起来这可能是问题所在。一段时间后我才开始尝试任何事情,这似乎是个问题。谢谢。 我错了,这不是问题所在。我仍然看到线程永远运行,但从未真正做任何事情或完成。我曾尝试显式调用 display->process() 并在删除 QApplication::exec(); 时忘记删除它;当我尝试使用 thread->start 时,我的线程仍然没用。只有显式调用进程似乎有效,但这并不是一个真正的新线程。 【参考方案1】:

我认为您在以下线程中遇到了与我相同的问题: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() 结束时成功了。

【讨论】:

以上是关于QT 线程从不运行的主要内容,如果未能解决你的问题,请参考以下文章

当主线程等待它运行时,Alamofire 从不调用 encodingCompletion 以使用 MultipartFormData 上传

高分求qt写的线程程序,功能每隔一百毫秒查询数据,这个线程在整个程序运行中都一直在运行

在 IntentService 和 AsyncTask (Android) 之间使用共享代码时,领域“从不正确的线程访问”错误

Qt例子,线程间通信,如何在线程外部对线程进行控制,问题请看问题补充,多谢了先

Qt - 在其他线程上运行函数

Qt - 如何在不显式实现线程的情况下同时运行两个插槽