0

ボタンをクリックするだけで PC のシリアル ポートを介してマイクロに命令を送信するアプリケーションがあります。その後、マイクロは、データ受信イベント ハンドラーを起動するデータをストリーム バックします。これは文字列に取り込まれます。

この時点で、文字列のデータを使用して、リストビュー ボックスに入力したいと考えています。私はまだデータ受信スレッドにいるので、invoke、delegate を使用してこれを行うことができます。

スレッドが終了した後にこれを行うためにイベント ハンドラーまたは単純なルーチンを呼び出す方法はありますか? ボタンによってトリガーされた場合、ルーチンの構築は正常に機能しますが、タスクを完了するためにプログラムで呼び出したいと思います。

それが十分に明確であることを願っています、それは私の最初の投稿です。

編集:ここにいくつかのサンプルコードがあります -

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

    //use 28591 or("ISO-8859-1") to cover all hex bytes from 0 - 255
    serialPort1.Encoding = Encoding.GetEncoding(28591);

    //wait for download to complete by monitoring cts line
    if (HoldData == true)
    {
        while (serialPort1.CtsHolding == true) ;
        HoldData = false;
    }

    else
        Thread.Sleep(50);

    string text = serialPort1.ReadExisting();

    switch (text[0])
    {
        case '?': MemLabelUpdate(); break;
        case '>': WriteConfig(text); break;
        case '=': SealTest(text); break;
        case '<': CurrentNumber(text); break;

        default: DataDownload(text); break;

    }
}

文字列テキストの最初のバイトは、入ってきたものに関する識別子です。これは、データ受信スレッド内での実行時に、invoke delegate メソッドを使用して、メイン フォームにラベルを設定する関数を呼び出します。ダウンロード データ関数への既定の呼び出しでは、テキストが渡され、イベントの塊であるため、テキストが並べ替えられます。結果は、リストビュー ボックスの関連する列に渡されます。インボーク デリゲート メソッドの使用を避けたいと考えています。これを行うには port_datareceived スレッドを終了する必要があり、終了時に関数に入って、以下のようにリストを更新するだけです。この種のイベントをプログラムでトリガーするにはどうすればよいですか。

private void btnDisplayData_Click(object sender, EventArgs e)
{
    int SectionStart = 10;
    int SectionEnd = 8;
    listView1.Items.Clear();
    listView1.View = View.Details;
    listView1.GridLines = true;

    //Add columns to listview
    listView1.Columns.Add("Event", 80, HorizontalAlignment.Center);
    listView1.Columns.Add("Time", 80, HorizontalAlignment.Center);
    listView1.Columns.Add("Date", 80, HorizontalAlignment.Center);

    //Print results to listview box
    ListViewItem ListItem;
    for (int i = 0; i < 10; i++)
    {
        ListItem = listView1.Items.Add(DownloadedData.Substring(SectionStart,     SectionEnd));
        SectionStart += 8;
        ListItem.SubItems.Add(DownloadedData.Substring(SectionStart, SectionEnd));
        SectionStart += 8;
        ListItem.SubItems.Add(DownloadedData.Substring(SectionStart, SectionEnd));
        SectionStart += 8;
    }

    foreach (ColumnHeader column in listView1.Columns)
    {
        column.Width = -2;
    }

}
4

2 に答える 2