我一直在研究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
}
* //更新GUI,但是如何使用您的視圖也可以訂閱的事件。但是它看起來像你對文件的處理是阻塞的(很難用你的代碼片段來說明),所以你可能也想做出這種異步。 –
請編輯您的問題並設置您的代碼的格式,以便可讀 –
@sowjanyaattaluri:存在事件,因此您不必這樣做。 –