2016-10-19 54 views
0

我正在製作一個必須使用並行處理的程序(C++),它將調用一些函數,並且一些窗口將通過模擬串行端口(qserialport)與我的硬件交互。QT中的串行端口和OpenCV線程

我有嚴重的問題來定義我的軟件的基本結構(主要是因爲我不知道如何使用並行化)。

有一個串口連接到它連續通話,硬件也有通過USB連接的攝像頭,使用OpenCV庫來處理視頻。

我需要同步並完成這些任務並且我有嚴重的混淆。

我有一個班,將使串行端口工作。我有一門課程可以與相機一起工作並完成識別任務。我想我會有一個線程來同步這些任務。我有一個主窗口,將與這些任務交互。目前,所有這些作品都在主線程中運行。

主線程與其他人進行通信的最佳方式是什麼?並同步? (這對我來說很複雜,因爲我在主線程中使用了一些數據,比如圖像或配置串口)。 什麼是「正確」的方式來做到這一點(我明白這是一個非常抽象的問題,我認爲我的問題非常普遍,那麼所有的建議都會很好地被接受)?我需要多少個線程? PS:現在,我有一個在主窗口中定義的結構,它維護着指向其他初始化對象(如Vision和SerialPort)的指針,它可以工作,但我需要鎖定,直到軟件識別或硬件做出動作,這是一個大問題!如果我嘗試將這些結構移到一個線程,程序崩潰。

非常感謝!

回答

0

我從你的標籤看到你正在使用Qt。因此,如果您不是已經在使用QThreads,那麼他們會讓許多事情變得更簡單。當使用QThreads時,您將爲每個輔助線程創建一個繼承QObject的類。

至於線程的數量,我認爲你會想要至少3(主要或用戶界面,視頻和串行端口)。你可以做更多,但我不會,除非你有特定的需求(例如,我經常使用2個助手線程的視頻,一個捕獲和一個處理)。

我建議在信號和插槽的線程之間進行通信,而不是直接調用函數。有許多方法可以使用不同的ConnectionTypes在Qt中的線程之間進行連接。如果您想隨時撥打電話,您也可以使用QMetaObject::invokeMethod。如果以這種方式進行交互(除了DirectConnection),您將在對象所在線程中調用該函數,以減少將thread safe保留在類中的難度。

同步非常模糊,因此會相當依賴於您的需求。有時你可以通過BlockingQueuedConnection來實現這一點,它將阻塞在調用線程中,直到它在另一個線程中完成(有效地使它們成爲同一線程直到它返回)。其他時候只是在某些事件發生時發送通知信號(例如幀準備就緒)將使事情保持足夠接近,無關緊要。

+0

非常感謝您的回答克里斯,也是您的時間! 現在我有嚴重的問題來同步我的QThread的,但你的答案是好的。按照您的建議使用這兩個qthread,並使用另一個QThread來管理它們之間的同步。 現在我不能將這些qthreads與主線程進行通信,當我嘗試從主線程向這些線程發送信號時我沒有問題,但是當我嘗試向主線程發送信號時,我在執行時收到警告。我會用一些代碼片段來打開另一個問題。謝謝!迭戈 – Diego