昨晚在作ModBus的時候遇到了兩個問題,第一個是tcpsocket忽然沒法發送數據了,顯示tcpsocket沒法跨進程調用;第二個是編譯時一直顯示沒法訪問QObject的私有變量。socket
當時的狀況是這樣的,通過兩天的思考與實現以後,程序忽然沒法收到從RTU返回的信息了,兩天前一樣的收集線程程序明明能夠的。找了半天究竟是哪裏出了問題。 tcp
最後發現問題是出在啓動線程的start()
函數上,以前個人全部線程都是在主線程初始化的時候就start。主進程裏面有線程的對象(不是指針),線程的對象會隨着主進程初始化而初始化,tcpsocket對象(不是指針)在線程初始化的時候初始化,同時經過tcp/ip鏈接模擬程序。這樣線程初始化完成以後就馬上開始運行。 函數
後來我寫了一個按鈕響應,把線程的start()
給挪到按鈕響應裏去了,這樣以後每次tcpsocket發送數據的時候就是出錯,輸出「tcpsocket沒法跨線程調用」,因而我又把start給挪回構造函數裏了,下一步準備試一下在按鈕響應裏面new一個線程的對象。 spa
這個問題我以爲多是由於主進程和線程的關係的緣由?線程
這個問題實際上是發生在上一個問題以前的,這個問題在以前的我看來實際上是蠻無厘頭的。光說可能沒啥感受,上個圖先。 指針
上圖就是此次問題的三個主角,DataBlock
、CollectionThread
、DBManager
。 須要交代的是DataBlock這個主角中的主角是一個關係戶,他爸爸是QObject(傳說中Qt你們庭裏面大部分人的爺爺or太爺爺...) 也就是說DataBlock直接繼承自QObject。而後編譯的時候就一直提示我「沒法訪問QObject的私有成員」,我還真信了,跑去看了幾個DataBlock裏面的變量,後來想不可能啊,以我這奇葩的命名方式,怎麼可能會那麼巧合的重名!因而我百度了。 code
而後我發現是由於QObject不容許copy或者opeartor=,而後我看了看個人代碼,果然有地方用了等於號。對象
原本是想借用Qt的QObject的管理機制來管理這個DataBlock的,原來這麼多限制, 因而就取消了DataBlock和QObject的父子關係, 因而就不讓DataBlock繼承QObject了,也不用Q_OBJECT宏了。這樣就解決了。 blog
須要注意的是以前我覺得必須歸入Qt的體系中才能夠用QList管理數據,如今發現不須要歸入Qt的體系也能夠用QList管理數據。繼承
(2015.10.20補充)
今天我又遇到Qobject的子類不能copy和operator=的問題了,可是我須要在那個類裏面使用connect函數鏈接槽函數和消息,這該怎麼辦呢?
我想了一個麻煩的辦法和一個簡單的辦法。麻煩的辦法就是傳給它一個是Qobject子類的對象的指針,用這個指針來調用connect函數。
簡單的辦法有效,因此我就沒有嘗試麻煩的辦法究竟可行不可行,QObject::connect(...)
,這樣就好了。 我理解的qt程序是都運行在一個core上,因此只須要通知它綁定了什麼信號和槽就好了。