2017-06-23 2 views
0

この質問は、私がシリアルポートを通じて何かを受け取ったときに私のプログラムのインターフェイスで変更を行うことを許可しない理由についてです。VB.NETを使用してスレッドを操作する

私は下級エンジニアです。私の仕事では、シニアプログラマの一人が、マイクロソフトがシリアルポートからの収入に関する情報を含む新しいスレッドを開いたときに、私はBeginInvoke(...)関数を使って新しいスレッドを作成する必要があります。

私が持っているのは、コンソールボタンがペーシングされているインターフェイスです。コンソールボタンを押すと、リッチテキストボックスが開きます。私のプログラムは、RichtextBoxで印刷する必要のあるシリアルポートのテキストから受信できますが、何も表示されませんでした。

私の質問は、自分で作成したスレッドを使用してシリアルポート経由で何かを受け取ったとき、私がrichtextboxで印刷することを許可しないのはなぜですか?なぜ私はそれを行うために新しいスレッドを作成する必要があるのか​​分かりません。マイクロソフトではこれに具体的な理由を挙げていますか?

私はあなたが私を理解できることを願っています、それはheheを説明するのはちょっと難しいです。

ありがとうございます!

+0

コードをお知らせください。 –

答えて

1

新しいスレッドを作成する必要はありません。必要なスレッドはすべて既に存在しています。実際に何が起こっている

SerialPortがセカンダリスレッドへのDataReceivedイベントを発生させながら、すべてのUI要素は、UIスレッドによって所有されていることです。 COMポートからデータを受信して​​UIをフリーズさせたくないので、これは完璧な意味を持ちます。 UIの変更はUIスレッドでのみ行うことができるため、DataReceivedイベントハンドラから直接変更することはできません。これを行うには、UIスレッドへのメソッド呼び出しをマーシャリングする必要があります。一度知ってしまえばそれはとても簡単です。

あなたは新しいスレッドを作成していません。既存のスレッドでデータを受け取り、別の既存のスレッドで使用しています。

+0

メソッド呼び出しをマーシャリングしますか?申し訳ありません.. =(私は調査しようとします。そして、私はBeginInvoke(..)を使って何をしていますか?UIスレッドを作成するのですか?どのような目的のために?この質問に申し訳ありません.. hehe ..私はそれを理解しようとしています –

+0

いいえ、私は何度も明確に述べたように、UIスレッドは既に存在します。デリゲートはメソッドを参照するオブジェクトであり、 'BeginInvoke'はそのオブジェクトをスレッドの境界を越えて運び、参照するメソッドを実行するUIスレッドで呼び出します。http: //www.vbforums.com/showthread.php?498387-Accessing-Controls-from-Worker-Threads – jmcilhinney

+0

素晴らしい情報ありがとうございました!ご支援いただきありがとうございます。今私はこれがどういう仕組みでより明確になっていますか? –

関連する問題