簡體   English   中英

如何在Qt中的主線程和工作線程之間進行同步?

[英]How to synchronize between main and worker thread in Qt?

我有這個設計。 我無法實現我所需要的:

  • B 繼承自 A。
  • A 繼承自 QThread。

我的目標是在完成任務后重新啟動(重新運行)到“工作”線程。 我打算為此方法調用工作線程析構函數,因為它從堆中獲取內存。 我需要清理所有相關變量。

我怎樣才能做到這一點?

int main()
{
   // re-start start
    A* worker = B::getInstance();  
    worker->start();
   // re-start end

    return a.exec();
}

編寫 for 循環不是解決方案。 因為,我需要學習工作線程完全停止。 我嘗試使用 worker->wait()。 但它不起作用。

如何使用QThread的信號finished()

我不完全理解你的問題,但是如果你分配了線程並且你必須在它完成后重新啟動它,你可以執行以下操作:

去檢查:

  • 要么在工作線程完成后在工作線程中設置一個變量,然后讓主線程輪詢該變量以進行設置。 發生這種情況時,意味着線程已完成。
  • 或者,讓您的工作線程調用 postEvent() 以便將用戶定義的事件發布到事件隊列中。 然后這個事件將被主線程收集,並采取相應的行動。

重啟:

  • 要么完全扔掉工作線程對象並創建一個新的
  • 或者在調用的私有 cleanup() 方法中包含清理代碼:
    • 你運行線程(它做的第一件事)
    • 在析構函數中
    • 如果您想授予這種可能性,請將其公開並手動使用它(危險,如果在線程運行時調用)

RAII(Resource Acquisition Is Initialization)中的一般規則是,獲取資源的代碼負責確保它被釋放。 因此,您的工作線程應該在釋放它獲得的所有資源后終止。

主程序的一般風格將是:

  • 初始化需要初始化的
  • 在一個“永遠”的循環中,
  • 初始化工作線程。
  • 讓它自由運行。
  • 主線程可以執行其委托工作(將任務交給工作人員)
  • 或者只是等待工人完成
  • 並重復。

或者,主線程仍然可以在永久循環中運行,但會識別可委托任務何時到達,然后初始化工作線程並為其分配特定任務。 這允許與不完整的可委托任務一樣多的工作線程。 您可能需要限制數量,以免有太多未完成的任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM