none
[C#]如何將硬體設備一個一個抓進來的值放進LIST 之後再使用pictureBox抓值進來畫圖!? RRS feed

  • 問題

  • 小弟目前在做腦波研究

    所以使用藍芽模組一個一個將腦波值抓入

    儲存在LIST

    但卻遇到一個問題是 

    抓值的時候LIST是一個一個慢慢將值存入陣列

    但pictureBox要使用paint事件時

    以下是我的程式

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                
                Graphics objGraphic = e.Graphics;
                Pen pen_2 = new Pen(Color.Black, 1);

                for (int i = 0; i<500; i++)
                {
                    objGraphic.DrawLine(pen_2, i, effectdata2[i], i+1,effectdata2[i+1]);
                }
            }

    其中effectdata2是儲存抓值資料的LIST

    for迴圈I<500我是看pictureBox的寬度來定的

    但我發覺 也許當這個迴圈再做的時候

    我的抓值資料的數值並沒有這麼多個

    導致pictureBox出現一個大紅叉

    (如果錯誤非在此處 懇請賜教)

    今天如果要抓一個值 便畫一條線

    又或者是等待一定數量的值

    在一次畫多個資料

    又或者有其他方法

    請問要如何實作出來呢!?

    2016年7月19日 上午 06:53

解答

  • pictureBox1_Paint

    當然是觸發事件才會繪製。

    你可以在本論壇搜尋記憶體繪圖,不要寫在 Paint 事件。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年7月20日 下午 02:54

所有回覆

  •                    for (int i = 0; i < 500; i++)
                       {
                           if (effectdata2.Count  <= i + 1) break;
                           objGraphic.DrawLine(pen_2, i, effectdata2[i], i + 1, effectdata2[i + 1]);
                       }

    判斷沒有值,就跳出迴圈不要畫試試...

    2016年7月19日 上午 09:37
  • 1. effectdata2 是隨資料長大

    for (int i = 0; i<effectdata2.length; i++)

    2. effectdata2 是固定為 .length = 500

    宣告全域變數 lastDataIndex,在讀資料時用 effectdata2(lastDataIndex) = xxx,迴圈改為 for (int i = 0; i<lastDataIndex+ 1; i++)


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年7月19日 下午 02:13
  • 不知是否可以使用 chart control ?

    https://code.msdn.microsoft.com/mschart


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2016年7月19日 下午 02:42
  • 如果effectdata2是List集合, 可以這樣用:

    for (int i=0;i<effectdata2.Count;i++)
    {
      ...
    }
    如果程式有用執行緒, 要換用可以同時讀寫的集合比較保險


    2016年7月20日 上午 02:05
  • 後來我發覺 paint事件似乎是只會在程式一開始執行的時候動作

    如果迴圈值接break好像就會停止

    之後也不會做繪圖的動作呢

    謝謝您的解答 我會再努力嘗試看看

    2016年7月20日 上午 04:36
  • 之後我照著大大的說法

    因list好像沒有.length的方法

    所以我用了.count來設定FOR迴圈大小

    現在不會出現紅叉了 但還是沒有跑出波形圖

    是不是我讀paint事件的時候少注意了什麼關鍵呢

    謝謝您的解答!

    2016年7月20日 上午 04:38
  • 謝謝您!

    我下載來研究研究

    不知道能否成功

    2016年7月20日 上午 04:39
  • 確實在抓值的時候有用thread來抓

    所以您的意思是設定成兩個LIST一個拿來收取值

    另一個拿來繪圖這樣嗎

    感謝您的回應~

    2016年7月20日 上午 04:43
  • 呼叫PictureBox的Invalidate函式可以令PictureBox重繪, 而再次呼叫PictureBox的Paint函式
    2016年7月20日 上午 06:05
  • pictureBox1_Paint

    當然是觸發事件才會繪製。

    你可以在本論壇搜尋記憶體繪圖,不要寫在 Paint 事件。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年7月20日 下午 02:54
  • 好的  謝謝大大!  我會繼續研究

    感謝您的解答


    2016年7月22日 上午 06:01
  • 確實在抓值的時候有用thread來抓

    所以您的意思是設定成兩個LIST一個拿來收取值

    另一個拿來繪圖這樣嗎

    感謝您的回應~

    可以一邊抓值,一邊繪圖,但要考慮到記憶體大小問題,所以可以使用Circular Buffer;

    簡單來說就是兩個Thread一個Buffer,一個Thread就是負責塞資料進Buffer,另一個Thread去看Buffer有沒有資料,有就畫沒有就等,這樣應該可以符合您的需求。

    2016年8月5日 上午 02:32