1

1msより短い時間でビットを切り替えたい。これは C# Windows Forms で行うことをお勧めしますが、たとえば C++、C# のコンソール アプリで行うこともできます。私がしたいのは、ビットを切り替えてLPTポート経由で送信することです。

このコードのビットの切り替えは遅くなります..

PortAccess.Output(888,1);
Thread.Sleep(1);
PortAccess.Output(888,0);
Thread.Sleep(1);

この投稿を読みました: QueryPerformanceCounter の使用方法? 、しかしそれはタイマーだけです..

助けてください :)

4

3 に答える 3

3

C#/.NET 環境でこの種のきめの細かいタイミング制御を行うための簡単で明確な方法はありません。クラスを使用しStopwatchて近づくことはできますが、解像度はリアルタイムの作業には適していません。タイマーを使用してこのようなことを行うには-ナンセンスコードですが、経過時間が目的の間隔になるまでループします。

Stopwatch swatch = new Stopwatch();

while(true)
{
    swatch.Reset();
    swatch.Start();
    PortAccess.Output(888, 1);
    while (swatch.ElapsedMilliseconds < 1) { }

    swatch.Stop();
    swatch.Reset();
    swatch.Start();
    PortAccess.Output(888, 0);
    while (swatch.ElapsedMilliseconds < 1) { }
    swatch.Stop();
}

Sleepどこでもタイミングに使用しないでください。 Sleep基本的に、「少なくともXミリ秒間スリープする」とだけ言っています。したがってSleep(1)、25ms スリープする可能性があります。

ところで、パラレル ポートを備えた PC はほとんどありません。これは古い - いいえ、PC の外部でビットを書き込んだり、出力を反転したりするための最も古い方法です。PC の IO ポートに直接出力して行うのも本当にゴミです。適切なドライバーを備えた外部デジタル IO デバイス/ボード/インターフェイスを探すことができます - はるかに良いアイデアです。

于 2011-07-14T08:05:57.590 に答える
1

Sleep()まず、 にはそれほど細かい解像度がないことに注意する必要があります。通常は約 20 ミリ秒の解像度であるため、呼び出しは必要以上に長く待機します。

第二に、リアルタイムの保証を提供していない Windows のようなシステムでは、スレッドを存続させたとしても (Spinwait()たとえば、使用して)、ミリ秒ごとに実際に何かを実行できることに依存することはできません。スレッドは、通常のタスク切り替えプロセスで OS によって中断される可能性があり、中断されるため、最大数ミリ秒間、アクティビティがない期間が発生します。

要するに、それを試さないでください。効果がないでしょう。

于 2011-07-14T08:10:06.917 に答える
1

ルセロとキーレンのことを念頭に置いて、私はあなたの質問に答えます。

ストップウォッチを使用して、1 ティック == 1/10,000 ミリ秒のティックを使用してサブミリ秒の精度を得ることができます。たとえば、ここでは 1/10 ミリ秒待機します。

    Stopwatch sw = Stopwatch.StartNew();
    while (sw.ElapsedTicks <1000);
    Debug.Print(sw.ElapsedTicks.ToString());

ストップウォッチを使用するシステムのニーズに合わせて、ストップウォッチの周波数が十分に高いことを確認する必要があります。また、ここではドライバー レベルではないことを覚えておいてください。したがって、これでリアルタイムの保証に近づくものは何もありません。

于 2011-07-14T08:19:15.933 に答える