2013-08-27 42 views
0

我在寫一個需要與串口通信的程序。我主要關心的是防止碰撞,並確保不同時寫入/讀取不同的功能。在多線程間執行代碼

首先,有一個系統定時器從開始開始,用於週期性地將數據寫入到串行端口,並且還收聽由給定的超時值的響應。因此,它會有一個已經完成的事件並完成工作。

其次,還有另外一個功能,具有較高優先級服務,將需要立即將數據寫入到串行端口。

方案1. Elapsed事件燒成每次1分鐘,並繼續進行從未如果仍然從先前的一個或SendImmediately功能掛起。

場景2. 如果SendImmediately被調用,它將需要等待當前運行的OnTimedEvent完成。再次,OnTimedEvent的下一次運行將停止,直到SendIm立即完成。

問題。 如何在上一個或SendImmediately完成之前阻止OnTimedEvent的下一次運行?基本上,要防止它們之間的干擾。

我已經經歷了一些問答&一去這裏。有許多建議答案象下面這樣:

  • 禁用和啓用定時器
  • 的AutoResetEvent(2路信令)
  • ManualResetEvent的
  • Monitor.Enter/Monitor.Exit(鎖定)
  • 隊列
  • 睡眠/加入/任務。等待(阻止)

我沒有堅實的fo因爲每個人都有不同的情景,所以決定哪一種方法適合我或者適合我。非常感謝任何建議。

public System.Timers.Timer aTimer = new System.Timers.Timer(Properties.Settings.Default.Interval * 60 * 1000); 
    public bool InitialTimer(int interval, bool action) 
    { 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     aTimer.Interval = interval; 
     aTimer.Enabled = action; 
     GC.KeepAlive(aTimer); 
     return action; 
    } 

    public void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     // write something to serial port 
    } 
    public void WriteImmediately() 
    { 
     // write something to serial port 
    } 

回答

0

我會做一個'SerialComms'線程在生產者 - 消費者隊列中等待超時。如果隊列等待超時,SerialComms將執行輪詢定時操作,然後返回隊列等待。如果優先級較高的thred想要將某些內容寫入端口,它可以對其消息進行排隊,這樣可以使SerialComms隊列等待立即返回而不會超時,然後'SerialComms'代碼可以執行寫入緩衝區。

The high-priority writes are signaled onto the SerialComms thread 'immediately'. 
No explicit timer required. 
No possibility of the high-priority write interrupting an ongoing timed operation. 
No possibility of multiple timed operations stacking up or interrupting each other. 
Multiple high-priority writes can be queued up without any interference.