前提・実現したいこと
Windows Formアプリケーションを作成しています。
VB6からVB.NETへの変換を行っています。VB6の時に動かしていた状態の機能をそのままでは再現できない為、マルチスレッド化を進めています。
処理をマルチスレッドにて動かす場合の、同一フォームへのメッセージ出力について、出力できずに困っています。
また、VBのマルチスレッドの扱い方についての理解がイマイチ進まない為、ご教授頂きたいと思います。よろしくお願いいたします。
発生している問題・エラーメッセージ
ThreadStateException: 現在のスレッドはシングル スレッド アパートメントでないため、ActiveX コントロール xxxx をインスタンス化できません。
該当のソースコード
MainFrom:メインフォーム
VBNET
1 2Private MyThred As Thread 3 4Private Sub MainFrom_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load 5 6 'スレッドスタート. 7 MyThred = New Thread(AddressOf Thread1) 8 MyThred .IsBackground = True 9 MyThred .Start() 10 11End Sub 12 ・ 13 ・ 14 ・ 15 ・ 16 17'メインスレッド 18Sub Thread1() 19 Do 20 'ErrModOut("xxxx") '<- 元の処理(Moduleへ) 21 ErrMesOut("xxxxx") 22 Loop 23End Sub 24 25'エラー出力用 26Private Sub ErrMesOut(ByRef s As String) 27 ErrDispText.Text = "エラー:" & s 28End Sub
下記がModuleの処理
VBNET
1Module SubMod 2 ・ 3 ・ 4 Sub ErrModOut(ByRef s As String) 5 MainFrom.ErrDispText.Text = "エラー:" & s 6 End Sub 7 ・ 8 ・ 9End Module
試したこと
1)別Moduleからは、Fromにアクセスしない方が良いと考え、Form内にメッセージ出力用のメソッドを用意(現在の状態)※実際にはModuleでは別の処理もある
下記を参考に、自分のフォームに処理を追加
https://www.atmarkit.co.jp/ait/articles/0504/20/news111_2.html
2)エラーメッセージを検索したら、下記MSフォーラムが出てきた。
回避策として、<MTAThread()>を追加すると記載があった。
https://support.microsoft.com/ja-jp/help/841295/you-receive-a-system-threading-threadstateexception-exception-when-you
補足情報(FW/ツールのバージョンなど)
OS:Windows10
開発環境:Visual Studio2017 / .NetFramwerk4.6.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/06 13:04
2020/02/06 14:05
2020/02/06 16:47