1

シリアル ポートが大量のデータを受信して​​おり、データの転送が完了するまでに約 5 秒かかります。C# でプログレス バーを使用したい。

プログレスバーを適用するためのデータ転送の終了をどのように認識できますか?

(データのサイズは一定で明確)

4

2 に答える 2

0

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;
}
于 2013-08-24T18:21:02.107 に答える
0

.net フレームワークのSerialPortクラスを使用すると、簡単にそれを行うことができます。同期転送モードと非同期転送モードの両方をサポートしています。ケースに非同期モードを使用し、DataReceivedイベントを使用して進行状況バーを更新します。単純に (TotalBytesReadTillNow / TotalDataSize) * 100 になります。これを に割り当てprogressbar.valueます。

また、非同期プログラミングでは、非 UI スレッドからコントロールやその他の UI を更新できないことに注意してください。InvokeUI の更新に使用します。

上記のリンクには、良い例が含まれています。

于 2013-08-24T18:21:19.760 に答える