在Qt中,線程間可以通過信號和槽機制來交互數據。
在一個線程內定義一個信號,并通過signals
關鍵字進行聲明。
在另一個線程內定義一個槽函數,并通過slots
關鍵字進行聲明。
使用connect
函數將信號和槽函數連接起來。
當信號被觸發時,槽函數將會被自動調用。
下面是一個簡單的示例代碼,展示了線程間使用信號和槽機制交互數據的過程:
// 在一個線程內定義一個信號
class Sender : public QObject
{
Q_OBJECT
signals:
void dataReady(int data);
};
// 在另一個線程內定義一個槽函數
class Receiver : public QObject
{
Q_OBJECT
public slots:
void processData(int data)
{
// 處理數據
qDebug() << "Received data:" << data;
}
};
int main(int argc, char *argv[])
{
// 創建線程
QThread thread;
// 創建發送者和接收者實例
Sender sender;
Receiver receiver;
// 將發送者移到線程中
sender.moveToThread(&thread);
// 連接信號和槽函數
QObject::connect(&sender, &Sender::dataReady, &receiver, &Receiver::processData);
// 啟動線程
thread.start();
// 在發送者線程中觸發信號
emit sender.dataReady(42);
// 結束線程
thread.quit();
thread.wait();
return 0;
}
QThread
類的派生類:創建一個繼承自QThread
的子類,并重寫其run
函數。
在run
函數中實現線程的邏輯。
在主線程中創建子線程的實例并啟動線程。
在主線程中可以使用QThread::wait
函數等待子線程的結束。
在子線程中可以使用QThread::msleep
函數實現線程的休眠。
下面是一個使用QThread
類的示例代碼:
// 繼承自QThread的子類
class MyThread : public QThread
{
Q_OBJECT
public:
void run() override
{
// 在子線程中執行的邏輯
qDebug() << "Child thread started";
msleep(1000); // 休眠1秒
qDebug() << "Child thread finished";
}
};
int main(int argc, char *argv[])
{
// 創建子線程的實例
MyThread thread;
// 啟動子線程
thread.start();
// 等待子線程結束
thread.wait();
return 0;
}
以上是兩種常用的線程間交互數據的方法,你可以根據實際需求選擇適合的方法來實現線程間的數據交互。