2013-11-15 82 views
-2

我已經閱讀了許多關於c#和Application.DoEvents()中的線程的文章......仍然無法正確使用它來完成我的任務: 我有一個控制器連接到我的COM,該控制器適用於指令(I send命令,需要等待幾毫秒從它那裏得到響應),假設的迴應是,我想用一個循環來繪製每個時間間隔數據:使用SerialPort控制器的多線程安全使用

  • 啓動我的循環。
  • 通過串口發送命令給控制器。
    • 等待響應(等待20毫秒)。
    • 獲取數據。
  • 重複這個循環,每個說100毫秒。

這根本就不想工作!我試圖與其他線程上的數據控制器進行通信,但似乎無法訪問屬於主線程的串行端口(粗略地說)。

任何幫助表示讚賞

+4

從我的經驗來看,'DoEvents'從未解決過任何問題。我傾向於遠離它。 – gunr2171

+0

你在這種情況下使用什麼,當你需要它的時候,你能給我一個你喜歡的替代品嗎? to gunr2171 – chouaib

+0

在輔助線程中創建serialPort實例,使用它並在那裏管理它。使用BeginInvoke回傳您的繪圖數據。 –

回答

2

Application.DoEvents同意對所有它 - 沒有什麼比一個嵌套調用到Windows以上(低級別)消息循環在同一個線程上。如果您在事件處理程序中調用它,可能很容易引起遞歸。您可以考慮在工作線程上創建串行端口對象,並通過線程類(即WaitHandles等)進行通信。或者在UI對象上使用「BeginInvoke」和「EndInvoke」回調你的UI線程。

+0

是的,他們說,在我發佈的第3個鏈接:) +1然而,好的服務... – Noctis

+0

謝謝,我們重疊了似乎。但作爲非母語的人,這些答案需要幾秒鐘才能輸入......至少沒有太多的錯別字:) –

+0

+1 - 僅僅是完美的答案。 –

-1

爲什麼你用它開始?

看一看這個頁面,它可能給你一個方向

  1. 我最喜歡的:Is DoEvents Evil?
  2. 從MSDN博客Keeping your UI Responsive and the Dangers of Application.DoEvents
  3. 從MSDN論壇Application does not return from call to DoEvents

無碼,這將很難提供幫助。即使有代碼,它可能很難幫助:)

我與gunr2171這個:)

+0

我會說這是一個只有鏈接的答案,但其中一個鏈接是Coding Horror,一個永遠不會死的網站。 – gunr2171

+0

我想說這個問題太廣泛了,用戶甚至沒有顯示他所嘗試的內容......所以...關閉做一些閱讀,並顯示他關心:) – Noctis

0

如果您捕獲SerialPort.DataReceived事件,然後使用枯萎的SerialPort.ReadLine或SerialPort.Read(byte [],int,int),那麼這些方法將在新線程上執行。我更喜歡使用互斥鎖來控制對字節緩衝區的訪問作爲共享資源。您是否曾經成功地與您的設備進行過通信?如果除了端口設置,請檢查SerialPort.NewLine屬性和SerialPort.Handshake屬性。這些設置因您嘗試與之通信的設備而異。