4

イベント処理関数 を作成しています。この関数f(d)はデータを受け取り、アクションを実行し、100 ミリ秒スリープしてから別のアクションをd実行する必要があります。私はそれを次のように実装します:X(d)Y(d)

void f(d)
{
  X(d);
  Sleep(100);
  Y(d);
}

ただし、f(d)シングル スレッドのイベント ハンドラーから呼び出されるため、Sleep(100) は受け入れられません。

私は次のことをしたいと思います:

void f(d)
{
  X(d);
  ScheduleOneShotTimer(Y,d,100);
}

ScheduleOneShotTimer呼び出しごとに新しいスレッドを作成し、データをスレッド パラメーターとして渡し、Sleep実行前に呼び出すことで実装できますY(d)。ただし、このイベントは 1 秒あたり最大 100 回発生する可能性があるため、これらすべてのスレッドを破棄するためのオーバーヘッドが懸念されます。

できればオペレーティング システム レベルで「ワンショット タイマー」をサポートする必要がありますが、CE ではそうではないと思います。SetTimer については知っていますが、メッセージ ループのない「コンソール アプリケーション」を書いているので、それは私には当てはまりません。

これをどのように構成するかについての他の提案をいただければ幸いです。

4

2 に答える 2

6

API を呼び出しtimeSetEventます (完全に直観的ではない API 名だと思います)。コールバック関数とTIME_ONESHOTパラメーターを使用します。

于 2012-12-17T02:26:53.520 に答える
0

タイムスタンプとコールバックのペアのキューを保持する 1 つのスレッドを作成し、100 ミリ秒 (またはそれより短い時間) スリープしてから、経過したすべてのコールバックを実行します。すべてのスレッド間同期 (クリティカル セクションでのインターロックなど) を備えた OFC。

これは、精度を重視したソリューションではなく、パフォーマンスを重視したソリューションです。コールバックが積み重なると、実行に正確に 100 ミリ秒以上かかる場合があります。しかし、Wait で時間を測定しているので (これは正確ではありません)、それで十分だと思います。

于 2012-12-16T17:32:43.253 に答える