QT程序怎么實現多進程間通信?
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就可以管理任意多個對象