はじめまして。
VB6.0で、マルチスレッドを実現させたく、質問させて頂きました。
.netならともかく、VB6.0では実現が困難である事は承知しています。
ActiveX EXEを使用すれば出来るみたいなのですが、うまく出来ません。
説明の為、やりたい事を一部置き換えて記述します。
1.標準EXEのフォームとして、コマンドボタン1と2を用意する。
2.コマンドボタン1を押すと、ActiveX EXE側(フォームを持たない)の
処理を呼び、ActiveX EXE側で重い処理をする。
(処理が終われば、ActiveX EXE側から標準EXE側へ、イベントを発生させ、
フォームの色を変えるなどの処理を行いたい。)
3.その重い処理中、標準EXEのフォームで、コマンドボタン2を押したり
などの処理をしたい。
テスト的に"重い処理"としてSleepを入れています。
ですが、実際に実行してみると、どうやっても重い処理が終わるまで
標準EXE側のフォームが待ち状態となってしまいます。
待ち状態にはせず、
並行して処理を行いたいのですが、何か良い方法はありませんでしょうか?
並行して処理が可能であれば、ActiveX EXEにはこだわりません。
宜しくお願い致します。
非同期処理としたいのであれば、ActiveX として公開されたメソッド内で、
(Sleep などの)長い処理を行ってはいけません。
その間、呼び出し側がブロックされてしまいますので。
こういう時は、『処理開始メソッド』と『処理完了通知イベント』とに分離し、
処理開始メソッドでは「Timer1.Enabled = True」を行い、すぐに Exit Sub と
することで、呼び出し側に直ちに処理を返すようにします。
そして実際の処理は、Sub Timer1_Timer で行うようにして、最後に、
処理完了のイベントを呼び出すようにします。
(Timer を使わない方法もありますが、考え方は同じ)
具体例の幾つかは、MSDN Library ディスク付属のサンプルに収録されています。
MSDN Library の「キーワード」および「検索」で『Coffee2.vbp』について
調べてみてください。
重い処理が、どの様な種類の処理かわからないと、
アドバイスは難しいのでは。
>テスト的に"重い処理"としてSleepを入れています。
Sleepは単に処理を止めるだけで、重い処理では有りません。
魔界の仮面弁士様
ありがとうございます。
Timerを使い、実現できるか試してみたいと思います。
サンプルなど、ご丁寧にありがとうございます。
我龍院様
説明上、悪い例を取り上げ申し訳ありません。
実際には、例で"重い処理"とした個所で、Cで作成したDLLを呼び、
その中でサーバからのデータ受信を行います。データ受信後、
結果を標準EXE側へ通知します。
ご返信、有難うございます。
また、結果をご報告させて頂きます。
どの様なDLLを使用しているかにもよりますが、DLLの場合処理が
終了しないうちに一時的に呼び出し側に処理を移すことは
難しいと思います。
Cで作成したDLLを呼び出しデーターを受信するプログラムを
非表示の別プログラムにしておいて、メインからキックし
データー受信後の結果をメインに返すようにしたらいかがですか。
ツイート | ![]() |