none
如何延遲執行程式! (Timer?) RRS feed

  • 問題

  • 請問:

    我有一個接受訊息的類別, 當它收到訊息時, 我想延遲一個時間(如2秒)之後, 確定沒有其它訊息了, 再做資料處理!

    我想使用 Timer, 但, 因為, Timer 在自身的類別之中! 物件尚未生成, 它只能執行靜態的函數!

    想用sleep, 但它會讓整個程式都停下來吧? 我還需要讓程式持續接受訊號!

    我該怎麼做呢? 謝謝!




    • 已編輯 GaryChiang 2019年9月26日 下午 02:24
    2019年9月26日 下午 02:20

解答

  • 第一個可以見到是綁定SummaryTable 的那個 dataGridView, 無法顯示更! 

    在點選該dataGridView了之後會出現資料!

    抱歉,还是没明白你的意思。你先在timer1.Tick+=...这句前面加上“timer1.SynchronizingObject=this;”试试吧。
    • 已標示為解答 GaryChiang 2019年9月28日 下午 01:32
    2019年9月27日 下午 01:45

所有回覆

  • 你可以用 Sleep 睡 2000ms 後,再檢查有沒有其他東西。

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

    2019年9月26日 下午 02:39
  • 方法一:你把Timer改为非static的不就行了么。

    方法二:加一个static的物件参数。例如

    加入 private static ClassA a;

    然后运行时 a = this;

    调用时 a.UpdateSummaryTable();

    销毁时 a= null;

    2019年9月26日 下午 03:46
  • 會有這個錯是因為OnTimeEvent宣告成static, 而static函式只能叫用static函式, 所以UpdateSummaryTable函式也必須宣告成static, 否則就只能拿掉OnTimeEvent的static宣告
    2019年9月27日 上午 12:41
  • 去掉static果然就可以運行了!

    但, 又出現另一個問題! Timer 使用了一個新的程序去執行 updateSummaryTable. 

    這讓我的MainForm 裏的 datagrideview 所綁定的資料無法同步!

    所以, 我只好用一個笨方法! 

    原本是 got message => wait 1 second => run updateSummaryTable. 改成

    在 class A 裏設了一個事件, go message, 傳送事件給 Form, 在Form裏等待1秒(用Form.Timer), 再通知 class A 執行 updateSummaryTable. 真是很笨的方法!

    2019年9月27日 上午 04:56
  • Timer 使用了一個新的程序去執行 updateSummaryTable. 

    没看懂你的意思?不妨提供更全面的代码说明。如果你指的是多执行绪问题,请设置SynchronizingObject。

    https://docs.microsoft.com/zh-tw/dotnet/api/system.timers.timer.synchronizingobject?view=netframework-4.8

    2019年9月27日 上午 05:27
  • 對不起! 我重新說一次!

    我在Form裏有二個 dataGridView, 它的 datasource 綁定了 DM 這個物件裏的二個table.

    接著, 在資料接收, 更新了 PositionTable....接著呼叫 setTimer()

    timer 在2秒後呼叫了updateSummaryTable

    最後updateSummaryTable 更新了 SummaryTable

    但問題很多, 第一個可以見到是綁定SummaryTable 的那個 dataGridView, 無法顯示更! 

    在點選該dataGridView了之後會出現資料!

    另外, 還會出現下面的錯誤訊息!

    謝謝!!


    • 已編輯 GaryChiang 2019年9月27日 上午 11:14
    2019年9月27日 上午 10:52
  • 第一個可以見到是綁定SummaryTable 的那個 dataGridView, 無法顯示更! 

    在點選該dataGridView了之後會出現資料!

    抱歉,还是没明白你的意思。你先在timer1.Tick+=...这句前面加上“timer1.SynchronizingObject=this;”试试吧。
    • 已標示為解答 GaryChiang 2019年9月28日 下午 01:32
    2019年9月27日 下午 01:45
  • IndexOutOfRangeException錯誤表示程式在使用註標取用陣列或集合元素時發生錯誤, 所以錯誤有可能是發生在for迴圈
    2019年9月27日 下午 10:46