如何停止运行阻塞永久循环的 QThread?

Cod*_*ict 5 c++ linux qt

我有一些我一直在试验的粗略代码:

someserver.cpp(图形用户界面)

#include "server.h"
#include "ui_server.h"

Server::Server(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Server)
{
    ui->setupUi(this);
}

Server::~Server()
{
    delete ui;
}

void Server::onBtnStartClicked()
{
    QThread worker; 
    worker.start(); // Start worker thread that goes into an infinite loop with a blocking call
}

void Server::onBtnExitClicked()
{
    // How do I cleanly stop worker from running?
    QApplication::quit();
}
Run Code Online (Sandbox Code Playgroud)

worker.cpp

#include "worker.h"

Worker::Worker(QObject *parent) :
    QThread(parent)
{
}

void Worker::run()
{
    for (;;)
    {
        // a blocking IO call here like pipe, or msgrcv
        // process data received
    }
}
Run Code Online (Sandbox Code Playgroud)

由于工作线程在一个带有阻塞 IO 调用的永久循环中运行,我将如何构造它,以便在 GUI 线程中按下停止按钮时,工作线程完全停止?

Mat*_*ips 5

您当然可以在Worker::run()每次迭代中检查的 for 循环中放置一个布尔值,该值在==true 时中断并由 gui 停止按钮设置。当然,这不会在执行被阻塞时退出线程。

可能更好的是摆脱for循环并使用 Qt 的信号和槽来设置回调函数,连接到像QIODevice::readyRead(). 仅当套接字/管道中有可用信息时才会调用这些。在其他任何时候,您都可以使用 退出线程QThread::exit()。您还需要QThread::exec()在某个时候调用以启动事件循环。