DOBON.NET DOBON.NETプログラミング掲示板過去ログ

スレッド化での初回例外エラー

環境/言語:[WindowsXP VB2008 ]
分類:[.NET]

「'System.InvalidOperationException' の初回例外が System.Windows.Forms.dll で発生しました。」

上記エラーを回避したいのですが、解決策をご教授願います。
マルチスレッド絡みの話だと思うのですが、やはりBackgroundWorkerクラスというのを使うのが、ベストなのでしょうか?


<処理内容>
●frm_Mainをメイン処理とし、XXXアプリのAPIをコールするスレッドを立ち上げます。frm_Mainは、XXXアプリのAPIより情報取得し、画面を更新(進捗)していく。
ちなみに、XXXアプリのAPIをコールしたタイミングでログインウィンドが表示されます。

[frm_Main]

Shared Sub Main()
        ・
        ・
        ・
'スレッドを立ち上げます
Dim t As New System.Threading.Thread( _
New System.Threading.ThreadStart( _
AddressOf frm_Main.XXX_InitialSetting))

'スレッドを開始する
t.Start()

'DoEvent
System.Windows.Forms.Application.DoEvents()

'スリープ100msec
System.Threading.Thread.Sleep(100)

        ・
        ・
        ・
End Sub


//ApplicationManagerの起動を行う//
Public Sub XXXAPI_InitialSetting()

If Not Me.axApplicationMgr.ApplicationWillExitOnStart Then
splashScreen = New SplashScreen ' display splash screen
End If

   axApplicationMgr.Start()
        ・
        ・
        ・
End Sub
2009/07/23(Thu) 23:44:59 編集(投稿者)

■No25040に返信(だいすけさんの記事)
> 「'System.InvalidOperationException' の初回例外が System.Windows.Forms.dll で発生しました。」
>
> 上記エラーを回避したいのですが、解決策をご教授願います。

スレッド側で Form や Control を操作してはいけないということです。
「スレッド InvalidOperationException」で検索してみると、類似の話題が出てくると思います。
ご回答頂きありがとうございます。
よく似たサンプル等から、解決策を見つけました。


■No25043に返信(Azuleanさんの記事)
> 2009/07/23(Thu) 23:44:59 編集(投稿者)
>
> ■No25040に返信(だいすけさんの記事)
>>「'System.InvalidOperationException' の初回例外が System.Windows.Forms.dll で発生しました。」
>>
>>上記エラーを回避したいのですが、解決策をご教授願います。
>
> スレッド側で Form や Control を操作してはいけないということです。
> 「スレッド InvalidOperationException」で検索してみると、類似の話題が出てくると思います。
■No25049に返信(だいすけさんの記事)
> ご回答頂きありがとうございます。
> よく似たサンプル等から、解決策を見つけました。

この掲示板では自己解決されたときでもどのように解決したのかをご報告いただく決まりになっています。どこにあるサンプルから、どのような解決法を見つけられたのか、教えてください。面倒とは思いますが、よろしくお願いいたします。

書き込みのルールについて
http://dobon.net/vb/bbs/index.html
大変失礼しました。
解決策は以下の通りとなりました。

【変更後】
■Delegate Sub InitialSettingDelegate()

■Public Sub worker()
 Invoke(New InitialSettingDelegate(AddressOf XXX_InitialSetting))
 End Sub

■'スレッドを立ち上げます
 Dim t As New System.Threading.Thread( _
 New System.Threading.ThreadStart( _
 AddressOf frm_Main.worker))

上記の3ステップを追加、修正しました。
以前は、直接XXX_InitialSettingをコールしていたのですが、
Invokeを間にかまして、XXX_InitialSettingをコールするように
修正しました。


■No25054に返信(管理人さんの記事)
> ■No25049に返信(だいすけさんの記事)
>>ご回答頂きありがとうございます。
>>よく似たサンプル等から、解決策を見つけました。
>
> この掲示板では自己解決されたときでもどのように解決したのかをご報告いただく決まりになっています。どこにあるサンプルから、どのような解決法を見つけられたのか、教えてください。面倒とは思いますが、よろしくお願いいたします。
>
> 書き込みのルールについて
> http://dobon.net/vb/bbs/index.html

DOBON.NET | プログラミング道 | プログラミング掲示板