1

アプリケーションの要求に応答する必要がある dll を作成しています。アプリケーションの要件の 1 つは、呼び出しの完了に時間がかからないようにすることです。

たとえば、ホスト アプリケーションによって呼び出される関数 foo() があるとします。

int foo(arg){
    // some code i need to execute, say,
    LengthyRoutine();
    return 0;
}

たとえば、foo は、確実に長い時間がかかるタスクを実行する (または関数を呼び出す) 必要があります。アプリケーションでは、待機変数を設定できます。foo が戻ったときにこの変数が 0 でない場合、wait が 0 を返すまで (各呼び出しの前に wait 変数をリセットして) 何度も foo を呼び出します。

これに対する最善のアプローチは何ですか?

行きますか:

int foo(arg){

    if (inRoutine == TRUE) {
        wait = 1;
        return 0;
    } else {
        if (doRoutine == TRUE) {
             LengthyRoutine();
             return 0;
        }
    }

    return 0;
}

これは、LengyRoutine が完了するまでに長い時間がかかるという問題を実際には解決しません。タスクが完了したかどうかに応じて inRoutine を更新するスレッドを生成する必要がありますか?

ありがとう..

4

3 に答える 3

7

別のスレッドを生成することは、それを行うための最良の方法です。競合状態を回避するために、終了したことを示す変数を設定する前に、必ず結果変数を設定してください。これが頻繁に呼び出される場合は、事前にワーカー スレッドを生成して再利用し、スレッド開始のオーバーヘッドを回避することをお勧めします。

関数が呼び出されるたびに作業の一部を行う別の解決策がありますが、これは DLL でより多くの時間を費やし、おそらく最適ではありません。また、ほとんどのアルゴのワーカー コードを実装するのがより複雑になります。

于 2009-03-18T06:29:50.813 に答える
1

C プログラミングの場合は、コールバックを使用します。コールバックを foo に渡します。コールバック シグネチャに同意し、LengyRoutine での作業が完了したときにそれをトリガーするためにいくつかのハウスキーピングを行う必要があります。

typedef (void) callbackFunction(void);

int foo(arg, callbackFunction)
{
   // some code i need to execute, say,
   // register callback and return right away
   // Trigger the LengthyRoutine to run after this function returns

   return 0;
}

LengthyRoutine()
{
   // do lenghty routine

   // now inform the caller with their suppiled callback
   callbackFunction();
}

基本的に C のオブザーバーパターン

于 2009-03-18T19:45:43.087 に答える
0

LengthyRoutine()サードパーティのコードではなく、すべてのソースがあり、それを分割できるという信じられないほどまれな状況の場合は、コルーチンの使用を検討できます。

于 2009-03-18T07:23:04.213 に答える