前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/13 02:54