タイマーに奇妙な問題があります。私の知る限り、タイマーの interval プロパティは、timer_Tick イベントが発生するループ間の遅延を示します。
Visual Basic でプログラミングする前に、正確な署名 (15 および 16 ミリ秒の遅延) でこの問題が発生しました。私が作成したすべてのタイマーは、15 または 16 ミリ秒の遅延でティック イベントを発生させます。たとえば、タイマーの間隔を 1 に設定した場合 (つまり、ティック イベントが 1 秒間に 1000 回発生する必要があります)、イベントは 1 秒間に 62 回から 66 回発生します (つまり、1000/16 から 1000/15 です)。 )。
私は 5 年前から VB アプリケーションを開発しており、常にこの問題を抱えていました (つまり、AMD と Intel の両方のプロセッサを搭載したいくつかの異なるシステムでこの問題が発生したことも意味します)。
TickCount メソッド (VB の GetTickCount API と C# の Environment.TickCount) に基づいて tick イベントが発生するたびに時間差を計算することで、回避策を実行してこの問題を解決することができました。
*TickCount は、時間システムが開始されてから経過したミリ秒数です。
問題をよりよく理解するために、(タイマーのように) 実行されてからの秒数をカウントする Windows アプリケーションを作成しました。Tick イベントが発生するたびに、TickCount と通常の加算の両方に依存します。また、TickCount の現在の値から TickCount の最後の値を差し引いて、タイマーの遅延を計算します (タイマーが 1 秒間に 1000 回起動された場合、TickCount の差は毎回 1 になるため、つまり、遅延はありませんが、差が 1 を超える場合は、タイマーの tick イベントが発生するたびに遅延が生じます)。
コードは次のとおりです。
public partial class Form1 : Form
{
int localTime = 0, systemTime = 0, baseSystemTime = 0, lastSystemTime = 0;
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
// Calculate time based on TickCount
if (baseSystemTime == 0)
baseSystemTime = Environment.TickCount;
systemTime = Environment.TickCount - baseSystemTime;
label2.Text ="System Time: " + ((systemTime / 1000) / 60).ToString() + ":" + ((systemTime / 1000) % 60).ToString();
// Calculate time based on timer1_Tick
localTime++;
label1.Text = "Application Time: " + ((localTime / 1000) / 60).ToString() + ":" + ((localTime / 1000) % 60).ToString();
// Calculate the delay
if (lastSystemTime > 0)
{
label3.Text = "Delay: " + (Environment.TickCount - lastSystemTime).ToString() + " ms";
}
lastSystemTime = Environment.TickCount;
}
}
また、ソリューション全体をここにアップロードしました: http://ramt.in/test/TimerDelay.zip
これはアプリケーションのスクリーンショットです (15 ミリ秒の遅延と、実際には 17 秒が経過している間にアプリケーションによって 1 秒がカウントされます!):
ソリューションは 50kb しかないので、自由にダウンロードして実行し、私と同じ結果が得られるかどうかを確認してください。同じなら、Microsoft ワールドのタイマー クラスに問題があります。
しかし、もっと重要なことは、この遅延の原因について何か知っている人がいる場合は、その知識を私と共有してください.