555 タイマー IC によって生成されたパルスの周波数とパルス幅を計算するプログラムを開発している間、PC パラレル ポート経由で PC に到達します。コードを実行するたびに異なる値が表示されることに気付いたので、ループとタイマーの精度をテストし始めました。次のコードを実行したところ、不正確であることがわかりました (間違っている可能性があります。間違っている場合は訂正してください!)。
タイマーの場合:
int sec = 0;
private void button2_Click(object sender, EventArgs e)
{
sec = DateTime.Now.Second;
i = 0;
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (sec == DateTime.Now.Second)
{
i++;
}
else
{
timer1.Enabled = false;
MessageBox.Show(i.ToString(),"Timer Output");
}
}
出力: 同じはずですが:
ループの場合:
private void button1_Click(object sender, EventArgs e)
{
i = 0;
CheckForIllegalCrossThreadCalls = false;
Thread t1 = new Thread(LoopTest);
t1.Start();
}
void LoopTest()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
this.Cursor = Cursors.WaitCursor;
while (true)
{
if (sw.ElapsedMilliseconds != 1000)
{
i++;
}
else
{
break;
}
}
sw.Stop();
this.Cursor = Cursors.Default;
MessageBox.Show(i.ToString(), "Loop Output");
}
出力: 同じはずですが:
ループとタイマーを正確にするにはどうすればよいですか?それを行う方法はありますか? それとも、ハードで複雑な C コードと DOS に行かなければなりませんか?
この質問で間違った値を取得する基本的な理由だと思います:パラレルポートの入力周波数を数える - C#