2012-05-29 63 views
0

的Qt 4.8,Windows XP中:QTimer,QThread的,和TCP消息

我有一個管理我的TCP報文,並打開/保存/關閉在適當的時候插座一個線程。

這個相同的線程啓動一個QTimer,200 ms,在我的線程數據中定義,它在我的線程類中抽取一個事件(如果)套接字打開。所以計時器和它的事件屬於線程,就我所瞭解的最好的想法。

QTimer超時事件通過屬於線程的端口發送TCP消息,它是這個特定硬件項目的保持活動消息。必須定期發送或設備「消失」,這是不行的。

當發送消息時,我得到這個錯誤:

「在QSocketNotifier:插座通知者不能從另一個線程啓用」

至於我可以告訴大家,我上午從發送消息相同的線程,並期望任何信號等,由它擁有/處理等。

誰能告訴我我在這裏失蹤了什麼?

PS:此消息發送設備確實活着......它只是我在Qt的錯誤控制檯上得到這個運行時錯誤,我很擔心,有潛伏的內部問題因爲它。

消息不會在OS X 10.6下運行。我不知道爲什麼。

回答

3

好的,這裏是獨家新聞。 QTimer由於僅爲QT的設計者所知的原因繼承了線程父代的上下文。不是它從其啓動的線程的上下文。所以當計時器關閉時,你從它所調用的插槽發送消息,你不在線程的上下文中,你在父母的上下文中。

你也不能啓動一個線程是THAT線程的子線程,這樣你就可以觸發一個實際在你想要的線程中的定時器。 Qt不會讓它運行。

因此,花費一些內存,建立一個隊列,從其他地方將消息加載到隊列中,觀察擁有TCP端口的線程中的隊列,並在你獲得時發送em。這樣可行。

+0

+1這個答案可能救了我的工作,不開玩笑!你能告訴我,如果這仍然在Qt5?另外,請您詳細說明文檔中描述的位置?謝謝! –

+0

實際上,我發現QTimer不會繼承Qt5中線程父項的cotext(我不知道Qt4.x)。但是您必須確保QTimer與工作對象一起移動,方法是將其作爲工作者的子項或在新的上下文中創建它。看到這個有用的帖子:http://qt-project.org/forums/viewthread/21141 –