APIのCreateThread関数の引数にVBで作成した関数のアドレスを渡してスレッドを作成したのですが、スレッドを終了するときやアプリを終了するときに異常終了する時があります。
スレッドの中ではかなりの処理をしています(Do-Loopで)。多分、スレッドを終了するタイミングかなと予想しているんですけど。完全に終わる前にCloseHandleしているとか、そういう問題だと思うのですが。(フラグとか使っているのですがあまりうまくないようで)
いいタイミングで終わらせるにはどのようにしたらいいのでしょうか?
それとも違う問題なのでしょうか?
どうかよろしくお願いします。
スレッドフリーではない言語で
スレッドを扱うことが問題なのでは?
ごもっともな意見だと思います。
私自身もそう思っています。
ですがVBで実現させないと意味がないのです。
C++ではあっさり出来たんですけどね。
でもVBでは(特に6)不可とあったのですが、きっとこういう掲示板には知っている人がいると思って載せました。
よろしくお願いします。
確認しますが、VB5なんですよね?
確かにVB6では無理という話はよく聞きますが。
こころはVB5なんですが、スレッドを使ってやった経験があるので
その時使った手法を一応、記載してみます。
これが、最善ではないでしょうが、参考までに。
生成したスレッド側で処理が終わると、
GetExitCodeThread,ExitThreadを呼び出して終了する。
元のスレッドではWaitForSingleObjectを使用して
生成したスレッドの終了を確認してから
CloseHandleを呼び出す。
ってな処理をやると、とりあえず
強制終了もおきずに動作してます。
当然、EXE形式での話なのでコンパイルは必須でしょうが。
VB6なんです。
スレッドであんまり重い処理をするとダメなんでしょうか?
例えば、スレッドが起動中にアプリを終了する場合は、Form_QueryUnloadイベントにはどんな記述をすればいいんでしょうか?
ExitThread関数を使うとその瞬間VBも終了してしまうし、WaitForSingleObject関数の引数を0以外にすると、VBが固まってしまし、非常にハマっています・・・。
マルチスレッドはVB6では無理だった気がします。
別の方法を考えた方がいいでしょう。
重い処理とかは別に関係ないとは思いますけど。
> スレッドが起動中にアプリを終了する場合は
そのスレッドに終了を通知して、
WaitForSingleObject等で終了を待ってから呼び出し側を
終了させてあげればいいんでしょうが、
VB6では正しい処理をやっても正常には動かないと思います。