2013-10-18 24 views
5

我有以下情況:WPF實時圖應用程序體系結構

我想發送(通過串行端口)一些命令到設備。該設備確實將數據連續發送給我(每秒最多12000個值)。

要控制某些設置,我需要一些按鈕來發送命令到設備,以在數據流之前和期間啓動/停止/更改設置。此外,我想有一個這個數據的實時陰謀。我當然會過濾這些數據。同樣在某些時間標記處會有一個信號,表明我想切出接收到的數據的某個窗口。

這意味着我將有兩個圖表。我已經使用WPF取得了一些進展,但現在當我與下圖交互(縮放/平移)時,上面的一個會顯着凍結。這是因爲兩者都經常刷新!

工作(數據接收/過濾)使用線程完成,但更新的圖必須在ui線程內完成。

任何想法如何解決這個問題?也許使用多個進程?

enter image description here

回答

1

我正在與實時波形類似的WPF應用程序(約500Hz的)。我有一個後臺線程接收實時數據,一個單獨的線程來處理它們並準備繪圖數據(我有一個緩衝區,其中有我準備好的值的屏幕「大小」)。在UI線程中,我將波形繪製到RenderTargetBitmap,它最終呈現給畫布。這項技術使我可以在屏幕上獲得大量的實時波形,並且無需任何問題(約40-50 fps)即可進行縮放和平移工作。

請讓我知道如果您需要一些技術細節,我可以稍後與您分享。

我認爲你在UI線程中有一些代碼沒有很好地優化或者可以移動到後臺線程。

順便說一句,你使用任何框架的圖表?

編輯

philologon是正確的,你應該使用的Rx的實時數據,它簡化代碼很多。我也在我的項目中使用它們。

+0

我用oxyplot的技術含量的領先優勢。我在UI線程中做的唯一事情就是爲圖表賦值並更新它。據我所知,這必須在UI線程中完成。另外如果我不更新情節,我會得到高fps。你有沒有一個例子來描繪你的浪潮?也許這已經給了我一些提示,如何做得更好。 – user2799180

+0

當然,明天我會分享一些例子。據我所知(我在這方面做了一個小調查),oxyplot對於實時數據並不是很好。事實上,你沒有太多的選擇。 http://dynamicdatadisplay.codeplex.com/(http://d3future.codeplex.com/)很好,但很過時。我不會在真實項目中使用它,但對於調查來說它非常好。您可以使用[Direct 2D](http://blog.rthand.com/post/2012/01/10/Realtime-graph-for-WPF.aspx)。而且你總是自己渲染圖表,這正是我所做的。 – MrZoidberg

+0

我也做了一些調查。我發現了dynamicdatadisplay,但它確實不是最新的。我會看看Rx和Direct 2D。儘管我會對RenderTargetBitmap方法非常感興趣。我已經讀過它,但從來沒有找到一個很好的例子。這將是非常棒的。接收和處理我也在不同的線程中。非常感謝! – user2799180