我在我的QT程序中使用多線程。我需要將數據傳遞給來自主gui線程的工作線程中的worker對象。我在QObject子類中創建了一個setData函數來傳遞主要gui線程中的所有必要數據。但是我通過查看setData函數中的QThread :: currentThreadId()來驗證函數是從主線程調用的。即使worker對象函數是從主線程調用的,這是否確保工作線程仍然擁有自己的數據副本(這是重入類所需的)?請記住,這是在工作線程啓動之前發生的。QT多線程數據從主線程傳遞給工作線程
此外,如果在沒有動態內存的類中使用基本數據類型,並且只要其所有其他成員數據都是可重入的,那麼沒有靜態全局變量就是該類可重入的? (它有折返數據成員一樣將QString,qlists等加上基本整數布爾變量等)
感謝您的幫助
編輯新的內容:
我的主要問題是根本適合從主gui線程中調用另一個線程中的QObject子類方法,以便將我的數據傳遞給工作線程以進行工作(在我的情況下,包含備份作業信息的自定義類用於長待處理文件掃描和數據備份)。數據傳遞全部發生在線程啓動之前,所以兩個線程都沒有同時修改數據的危險(我認爲但我不是多線程專家......)聽起來好像從你的文章中這樣做的方式是使用從主線程到工作線程中的插槽傳遞數據的信號。我已經確認我的數據備份作業是可重入的,所以我需要做的就是確保工作線程在它們自己的這些類的實例上工作。此外,通過調用QObject子類方法完成的數據傳輸在工作線程啓動之前完成 - 是否可以防止競爭條件並且安全嗎?
此外,根據「訪問其他線程的QObject的子類」一節here它看起來有點危險在QObject的子類使用插槽...
確定這裏是我最近忙的代碼... 編輯隨着代碼:
void Replicator::advancedAllBackup()
{
updateStatus("<font color = \"green\">Starting All Advanced Backups</font>");
startBackup();
worker = new Worker;
worker->moveToThread(workerThread);
setupWorker(normal);
QList<BackupJob> jobList;
for (int backupCount = 0; backupCount < advancedJobs.size(); backupCount++)
jobList << advancedJobs[backupCount];
worker->setData(jobList);
workerThread->start();
}
的STARTBACKUP功能設置一些布爾和更新GUI。設置工作程序函數連接工作線程和工作對象的所有信號和插槽。 setData函數將工作器作業列表數據設置爲後端數據,並在線程啓動之前調用,因此沒有併發性。 然後我們開始線程並完成它的工作。
而這裏的工人代碼:
void setData(QList<BackupJob> jobs) { this->jobs = jobs; }
所以我的問題是:這是安全的?
「通過調用QObject子類方法完成的數據傳輸是在工作線程啓動之前完成的 - 這是否會阻止競爭條件並且安全?」這裏的'QObject'沒有關係。重要的是,如果實施你的方法,實際上你的整個班級都是安全的。您如何期望我們能夠決定在沒有您提供任何代碼供我們談論的情況下? –
「在QObject子類中使用插槽看起來有點危險......「這是一個無用的觀察(你實際上不能使用它),一個特定的方法,無論是否是槽,都是線程安全的或不是線程安全的,如果它不是線程安全的,那麼它只能從你應該聲明它是這樣調用的:在這些方法的開頭添加'Q_ASSERT(QThead :: currentThread()== thread());'可以從任何線程調用線程安全的方法。一個線程不安全的方法安全地調用發送一個信號並將該方法連接到它 –