qt中的執行緒可以通過繼承qthread類,重寫run() 函式,run() 函式即新執行緒的入(通過start() 函式啟動新執行緒);我我們實現的這個qthread的派生類,只不過是用來管理執行緒的。run()函式返回,新執行緒結束,可以在呼叫 .exec() 函式,在新執行緒中也開啟時間迴圈。
繼承自qobject的物件都會有乙個執行緒依附性,qobject 物件的執行緒依附性即是建立qobeject物件的執行緒,可以用 .thread() 函式獲得,在qthread物件 的run() 函式中所建立的物件的依附於該qthread 物件,也就是需要通過該qthread 物件來管理。
在qt5中,訊號可以連線到一切可以呼叫的物件上,包括普通函式,成員函式,函式物件,lambda表示式;總的來說,訊號與槽的連線有兩種方式:1、直接連線 2、佇列連線;預設的自動連線下,如果發射訊號的執行緒(而不是傳送者所在的執行緒)與接受者所駐足的執行緒相同,則是佇列連線;如果傳送訊號的執行緒與接收者所駐足的不在乙個執行緒,則是佇列連線。直接連線下,槽函式在傳送訊號的執行緒中立即執行;佇列連線情況下,槽函式在接收者所在的執行緒時間迴圈處理到時,才執行。
qdebug() << qthread::currentthreadid() << "mainthread";
connect(portthread1,&serialthread::opensuccesssig,[this]
);
的錯誤,說是lineedit_5所在的執行緒與lambda 表示式函式體中所在的執行緒不同;於是在**中加入三個qdebug() 語句,列印當前的執行緒id, 結果發現,lambda 函式體中的執行緒id 與 serialthread的run() 函式中輸出的執行緒id() 相同,也就是說,對於lambda 表示式,其執行的執行緒為訊號傳送的執行緒。
解決的辦法:想辦法使訊號從主線程傳送過來即可,在serialthread的run() 函式中, 傳送opensuccesssig() 訊號的地方改為傳送乙個新的訊號opensuccess() , 新的訊號跟新建立乙個槽函式opensuccessslot()連線,在槽函式中傳送opensuccesssig()即可,由於槽函式在主線程中執行,所以最終opensuccesssig() 訊號會在主線程中傳送。
qt中線程的使用還可以通過 .movetothread() 函式改變乙個執行緒的依附性;於是可以直接建立乙個qthread 物件thread,將乙個qobeject物件obj.movetothread(&thread),當中,這樣,可以使obj的槽函式在次執行緒中執行;而且此時次執行緒中仍然有事件迴圈,可以呼叫 thread.quit() 停止事件迴圈,然後thread.wait()函式等待結束。需要注意的是,子物件和父物件的執行緒依附性必須相同,否則會出錯。
另外記錄一點:用vs編譯器,建立視窗物件時,必須的使用小寫"com1" ,使用gcc編譯器的qt,發現使用小寫串口號無法開啟串口號10以上,改為大寫「com10」可以解決。
QT跨執行緒連線訊號和槽
對qt的訊號和槽理解較為初級,今天通過多次嘗試,終於學會了跨執行緒連線訊號和槽。其基本方法如下。1.無引數傳遞時 1 定義 signal void signal1 2 連線部分寫法 connect p class1,類1的指標 signal signal1 類1的訊號 p class2,類2的指標 ...
Qt跨執行緒的訊號和槽的使用
connect用於連線qt的訊號和槽,在qt程式設計過程中不可或缺。它其實有第五個引數,只是一般使用預設值,在滿足某些特殊需求的時候可能需要手動設定。qt autoconnection 1 ifndef mainwindow h 2 define mainwindow h 3 4 include 5...
Qt訊號與槽連線
connect pointer1,pointer2,pointer3,pointer4 pointer1 指向傳送訊號的物件的指標 pointer2 傳送訊號的物件所對應的類的成員函式的指標 pointer3 接收訊號的物件的指標 pointer4 接收訊號的物件所對應物件的槽函式指標 總結下來就是...