簡體   English   中英

使用帶有非Qt線程的Qt信號/插槽

[英]Using Qt signals/slots with non-Qt threads

我做了盡職調查但找不到這個問題的答案:

Qt信號/插槽機制如何與非Qt線程交互?

特別是,從非Qt(例如TBB )線程發出信號是否可以安全地被主事件循環中的插槽捕獲? 假設我明確地將它與排隊連接連接? (我的感覺是指定連接排隊是強制性的;這是正確的嗎?)

(作為一個附帶問題,我一直在假設,一般來說,Qt同步類,例如QMutex ,可以在非Qt線程上工作。這是正確的嗎?)

(作為一個澄清的評論,我擔心的是排隊的連接機制不會使用保護,例如互斥,如果它沒有檢測到信號是從哪個發出的,那么將metacall添加到主線程事件隊列一個不同的Qt線程。)

(最后補充:我可以相信,因為Qt機制是根據特定於平台的原語實現的,實際上我嘗試做的所有事情都會優雅地工作,但我也想知道Qt是否提供任何保證這些東西能起作用。)

文件說明:

注意: Qt的線程類是使用本機線程API實現的; 例如,Win32和pthreads。 因此,它們可以與相同本機API的線程一起使用。

所以是的,Qt的互斥體將與其他線程一起使用(只要它們也使用相同的本機API)。

Qt線程和其他線程之間的區別在於其他線程永遠不會運行Qt的事件循環,因此將無法接收和處理任何信號。 但是,如果您在這樣的線程中運行事件循環( exec ),一切都應該正常工作。

信號相關的函數,主要是processEventspostEvent被認為是線程安全的:

注意:此功能是線程安全的。

如果對象正確設置了線程關聯(使用moveToThread方法),則無需顯式設置連接類型,默認AutoConnection工作方式如下:

(默認)如果在接收對象具有親和力的線程中發出信號,則行為與直接連接相同。 否則,行為與排隊連接相同。

這個答案表明非Qt線程也應該通過Qt的方法正確識別 - currentThread應該返回一個QThread實例,即使對於非Qt線程,因為它只是本機線程的包裝器。

暫無
暫無

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

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