スレッド処理で親ダイアログのOwnerがNULLとなる問題の解決策

アリスです。

C++/CLIで「オブジェクト参照がオブジェクト インスタンスに設定されていません。」というエラーがでました。

その原因を調べました。

親ダイアログから、子ダイアログを開く
FormLoading^ fLoading = gcnew FormLoading();
fLoading->ShowDialog(this);

このときShowDialogに渡したthisは親ダイアログ自身を表します。
子ダイアログからはthis->Ownerで取得できる。

しかしながら、下記の条件下ではOwnerがnullでとれてしまいます。

子ダイアログではDoWork関数のWhileループでスレッド処理をさせる。
子ダイアログにはキャンセルボタンを用意し、スレッド処理の途中キャンセル可にする。

その状態で、親ダイアログから子ダイアログを開いて、すぐにキャンセルボタンを押す。

すると、DoWork関数のWhileループ処理中に取得したOwnerがNullとなり、掲題の例外が発生する。

具体的なコードでは(FormMain^)this->Onwerがnullとなる。

原因は不明

対策としては、DoWork関数のWhileループに入る前に
This->Ownerを取得・保持しておき、(この状態では問題なくとれるため)
ループ内ではその保持したものを使用すればとりあえず解決した

スポンサーリンク
関連記事と広告