0

バックグラウンド:

組み込みシステム ソリューション用の高解像度タイマーが必要なので、The Code Project のMicroTimerを使用することにしました...

ところで、私はWindows フォームアプリケーションを開発して、そのようなアプリケーションでの効率をテストし、「クロススレッド操作...」を回避するために、呼び出しメソッド、BackgroundWorker などを使用する必要があり、次のコードを使用することにしました。

private void btnMicorTimer_Click(object sender, EventArgs e)
{
    // Instantiate new MicroTimer
    MicroLibrary.MicroTimer microTimer = new MicroLibrary.MicroTimer();
    // Add event handler
    microTimer.MicroTimerElapsed +=
        new MicroLibrary.MicroTimer.MicroTimerElapsedEventHandler(OnTimedEvent);

    // Call micro timer every 1000µs (1ms)
    microTimer.Interval = 1000;

    // Can choose to ignore event if late by Xµs (by default will try to catch up)
    // microTimer.IgnoreEventIfLateBy = 500;

    microTimer.Enabled = true; // Start timer

    // Do something whilst events are happening. For demo sleep, 2000 ms (2 sec).
    System.Threading.Thread.Sleep(2000);

    microTimer.Enabled = false; // Stop timer
}

private void OnTimedEvent(object sender,
                          MicroLibrary.MicroTimerEventArgs timerEventArgs)
{
    string response = string.Format(
                    "Count = {0:#,0}  Timer = {1:#,0} µs | " +
                    "LateBy = {2:#,0} µs | ExecutionTime = {3:#,0} µs",
                    timerEventArgs.TimerCount, timerEventArgs.ElapsedMicroseconds,
                    timerEventArgs.TimerLateBy, timerEventArgs.CallbackFunctionExecutionTime);

    // Do something small that takes significantly less time than Interval
    if (listBox1.InvokeRequired)
    {
        Invoke(new MethodInvoker(
            delegate
            {
                listBox1.Items.Add(response);
            }));
    }
    else
        listBox1.Items.Add(response);
}

問題:

前に述べたように、アプリケーションはボタンが押された直後に停止しています! 簡単に言うと、これは btnMicorTimer_Click の後に起こることです :( プロジェクトが無限ループに陥っているように見えます。

4

1 に答える 1

0

表示されるピークは簡単に説明できます。

リストボックスに項目を追加して、ミリ秒ごとに UI の更新を要求しています。

これにより、UI の応答が大幅に遅くなります。

于 2012-07-04T07:25:02.363 に答える