簡體   English   中英

QT中的串行端口和OpenCV線程

[英]Serial Port and OpenCV threading with in QT

我正在編寫一個必須使用並行處理的程序(C ++),它將調用某些函數,並且某些Windows將通過模擬的串行端口(qserialport)與我的硬件進行交互。

我在定義軟件的基本結構時遇到了嚴重的問題(主要是因為我不知道如何使用並行化)。

連接有一個連續通訊的串行端口,並且硬件具有通過USB連接的攝像頭,使用OpenCV庫處理視頻。

我需要同步並在paralell中執行這些任務,我感到很困惑。

我有一個使串口工作的類。 我有一堂課,將與相機一起工作並執行識別任務。 我想我會有一個同步這些任務的線程。 我有一個主窗口,它將與這些任務交互。 目前,所有這些部分都在主線程中運行。

主線程與其他線程進行通信的最佳方式是什么? 和同步? (這對我來說非常復雜,因為我在主線程中使用了一些數據,例如圖像或配置串行端口)。 做到這一點的“正確”方法是什么(我理解這是一個非常抽象的問題,我也認為我的問題很普遍,所以所有建議都將受到歡迎)? 我需要多少個線程?

PS:現在,我有一個在主窗口中定義的結構,它維護着指向其他初始化對象(例如Vision和SerialPort)的指針,它可以工作,但是我需要鎖定直到軟件能夠識別或硬件進行移動為止。是個大問題! 如果我嘗試將這些結構移動到線程中,程序將崩潰。

非常感謝!

我從您的標簽中看到您正在使用Qt。 因此,如果您尚未使用QThreads ,我建議您使用它們,因為它們使很多事情變得容易。 使用QThreads時,您將創建一個繼承每個幫助程序線程QObject的類。

至於線程數,我認為您至少需要3個(主或ui,視頻和串行端口)。 您可以做更多的事情,但是除非您有特定的需求,否則我不會做的(例如,我經常使用2個輔助線程進行視頻,一個用於捕獲,一個用於處理)。

我建議使用信號和插槽在線程之間進行通信,而不是直接調用函數。 您可以使用多種方法使用不同的ConnectionTypes在Qt中的線程之間進行連接 如果您想即時調用某些內容,也可以使用QMetaObject :: invokeMethod 如果以這種方式進行交互(DirectConnection除外),則將在對象中存在的線程中調用該函數,從而減少了在類中保持線程安全的許多困難。

同步非常模糊,因此將完全取決於您的需求。 有時,您可以使用BlockingQueuedConnection來實現此目的,該方法將阻塞在調用線程中,直到在另一個線程中完成(有效地使它們成為同一線程,直到返回)。 其他時候,僅在某些事件發生時發送通知信號(例如,幀已准備就緒)將使事情保持足夠近的程度,無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM