回覆列表
  • 1 # 使用者1453546802276

    Qt的QThread不是讓你繼承著寫的你應該寫個類用來操作QSerialPort,類成員裡放一個QSerialPort指標,然後把對外互動的函式都寫成槽,再寫一個init函式然後,在你構造這個類的地方,也構造一個QThread,將類物件moveToThread(thread),thread->start()從此,所有透過訊號槽執行的該類函式,都會在子執行緒裡運作將thread的started訊號繫結到obj的init函式上,init函數里進行new QSerialPort和open操作讀操作,把QSerialPort的readyRead訊號綁到這個obj的槽上。槽裡呼叫read,然後把讀的結果用訊號emit到外部寫操作,在obj裡提供一個write槽函式,函式內直接呼叫串列埠類的write。外部使用時,emit一個訊號,該訊號觸發obj的write槽函式另外,你們老大說的沒錯,QIODevice的子類都不應跨執行緒操作————————————————————————總結,Qt的子執行緒寫法:1、不要寫死迴圈!需要持續做的事情,做個timer,綁到timeout訊號上2、寫一個object,將其moveToThread3、該object,對外的所有操作,全部用訊號槽。透過槽接收外部的呼叫操作(比如open、close、write),透過訊號傳送資料給外部(比如接收到的資料)4、需要在子執行緒分配的資源,比如QSerialPort,全部在該object的某個槽函式(如init)中進行,將該槽函式繫結到執行緒的started訊號上5、程式退出時,不要直接delete object,因為那個物件不處於子執行緒。將qApp的aboutToQuit函式,繫結到object的deletelater槽上,這樣就會由那個執行緒負責delete這個object。然後將object的destroyed訊號,繫結到執行緒的quit槽上,將執行緒的finished訊號繫結到執行緒物件的deletelater槽上。這樣,程式即將退出->由子執行緒刪除object->執行緒停止->執行緒物件銷燬6、執行緒物件,以及move到執行緒裡的物件,都不要設定parentQThread這個基於類的子執行緒,比起傳統的基於函式的子執行緒好處在於,你可以線上程中放任意多個物件執行。只要你保證所有物件都是透過訊號槽運作,而不是像寫c的子執行緒那樣用while(true)運作,那麼一個QThread就可以管理任意多個物件

  • 中秋節和大豐收的關聯?
  • 那麼為什麼馬和驢所生的叫騾子而不叫馬驢?