2009-03-09 8 views
0

PCベースの自動化パッケージにyokogawa WT1600パワーメータ用の通信DLLをインターフェースするためのラッパーDLLの作成に取り組んでいます。私は通信部分を稼働させましたが、自動化パッケージの50msのスキャン時間を維持できるように、通信部分をスレッド化する必要があります。 (拡張機能ブロック(EFB)コールは、返されるまでスキャンをブロックします)子スレッドが終了する前にDLLが復帰しなければならないDLLのスレッド化

これは、実行する必要がある手順です。

  1. コールEFB
  2. EFBは、通信設定を実行するためのスレッドを作成します(約200msのやるべきことを要する)
  3. EFBスレッドが仕事に
    • 3Aをやっている間にEFB_BUSYを返します。 (それはEFB呼び出しに戻ってくるまでの自動化プログラムがスキャンを継続)
  4. スレッドが次に返された場合は、スレッドが
  5. を返した場合、それは
  6. EFBをチェックし、最後の通話中返したことで渡す
  7. コールEFB EFBは成功、そうで返すEFB_BUSY
  8. 繰り返し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のサンプルコードをマイモデルとして使用しました。

答えて

1

作成されたスレッドは、DLL内であろうとなかろうと、自発的に停止しません。特に、スレッドを作成した関数が戻ることがあります。新しいスレッドは、作成者スレッドが終了しても実行されます。つまり、入力関数の最後に達していないと仮定します。

Windowsスレッドは準備ができたらDWORDを返します。覗くには、0秒のタイムアウトでスレッドハンドルのWaitForSingleObjectを呼び出し、成功するとGetExitCodeThreadを呼び出します。

あなたの全体の「EFB」のことを、私は理解できません。通常のWindowsスレッドに面白いことをしている場合、すべてのベットはオフです。

関連する問題