私は、テキストファイルからコマンドやデータを取得し、このファイルの内容に基づいてシリアルを介してさらなるデータを送信または要求する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
}
* // GUIを更新しますか?*あなたのビューも購読可能なイベントを使用してください。しかし、ファイルの処理がブロックされているように見えます(実際にはコードのスニペットでは分かりません)ので、非同期にしたいと思うかもしれません。 –
あなたの質問を編集し、あなたのコードを読みやすいようにフォーマットしてください。 –
@sowjanyaattaluri:イベントは存在するので、そんなことをする必要はありません。 –