2009-04-07 12 views
0

非常に長い時間処理するVB6アプリケーションがあります。それを直接殺すことは実現可能ではないので、私はVB6アプリケーションで何らかのフラグを設定したいと思います。私のC#アプリケーションで私はそれをシャットダウンすることを決めた場合、私はシャットダウンが要求されたことをVB6アプリケーションに知らせるために、このフラグを切り替えるしたいと思います。さて、私はVB6のいくつかのアプリケーションがアクティブなexeとしてスピンアップされるので、名前が付けられたものも必要です。誰もこれのようなものを実装する方法を知っていますか?ワークフローは以下に従いますvb6アプリケーションのC#killイベントを作成しますか?

C#アプリ - 別のスレッドで複数VB6をアクティブにしています.exexをアプリに初期化します(これはフラグと呼ばれます)。C#で変更することができ、非常に長いDoStuffコマンドを呼び出します返す時間。

VB6 - フラグ付きの初期化コマンドを取得します。 DoStuffが呼び出されます。 DoStuffループでは、フラグがまだ設定されているかどうかを確認します。

C#の - 別の状態に

のフラグを設定することにより、任意のアイデアをプロジェクトを殺しますか?

+0

VB6のアプリケーションコードを変更できますか? –

+0

はいできます。助けてくれてありがとう – Steve

答えて

1

ActiveXオブジェクトを作成するときに、アプリケーションまたはスレッドに格納されている参照を保持します。 COMはスレッド間のマーシャリングを処理します。手元にある参照を使用すると、その上でメソッドを呼び出してそれを強制終了することができます。スレッド内で参照を保持する場合は、.NETのプロセス間メッセージングメカニズムを使用して、ActiveX EXEでkillフラグを設定する.NETスレッドに渡す必要があります。

+0

VB6アプリは残念なことに(シングルスレッド以来)ブロックされているので、計算を中止する必要があることを通知する方法が必要です – Steve

+0

.NETでActive EXesを生成していると思った糸? –

+0

私は彼がビジー状態なので、VB6アプリケーションがActiveXコールを処理しないことを意味すると思います。彼はオブジェクトへの参照をC#からVB6に渡すことができ、その後、VB6がそのオブジェクトを定期的にポーリングしてシャットダウンするかどうかを確認する準備ができます。 – MarkJ

0

私はプロセスの境界を越えて参照を開いたままにしませんが、プロセスのLong hWndをcertianlyキャッシュし、.Netからkillを呼び出すことができます。

8

ここには、VB6クライアントとVB6サーバーでの非同期バックグラウンド処理のためのかなり標準的な構成があります。 (例えば、Dan ApplemanのbookとMicrosoftのVB6 samplesです)私はC#クライアントでもうまくいくはずだと思います。

  • VB6 ActiveX EXEオブジェクトは、イベントCheckQuitDoStuff()を公開する必要があります。これは、Quitと呼ばれるByRef Booleanをとります。
  • クライアントはActiveX EXEオブジェクトのStartDoStuffを呼び出します。このルーチンは、隠されたフォームでタイマーを開始し、はすぐにを返します。これにより、呼び出し元のスレッドのブロックが解除されます。タイマーの間隔は非常に短く、タイマーのイベントはすばやく発生します。
  • TimerイベントハンドラはTimerを無効にしてから、ActiveXオブジェクトDoStuffメソッドを呼び出します。これにより、長い処理が開始されます。
  • DoStuffメソッドは定期的にCheckQuitDoStuffイベントを発生させます。クライアントのイベントハンドラは、特別なフラグをチェックし、中止する必要がある場合はQuit Trueを設定します。その後、DoStuffは計算を打ち切り、QuitがTrueの場合に早期に戻ります。

このスキームは、「DoStuff」が発生している間は呼び出しスレッドがブロックされないため、実際にはクライアントがマルチスレッドである必要はないことを意味します。難しい部分は、DoStuffが適切な間隔でイベントを発生させることを確実にしていることです。余りにも短く、DoStuffを不必要に減速させたいときには、終了できません。また、DoStuffが終了すると、隠しフォームをアンロードする必要があります。

DoStuffが実際にすべての処理を中断してから終了する場合、別のイベントを発生させて、ジョブが終了したことをクライアントに伝えることができます。

+2

+1。これは、VB6でマルチスレッド化を実現する最も簡単な方法であり、うまく機能します。また、Win32スレッドをVB6コードから直接実行しようとする方法やプログラムのIDEが不安定になることもありません。 –

+0

IDEではサポートされていないため、デバッグが難しくなります:) – bjan

+0

2つのIDEを使用する必要がありますが、デバッグすることはできます。 VB6 IDEでVB6 ActiveX EXEプロジェクトを起動し、クライアントが接続するまで待ちます。その後、IDEでC#プロジェクトを開始します。 – MarkJ

関連する問題