gui框架一般只允許ui執行緒操作介面元件,qt也是如此。但我們的應用程式一般是多執行緒的,勢必就涉及到ui執行緒與子執行緒的互動。
下面介紹常用的ui執行緒與子執行緒互動方式,並附上自己的demo。
qt中提供了一些執行緒安全的方法來讓我們使用:
a.使用訊號槽
qt的訊號槽是執行緒安全的。connect函式的第五個引數connectiontype預設為qt::autoconnection,如果接收者和傳送者不在乙個執行緒,則相當於自動使用qt::queuedconnection型別,槽函式會在接收者執行緒執行。
connect(this,&mainwindow::signaldoing,worker,&myworker::slotdoing);
b.使用 qmetaobject::invokemethod
invokemethod可以執行緒安全的對目標物件進行操作,如呼叫目標物件的成員函式等。它也具有乙個connectiontype引數,參照connect。
qdebug()<<"main thread"connect(this,&mainwindow::signaldoing,worker,&myworker::slotdoing);
//worker操作結果
//啟動執行緒
thread->start();
//【示例b】通過invokemethod方法
//(這裡我直接用concurrent模組的run函式)
qdebug()<<"main thread"bool mainwindow::event(qevent *event)
}return qmainwindow::event(event);
}
參考部落格:
QT子執行緒操作UI
在qt中,子執行緒是無法直接操作ui的,否則會報錯,會出現執行緒衝突之類的錯誤。可以用兩種方法實現 1 使用訊號和操操作,子執行緒給ui所在的主線程發訊號 2 使用invokemethod方法。方法樣例如下 threadtest.h ifndef threadtest h define thread...
qt 執行緒與ui執行緒同步
qt 執行緒與ui執行緒同步 收藏 本文 http hi.baidu.com buptyoyo blog item b7b035ef2233a9d8b31cb137.html 目前只會一種,採用訊號槽機制。通常情況下,訊號和槽機制可以同步操作,這就意味著在發射訊號的時候,使用直接函式即可以立刻呼叫連...
Qt子執行緒如何更新UI?
和其他語言類似,不能直接在子執行緒更新ui,可以通過signal slot機制在ui執行緒進行更新。signal slot機制可以在不同物件,不同執行緒之間進行通訊。例子 include mainwindow.h include include class mythread public qthre...