Qt 從 2.2 版本提供跨平台多線程支持,三大支柱:
QThread 等)。postEvent)。QMutex、QWaitCondition、QSemaphore)。某些場景下,定時器機制可替代多線程,避免線程安全問題。
-mt,鏈接 qt-mt 庫。configure -thread,生成 libqt-mt,鏈接選項 -lqt-mt。QT_THREAD_SUPPORT(Windows 在 qconfig.h,Unix 在 Makefile)。QThread 並重寫 run() 實現線程邏輯(類似 Java Thread.run())。QThread::postEvent(receiver, event):從非主線程向對象投遞事件(線程安全),事件入隊後喚醒主線程分發,事件處理器在主線程執行。互斥鎖,保護臨界區:lock() / unlock(),支持 QMutexLocker RAII 風格。
條件變量,線程等待特定條件:wait(mutex, timeout)、wakeOne()、wakeAll()。
QCustomEvent,構造函數傳入 Type(User + 偏移) 避免衝突。QThread 子類)在 run() 中創建自定義事件,調用 postEvent(receiver, event)。QWidget 子類)重寫 customEvent(QCustomEvent*),根據 type() 分發處理。// 自定義事件
class UserEvent : public QCustomEvent {
public:
UserEvent(QString s) : QCustomEvent(346798), sz(s) {}
QString str() const { return sz; }
private:
QString sz;
};
// 工作線程
class UserThread : public QThread {
public:
UserThread(QObject* r, QMutex* m, QWaitCondition* c);
void run() override {
UserEvent* re = new UserEvent(resultString);
QThread::postEvent(receiver, re);
}
};
// 接收控件
void UserWidget::customEvent(QCustomEvent* e) {
if (e->type() == 346798) {
UserEvent* re = static_cast(e);
newString = re->str();
}
}
將並發事件串行化,簡化同步,適合「處理時間短、消息頻率低」場景。
QTimer,連接 timeout() 信號到槽函數 slotReadFile()。stop() 定時器 → 讀取設備文件(Socket/FIFO) → 分發消息 → start() 重啟定時器。Server::Server(QWidget* parent) : QWidget(parent) {
readTimer = new QTimer(this);
connect(readTimer, SIGNAL(timeout()), this, SLOT(slotReadFile()));
readTimer->start(100); // 100ms 周期
}
int Server::slotReadFile() {
readTimer->stop();
ret = read(file, buf);
if (ret <= 0) {
readTimer->start(100);
return -1;
}
// 根據 buf 分發消息給各處理對象...
readTimer->start(100);
return 0;
}