2016-06-21 151 views
-1

我一直在研究WinForms實用程序,該實用程序從文本文件獲取命令和/或數據,並基於此文件的內容通過串行傳輸或請求更多數據。這一切都很完美,但我正在努力研究如何讓GUI給出一些反饋,指出發生了什麼。在其目前的結構形式主要負載和Load()事件打開文本文件,並處理其內容線程和更新GUI

tp = new TProcess(); 
tp.FileOpen(); 

T加工和所有參與串口通信的其它類被收集到一個子項目,編譯如下一個DLL。反過來,TProcess將創建SerialDevice對象的新實例(也在我的DLL中定義),並將其傳遞給我的數據,然後告訴它如何處理它,例如

//TProcess 


if (File.Exists(filey)) 
      try 
       { 

       StreamReader file = new StreamReader(@"filey"); 



       List<clsStuff> stuffList = new List<clsStuff>(); 

       while ((line = file.ReadLine()) != null) 
        { 
        //process and add to list 
        } 

        var SD = new SerialDevice(); 
        SD.List = stuffList;       
        SD.Send(); 

       file.Close(); 

       } 
      catch (Exception e) 
       { 
       //Write Error File 

       } 

     } 

我的SD類定義了所有的端口參數,將第一項的數據包,並接收確認來自使用DataReceived事件檢索遠程設備分組時,它然後在一時間發送從所述列表中的一個項目,直到它有完成並退出。 因此,我的問題(對不起長時間囉嗦)是我怎麼能通過某種反饋(可能是每次我收到一個數據包確認後收到Record X的字符串)事情發生在GUI上,因爲GUI線程沒有創建我的SD實例,如果這是一個更緊湊的程序,並且GUI線程已經調用SD,我將使用委託和BeginInvoke,但是我不明白我在這裏如何做到這一點,因爲GUI對SD實例一無所知,同樣,SD也不知道關於GUI。我覺得這可能通過SynchronisationContext解決,但我不知道如何實現它。

  public void Send() 
       { 
       if (!serialP.IsOpen) 
        { 
        PortOpen(); 
        serialP.ReceivedBytesThreshold = 4; 
        } 
       serialP.Write(CurrentListItem, 0, 11); 


       } 
     private void serialP_DataEvent(object sender, SerialDataReceivedEventArgs e)// This triggers when the response is received 
       { 


         byte[] Ack = new byte[4]; 
         serialP.Read(Ack, 0, 4); 
         //snip of course I check these 4 bytes etc here 
           CurrentListItem++; 
           //UPDATE THE GUI BUT HOW? 
           Send()!;//next 
        } 
+0

* //更新GUI,但是如何使用您的視圖也可以訂閱的事件。但是它看起來像你對文件的處理是阻塞的(很難用你的代碼片段來說明),所以你可能也想做出這種異步。 –

+1

請編輯您的問題並設置您的代碼的格式,以便可讀 –

+0

@sowjanyaattaluri:存在事件,因此您不必這樣做。 –

回答

0

要將TProcess類添加您的UI可以訂閱一個事件:

public event EventHandler DataRecieved; 

然後在你的serialP_DataEvent你可以在適當的時候做的事:

if (DataRecieved != null) 
{ 
    DataRecieved(this,EventArgs.Empty); 
} 

你的UI可以再訂閱此:

tp.DataRecieved += (o,e) => { // do something to the UI }; 

有兩點要注意:

1)你可以,如果你使用的是一般EventHandler<T>代替EventHandler事件傳遞信息。其中T是您想要發送的任何數據的類別

2)它看起來像FileOpen是同步和阻止,因此它會阻止您的用戶界面更新。使其異步或至少使用Task.Run

3)如果你讓它是異步的,你可能會遇到嘗試從不是UI線程的線程更新UI的問題。您將需要使用Invoke將UI更新推回UI線程(您不會說這是WinForms還是WPF,但它們是相似的)。

+0

謝謝,我確實相信你正確地指向我想要去的地方,並且也感謝文件處理提示,這是我在列表中的下一個東西,在行之間插入延遲會阻止表單加載。 – BinBin

+0

好吧,我決定一次完成這一步,所以我製作了一個不那麼複雜的項目(沒有文件處理),其中SerialDevice類爲UI描述了一個事件,並描述了它然後使用Invoke來更新文本字段,作品。我可能是愚蠢的,但我然後把我的注意力再次處理文件,我的SerialDevice類如何觸發創建它的TProcess類中的DataReceived事件?我是否菊花鏈事件,所以TProcess訂閱由SerialDevice提供的事件? – BinBin