none
程式delay 抓取資料問題。 RRS feed

  • 問題

  • Dear All Sir.

    小弟這次遇到一個問題,有點不了解,來請教大家。

    這次遇到的問題是,我的程式有設定Thread.Sleep(5000);

    我每一秒都會新增一筆資料,我的程式開始先抓取

    int a = dt.Rows.Count-1

    Thread.Sleep(5000);

    int b = dt.Rows.Count-1

    最後執行出來的a、b都是一樣的

    可是不是應該a = 1 b = 6嗎?

    可以幫我解惑嗎?

    還有可以問一下如果我想達到我說的a = 1 b = 6的結果

    有辦法達到嗎?

    感謝大家的回答


    2014年1月27日 上午 03:38

解答

  • Timer 事件是送給主執行緒,主執行緒在睡覺就看緩衝區有沒有爆,沒爆,主執行緒起床後會一次處理,有爆,過去的就船過水無痕。

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

    • 已標示為解答 黑小胡 2014年2月6日 上午 05:36
    2014年1月28日 下午 02:57
  • 這樣的程式, 我不建議用 Forms.Timer, 應該採用多執行緒的方式進行.

    因為你描述的並不清楚, 很難給你具體的建議.

    一般的作法是

    有一個 Thread 專門負責和設備通訊, 得到資料後放入某種集合 (如果可能的話, 用ObservableCollection類別 )

    利用集合的事件來回應資料已經加入, 移除或修改的狀況

    也就是所謂的觀察者模式.



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2014年2月5日 上午 08:01
    版主

所有回覆

  • 程式看起來邏輯沒錯啊,你前一秒 dt.Rows.Count-1 之後睡了五秒又下一次 dt.Rows.Count-1,數字會不一樣才有鬼...

    你如果看起來覺得怪,就補充多一點資訊,像是你資料是哪來的 (別的 thread 還是?)

    網友不是你肚子裡的蛔蟲,也不是你的視網膜,看不到你看得到的東西。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure


    2014年1月27日 上午 04:03
    版主
  • Dear 小朱

    我的資料存入datatable的,

    Datatable dt = new Datatable ();

    一個timers.timer一秒加入一筆資料

    一個Button按下後執行

    int a = dt.Rows.Count-1

    Thread.Sleep(5000);

    int b = dt.Rows.Count-1

    textBox1.Text = "A:" + a.ToString() + "B:" + b.ToString();

    結果是....我測試出來了....兩個會不一樣找出不同的Count.....(奇怪之前會出現一樣的Count,謎...

    我的錯,Sorry


    • 已編輯 黑小胡 2014年1月27日 上午 05:47
    2014年1月27日 上午 05:37
  • 您每秒新增的資料是新增到那裏? 是資料庫? 還是dt?

    2014年1月27日 上午 08:56
  • 1. ADO.NET 是離線式,與 ADO 在線式不同,請確認你是存取記憶體中的 DataTable ,而不是存取實體資料庫。

    2. 你的 Sleep 是在 Work Thread 還是 GUI Thread (主執行緒) ?你若是在 GUI Thread 睡,Timer 事件會被吃掉,當作沒發生。你只能利用 Work Thread 睡。


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

    2014年1月27日 下午 12:32
  • Dear this 大

    我的資料是新增在Datatable中,我是想要抓取五秒後電壓的變化。

    Dear 心冷大

    1.我是存取Datatable內的資料

    2.system.timers.timer事件執行 dt.Rows.Add(電壓);

    主執行緒執行

            private void button1_Click(object sender, EventArgs e)
            {
                int a = dt.Rows.Count - 1;

                Thread.Sleep(5000);

                int b = dt.Rows.Count - 1;

                textBox1.Text = "A:" + a.ToString() + "B:" + b.ToString();
            }

    ------------------------------------------------

    這樣的做法會讓timer事件停下來嗎?

    那我把兩個工作對調的話是不是會比較好呢!?

    之前顯示結果有出現兩個數值是一樣的,但是現在變數a、b顯示的值會跨五個了。


    感謝各位的回答與建議,非常感恩

    2014年1月28日 上午 12:47
  • Timer 事件是送給主執行緒,主執行緒在睡覺就看緩衝區有沒有爆,沒爆,主執行緒起床後會一次處理,有爆,過去的就船過水無痕。

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

    • 已標示為解答 黑小胡 2014年2月6日 上午 05:36
    2014年1月28日 下午 02:57
  • 在 UI 執行緒用 Thread.Sleep 是一個很奇怪的行為 , 當你在 UI Thread Sleep, UI 就會被暫止.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年1月29日 下午 01:23
    版主
  • Dear 心冷大,

    感謝你的解答,我再試看看的。

    Dear Bill大

    Sorry因為貪快想說直接用比較方便。


    再請教各位大大一個問題如果想要取後三筆的資料,

    如果用Count+3<<<但是資料還沒寫到那,所以會拋出超出索引範圍。

    除了Sleep還有什麼方法呢?


    • 已編輯 黑小胡 2014年2月5日 上午 09:33
    2014年2月5日 上午 06:48
  • 這樣的程式, 我不建議用 Forms.Timer, 應該採用多執行緒的方式進行.

    因為你描述的並不清楚, 很難給你具體的建議.

    一般的作法是

    有一個 Thread 專門負責和設備通訊, 得到資料後放入某種集合 (如果可能的話, 用ObservableCollection類別 )

    利用集合的事件來回應資料已經加入, 移除或修改的狀況

    也就是所謂的觀察者模式.



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2014年2月5日 上午 08:01
    版主