我有一些我一直在试验的粗略代码:
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 线程中按下停止按钮时,工作线程完全停止?
您当然可以在Worker::run()
每次迭代中检查的 for 循环中放置一个布尔值,该值在==true 时中断并由 gui 停止按钮设置。当然,这不会在执行被阻塞时退出线程。
可能更好的是摆脱for
循环并使用 Qt 的信号和槽来设置回调函数,连接到像QIODevice::readyRead()
. 仅当套接字/管道中有可用信息时才会调用这些。在其他任何时候,您都可以使用 退出线程QThread::exit()
。您还需要QThread::exec()
在某个时候调用以启动事件循环。