シリアル ポートが大量のデータを受信しており、データの転送が完了するまでに約 5 秒かかります。C# でプログレス バーを使用したい。
プログレスバーを適用するためのデータ転送の終了をどのように認識できますか?
(データのサイズは一定で明確)
シリアル ポートが大量のデータを受信しており、データの転送が完了するまでに約 5 秒かかります。C# でプログレス バーを使用したい。
プログレスバーを適用するためのデータ転送の終了をどのように認識できますか?
(データのサイズは一定で明確)
System.IO.SerialPort
クラスを使用していると思いますか?「はい」の場合、SerialPort
クラスにはDataReceived
イベントがあります。
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx
シリアルポート経由でデータを受信するたびに起動します。ここで、5 バイトを受信する必要があることがわかっているとします。データの受信を開始する前に、プログレス バーの最大値を 5 に設定します。
progressBar1.Maximum = 5;
次に、データを受信したら、受信したデータの量で進行状況バーを増やします。
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
int BytesReceivedCount = sp.BytesToRead;
if(InvokeRequired)
{
Invoke((Action)(() =>
{
progressBar1.Value += BytesReceivedCount;
}));
}
else
progressBar1.Value += BytesReceivedCount;
}
.net フレームワークのSerialPortクラスを使用すると、簡単にそれを行うことができます。同期転送モードと非同期転送モードの両方をサポートしています。ケースに非同期モードを使用し、DataReceived
イベントを使用して進行状況バーを更新します。単純に (TotalBytesReadTillNow / TotalDataSize) * 100 になります。これを に割り当てprogressbar.value
ます。
また、非同期プログラミングでは、非 UI スレッドからコントロールやその他の UI を更新できないことに注意してください。Invoke
UI の更新に使用します。
上記のリンクには、良い例が含まれています。