PCベースの自動化パッケージにyokogawa WT1600パワーメータ用の通信DLLをインターフェースするためのラッパーDLLの作成に取り組んでいます。私は通信部分を稼働させましたが、自動化パッケージの50msのスキャン時間を維持できるように、通信部分をスレッド化する必要があります。 (拡張機能ブロック(EFB)コールは、返されるまでスキャンをブロックします)子スレッドが終了する前にDLLが復帰しなければならないDLLのスレッド化
これは、実行する必要がある手順です。
- コールEFB
- EFBは、通信設定を実行するためのスレッドを作成します(約200msのやるべきことを要する)
- EFBスレッドが仕事に
- 3Aをやっている間にEFB_BUSYを返します。 (それはEFB呼び出しに戻ってくるまでの自動化プログラムがスキャンを継続)
スレッドが次に返された場合は、スレッドが
- を返した場合、それは
- EFBをチェックし、最後の通話中返したことで渡す
- コールEFB EFBは成功、そうで返すEFB_BUSY
- 繰り返し3A-6を返しEFBは成功
を返すまで、だから私の問題は、私はそれを呼び出した関数の寿命を超えて存在しているスレッドを作成するにはどうすればよい、とは? DLLにコールバックすると、スレッドの戻り値はどのように取得されますか?
EDIT#1
HeavyFunction::HeavyFunction^ hf; //HeavyFunction is a class that has a time consuming function in it
ThreadStart^ efbThreadDelegate;
Thread^ efbThread;
if(pEfbData->nBlockingRecall != DOEFB_BUSY) {
hf = gcnew HeavyFunction::HeavyFunction;
hf->iiStart = (int)(pEfbData->uParams[0].dw);
hf->iiEnd = (int)(pEfbData->uParams[1].dw);
efbThreadDelegate = gcnew ThreadStart(hf, &HeavyFunction::HeavyFunction::iGetPrime);
efbThread = gcnew Thread(efbThreadDelegate);
efbThread->Start();
return DOEFB_BUSY;
}else if (efbThread->IsAlive) {
return DOEFB_BUSY;
}else {
uRetValue->dw = hf->iReturn;
return 0;
}
ウィルefbThreadはまだ後続の呼び出し時に同じスレッドハンドルを持っていますか?
EDIT#2
私はそれがミューテックスやスレッドのグローバルハンドルを作成することで動作するようになりました。 initエントリポイントでmutexを初期化する(dllの読み込み時に実行される)。dllに実際に呼び出しが行われたときにmain関数にスレッドを作成する。
MSDN: Creating Threadsのサンプルコードをマイモデルとして使用しました。