2016-06-21 15 views
-1

私は、テキストファイルからコマンドやデータを取得し、このファイルの内容に基づいてシリアルを介してさらなるデータを送信または要求するWinFormsユーティリティを開発してきました。これはすべて完璧に機能しますが、何か起こっているというフィードバックをGUIに与える方法を試すことには苦労しています。現在の構造では、メインフォームのロードとLoad()イベントテキストファイルを開き、その内容GUIのスレッディングとアップデート

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

Tプロセスとシリアルポートを介して通信に関与するすべての他のクラスとしてコンパイルサブプロジェクトに収集されたプロセスDLL。次に、TProcessは(私のDLLで定義されている)SerialDeviceオブジェクトの新しいインスタンスを作成し、データを渡して、次にそれをどうするかを教えます。

//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イベントを使用してリモートデバイスからのアクノリッジパケットを受信し、それがなるまで、それはその後、一度にリスト1からのアイテムを送信終了して終了します。 私の質問は、(申し訳ありませんが長らく巻き込まれています)どうやってGUIのスレッドが私を作成していないことを考えれば、 SDインスタンスの場合、これはよりコンパクトなプログラムでGUIスレッドがSDと呼んでいましたが、デリゲートとBeginInvokeを使用しましたが、GUIがSDインスタンスについて何も知らず、SDも何も知っていないので、 GUIについて私はこれがSynchronisationContextによって解決されるかもしれないと思うが、私はそれをどのように実装するか考えていない。あなたのTProcessクラスに

  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

あなたのUIを購読することができ、イベントを追加するには:

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

あなたのUI:あなたのserialP_DataEventあなたは、適切な時点で行うことができますでその後

public event EventHandler DataRecieved; 

これにサブスクライブすることができます:

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

注釈:

1)EventHandlerの代わりにEventHandler<T>という一般名を使用すると、イベントで情報を渡すことができます。 Tは、送信したいデータのクラスです

2)FileOpenは同期してブロックされているため、UIの更新が停止するようです。非同期にするか、少なくとも使用してくださいTask.Run

3)非同期にすると、UIスレッドではないスレッドからUIを更新しようとする問題が発生する可能性があります。 UIの更新をUIスレッドにプッシュするには、Invokeを使用する必要があります(これはWinFormsかWPFかは似ていません)。

+0

ありがとうございます、私はあなたが行きたい場所を正確に指し示していると信じています。また、ファイル処理のおかげで、これは私のリストの次のものでした。 – BinBin

+0

OKこれを一度に1ステップずつ行うことにしました。そのため、複雑なプロジェクト(ファイル処理なし)を作成し、SerialDeviceクラスがUIのイベントを公開するようにしました。次に、Invokeを使用してテキストフィールドを更新し、働く私は馬鹿にされているかもしれませんが、私はファイルを再度処理することに注意しています。私のSerialDeviceクラスは、それを作成したTProcessクラスのDataReceivedイベントをどのようにトリガーしますか?イベントをデイジーチェーンするので、TProcessはSerialDeviceが提供するイベントを購読しますか? – BinBin

関連する問題