お世話になります。
あるメソッドAが呼ばれた場合に
そのメソッド自体は、すぐに返り値を返して終了し、
処理自体は、メソッドの終了後も処理を
行い処理の成否をイベントで通知する処理を
VBにて実装しようと考えています。
自分なりに調べたつもりなのですが、
VBは初心者で実装方法がわかりません。
すみませんが、どなたかご教授願います。
VB.NET かそうでないかで回答が大きく変わると思うのですが... (^-^;)
編集 削除すみません。
VB6.0です。
残念ながら過去ログのような結果ですが
http://madia.world.coocan.jp/vb/vb_bbs/200109_01090007.html
動きに保証はできないけどとりあえず動くものなら提供可能です
ActieveX EXE に含まれるクラスのインスタンスを別々のスレッドで動作させることなら可能です。
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9903/db_solu/
スレッド毎に変数が別々の領域に保持されるので、各スレッドはの動作が干渉しません。ただし、OCx等の外部ライブラリを使う場合は、それがマルチスレッドに対応しているを確認しないといけません。
普通のEXEで強引に実装するならこんな感じかな。
タイマ割り込みで疑似タスクスイッチをします。
用意する物
・タイマーコントロール Timer1
・タイマイベント2重実行禁止フラグ TimerFlag
・処理状態管理変数 methodBusy As Boolean
・メソッドの内部状態を保持するレコード methodVarRec
・実際の処理の状況を表す変数 execStatus
Public Function startRequest(適当な引数) As Integer
If metohdBusy Then
startRequest = 実行中なので実行拒否したことを示すエラーコード
ElseIf 引数が不適切 Then
startRequest = 引数が不適切なことを示すエラーコード
Else
methodBusy = True
execStatus = 適当な初期値
metohdVarRecに引数の内容を格納
TimerFlag = False
Timer1.InterVal = 適当な値
Timer1.Enabled = True
startRequest = 実行開始したことを示す返り値
End If
End Function
Private Sub Timer1_Timer()
If TimerFlag Then Exit Sub
Timer1.Enabled=False
TimerFlag = True
call TaskMain
If methodBusy Then
'まだやるべき事が残っているのでタイマーを再度有効にする。
TimerFlag = False
Timer1.Enabled = True
Else
'処理終了
イベントを投げる
'タイマーは止めたままにする
End If
End Sub
Private Sub TaskMain
If methodBusy Then
'execStatusの値に応じた処理を行う。
'処理は最小限の処理時間で終えるようにし、続きに何をするべきかは
'execStatusにセットし、途中の状態はmetohdVarRecに保存する。
'やるべき事を全て終えたら methodBusy を Falseにする
End If
End Sub
呼び出し側では startRequestの後にイベントを拾うことが可能な状態にしておきます。
回答ありがとうございました。
ひろさん
Timerイベントで実装しようと思います。
アウトプロセスの方法は、わかっていたのですが、
そこまで大げさにしたくなかったので、質問しました。
Timerイベントで実装しようと思います。