Visual Studio 2010でC#とWinformsを使用しています
シリアルポートを介して出力を読み取り、画面に出力しようとしているプログラムがあります。当初はコンソールプログラムとして開始されましたが、現在はフォームのフィールドに出力を配置したい場所に進化しています。シリアルポートから探している出力を解析して記述し、機能させるコードがあります。基本的に、Console.WriteLineをlabel.text="";に変更する必要があります。シリアルポートをリッスンする関数をGUIコードにマージして、すべてが同じファイルに含まれるようにしました。
ただし、関数をラベルに書き込む方法に夢中になっています。STATICなので、「label.text=」とだけ言うことはできません。使用する関数内に新しいフォームオブジェクトを作成しようとしましたが、フォームのコントロールにアクセスできましたが、実行時に表示されるフォームは更新されません(フォームの新しいインスタンスを作成したためだと思います)既存のインスタンスにアクセスするのではなく?)
シリアルリスナーをGUIと同時に実行する必要があるため、GUIラベルは、関数をほぼリアルタイムで実行した結果で更新されるため、スレッド化するように設定しようとしました。 、GUIはmain()によって開始される1つのスレッドであり、シリアルリスナーはボタンをクリックして開始したときに開始される別のスレッドです。ただし、system.threadingを使用して初期化するには静的である必要があるため、シリアルリスナースレッドのラベルにアクセスできないという同じ問題が発生します。
シリアルリスナーにバックグラウンドワーカーを使用する必要があるかもしれないと思っていますが、それらの経験はまったくありません。バックグラウンドワーカーはGUIのラベルをリアルタイムで更新できますか?
特定のコードを投稿することはできませんが、一般的な考え方は次のとおりです。
Main()がGUIthreadを開始します
GUIにはシリアルリスナーを開始するボタンがありますOnClickボタンはListenerThreadを開始しますListenerThreadはコンソールに出力しますが、代わりにフォームラベルに出力します
リスナーはスレッド化する必要があるため静的であるため、GUI.Labelにアクセスできません。リスナー内に新しいGUIインスタンスを作成すると、そのインスタンスのコントロールを呼び出すことができますが、実行時にGUIを更新しません。
ラベルが公開されていることを確認しました。