Javaのスレッドの様な動きをさせるには?

解決


Ekasi  2005-01-19 15:45:16  No: 87911  IP: [192.*.*.*]

お世話になります。

あるメソッドAが呼ばれた場合に
そのメソッド自体は、すぐに返り値を返して終了し、
処理自体は、メソッドの終了後も処理を
行い処理の成否をイベントで通知する処理を
VBにて実装しようと考えています。

自分なりに調べたつもりなのですが、
VBは初心者で実装方法がわかりません。

すみませんが、どなたかご教授願います。

編集 削除
じゃんぬねっと  URL  2005-01-19 15:51:18  No: 87912  IP: [192.*.*.*]

VB.NET かそうでないかで回答が大きく変わると思うのですが... (^-^;)

編集 削除
Ekasi  2005-01-19 15:54:19  No: 87913  IP: [192.*.*.*]

すみません。
VB6.0です。

編集 削除
abu  2005-01-19 17:42:47  No: 87914  IP: [192.*.*.*]

残念ながら過去ログのような結果ですが
http://madia.world.coocan.jp/vb/vb_bbs/200109_01090007.html

動きに保証はできないけどとりあえず動くものなら提供可能です

編集 削除
ひろ  2005-01-19 17:58:39  No: 87915  IP: [192.*.*.*]

ActieveX EXE に含まれるクラスのインスタンスを別々のスレッドで動作させることなら可能です。

http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9903/db_solu/

スレッド毎に変数が別々の領域に保持されるので、各スレッドはの動作が干渉しません。ただし、OCx等の外部ライブラリを使う場合は、それがマルチスレッドに対応しているを確認しないといけません。

編集 削除
ひろ  2005-01-20 11:30:02  No: 87916  IP: [192.*.*.*]

普通の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の後にイベントを拾うことが可能な状態にしておきます。

編集 削除
Ekasi  2005-01-20 15:07:38  No: 87917  IP: [192.*.*.*]

回答ありがとうございました。

ひろさん
Timerイベントで実装しようと思います。

アウトプロセスの方法は、わかっていたのですが、
そこまで大げさにしたくなかったので、質問しました。

Timerイベントで実装しようと思います。

編集 削除