2016-10-27 60 views
0

在Qt中多個線程使用'emit'發送大量信號,觸發非常慢。看似有排隊機制。有沒有什麼好的方法來快速觸發線路上的信號插槽?有沒有什麼好的方法來快速觸發Qt中的信號插槽?

+0

您是否想要在發出信號的線程中調用該插槽?如果是這樣,請確保它是線程安全的,並且它所調用的所有內容也都是線程安全的!特別是,GUI的東西都必須在主線程中發生! – hyde

回答

1

你在問什麼叫Qt::DirectConnection。您需要在connect()中指定它以確保插槽將立即被調用。

當它用來:當所述信號被髮射

槽被立即調用。該插槽在信號線程中執行。

否則,默認的Qt方式叫做Qt::AutoConnection

如果接收器駐留在發出信號的線程中,則使用Qt :: DirectConnection。否則,使用Qt :: QueuedConnection。信號發射時確定連接類型。

可以在connect()指定連接類型:

QMetaObject::Connection QObject::connect(const QObject *sender, const  
    char *signal, const QObject *receiver, const char *method,  
    Qt::ConnectionType type = Qt::AutoConnection) 

關於這兩個以及如何使用是here之間的差異很好的答案。

+0

當然,slot方法必須是線程安全的,例如不包括更新GUI。將邏輯分成兩個相關的類(一個具有線程安全槽和另一個「正常」槽)可能會更好,以避免意外地對線程不安全的槽進行直接的線程間連接。 – hyde

+0

@hyde同意但我們不知道啓動者想要在插槽中執行什麼主題。他問只是如何呼叫插槽沒有隊列:) – demonplus

+1

是啊,TBH這個問題聽起來像一個XY問題... – hyde