【发布时间】:2015-12-03 12:22:17
【问题描述】:
对不起我的英语不好:(
我使用了一个继承自 QObject 的名为 SerialPort 的类:
serial_port.cpp & serial_port.h:
class SerialPort: public QObject{
Q_OBJECT
private:
bool checkStatusConnected();
private slots:
void readData();
}
bool SerialPort::checkStatusConnected(){
port.waitForReadyRead(200);
QBytesArray recv = port.readAll();
QString tmp = (QString)recv;
if(tmp.contains("Connected", Qt::CaseInsensitive))
return true;
return false;
}
MainWindow.cpp
void MainWindow::on_btnConn_clicked()
{
QThread* thread = new QThread(this);
serialport->moveToThread(thread);
serialport->connect();
}
在 SerialPort::connect() 中,我打开了端口并发送了连接命令。到现在一切正常。由于串口速度慢,我需要在下一步操作之前检查返回给我的字符串,所以在 SerialPort::connect() 中我调用 checkStatusConnected()。但是,在这个函数中,waitForReadyRead() 会冻结 GUI 线程,只要我设置的时间就会让我感到困惑。
GUI线程为什么会被另一个QThread阻塞以及如何解决这个问题?
谢谢!
【问题讨论】:
-
你的串口真的需要在单独的线程中运行吗?
-
@ramtheconqueror 如果连接,我使用信号/插槽来防止 GUI 被冻结,但是连接时我想等待大约 500 毫秒的响应,然后发送数据或抛出错误。观看时,我希望 gui 正常工作,而不是被冻结。我怎么能意识到这一点?
-
您确定线程亲和性更改正确吗?
serialport->thread()与this->thread()相比返回了什么?
标签: multithreading qt qthread