質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

7253閲覧

Visual Studio C#のSerialPort処理でInvokeメソッドを使用するとエラーが発生して困っています。

meshkit

総合スコア72

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/02/09 08:21

前提・実現したいこと

Visual Studio C#のSerialPort処理でInvokeメソッドを使用するとエラーが発生して困っています。

複数のフォームを遷移するプロジェクトでUSB(RS232C)接続処理を行っております。
MainForm->MenuForm(A, B, C, etc.)->OperationFormという構成です。
SerialPort処理をするのは、MainFormのみです。

発生している問題・エラーメッセージ

(1)MainForm->OnAButtonClickでAformに遷移するときに、単に遷移し、そのあとMainFormに戻ってきて
SerialPort処理でInvokeメソッドを使用するとエラーが発生しました。
InvalidOperationExceptionが発生し、「ウィンドウ ハンドルが作成される前、コントロールで Invoke または BeginInvoke を呼び出せません。」とエラーメッセージを表示します。

そこで、下記のようにCloseしてnullにしました。

C#

1 private void OnAButtonClick(object sender, EventArgs e) 2 { 3 SerialPortBarcodeReader.Close(); 4 SerialPortBarcodeReader = null; 5 6 //遷移 7 FormA formA=new FormA(); 8 formA.Show(); 9 }

(2)receiveThread.Join()で無限ループ。
Close()の処理は下記のとおりです。
テストすると、receiveThread.Join();の行でエラーになりました。catchもせず、どこかへ行ってしまいます。

C#

1 public void Close() 2 { 3 if (receiveThread != null && myPort != null) 4 { 5 myPort.Close(); 6 try 7 { 8 receiveThread.Join(); 9 } 10 catch (Exception exception) 11 { 12 string error = exception.Message; 13 } 14 } 15 }

(3)そこでとりあえず、
//receiveThread.Join();
をコメントアウトしました。

質問です。
Q1)receiveThread.Join();はそもそもなにか?
このソースは、某社のハードウェアのサンプルコードで、自分で書いていないので、いまいちぴんときません。
receiveThreadの出てくる箇所は下記のとおりです。

C#

1 private Thread receiveThread = null; 2 3 public void Start() 4 { 5 myPort = new SerialPort( 6 PortName, BaudRate, Parity, DataBits, StopBits); 7 myPort.Open(); 8 receiveThread = new Thread(SerialPortProcessor.ReceiveWork); 9 receiveThread.Start(this); 10 }

Q2)receiveThread.Join();をコメントアウトしてよいのか?
Q3)もっとよい解決方法はないか?

どなたか、原因・対処方法がわかる方がいらっしゃいましたら、御手数をおかけいたしますが、ご教示の程、よろしくお願い申し上げます。

補足情報(FW/ツールのバージョンなど)

Visual Studio Pro 2015

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Q1)
Thread.Join
スレッドが終了するまで待ちます
Q2)
本来はCloseしたらスレッドが終了すべきなのでコメントアウトでは
根本的な解決になっていません
Q3)
[C#] SerialPort クラスによる、仮想 COM ポート アクセス
サンプルはこれですよね?
特に問題ありません。使用している側のコードが間違っている可能性が高いので
エラーが出るサンプルを提示してください。

投稿2018/02/09 09:06

sh_akira

総合スコア380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meshkit

2018/02/13 02:54

ありがとうございます。Q2)のとおりより本質ということで、Formを遷移するので、Main(MainFormでなく)で処理するようにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問