スレッド処理で親ダイアログの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を取得・保持しておき、(この状態では問題なくとれるため)
ループ内ではその保持したものを使用すればとりあえず解決した

 

 

タイトルとURLをコピーしました