簡體   English   中英

C ++ Qt異步進程快速計時建議

[英]C++ Qt fast timing of asynchronous processes advice

我目前正在處理Qt GUI,必須為測量設備進行設置。 該設備正在與抓幀卡配合使用,該抓卡卡可以非常快地從線攝像機抓取圖像。 我的圖像處理不是那么復雜,需要0.2毫秒才能完成,用QCustomPlot顯示信號和處理結果大約需要40毫秒,這完全可以。 除了GUI輸出之外,NI DAQ設備還將處理后的信號作為模擬信號輸出。

我的問題是我必須以恆定的頻率更新模擬信號,並且仍然不時更新GUI。

我當前的方法或想法是創建一個數據池線程和兩個工作線程。 一個工作線程從幀捕獲器接收數據,對其進行處理並更新數據池。 第二個工作線程使用NI DAQ設備中的時鍾給定的大約2-5kHz的特定頻率更新NI DAQ的模擬通道。 GUI線程會不時讀取數據池,以大約20-30Hz的速率更新信號顯示。

我想使用Qt線程管理和他的信號和時隙機制,因為它的“簡單性”,並且因為我已經使用過與Qt及其線程類結合使用的線程。

有沒有更好的方法,有人有想法或建議嗎? 我可能在線程的時間安排上遇到問題嗎?

此外,是否可以將一個線程分配給多核CPU上的單個CPU內核,以便該內核僅處理該單個線程?

有沒有更好的方法,有人有想法或建議嗎? 我可能在線程的時間安排上遇到問題嗎?

信號/插槽機制很好,嘗試一下,如果遇到性能問題,您仍然可以嘗試找到另一種方法。 我使用信號/插槽機制通過QAbstractVideoSurface和Mediaplayer進行實時視頻處理。 它為我工作。

此外,是否可以將一個線程分配給多核CPU上的單個CPU內核,以便該內核僅處理該單個線程?

為什么要這么做? 操作系統或線程庫具有一個調度程序,負責處理此類事情。 只要您沒有充分的理由自己進行此操作,就應該使用現有方法。

我會嘗試使用三個線程:1)UI線程,2)抓取和處理線程,3)模擬輸出線程。

訣竅是使用三重緩沖區將抓取和處理的輸出連接到模擬輸出的輸入。

說,在時刻t ,線程(2)完成對frame[(t+0)%3] ,立即將輸出目標更改為frame[(t+1)%3] ,並通知正在循環通過的線程(3) frame[(t+2)%3] ,以在適當時切換到frame[(t+0)%3]

當我在具有10fps處理幀速率和60fps NTSC輸出幀速率的圖像處理項目上工作時,便使用了此技術。 為了消除tearing effect ,最少需要三個緩沖區的循環緩沖區。

暫無
暫無

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

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