16

元々C++でMFCを使用して作成されていた古いメトロノームアプリケーションを、C#を使用して.NETで作成するように再構築しようとしています。私が直面している問題の1つは、タイマーを十分に正確に「チェック」することです。

たとえば、120の簡単なBPM(1分あたりのビート数)を想定すると、タイマーは0.5秒(または500ミリ秒)ごとにチェックする必要があります。ただし、これをティックの基礎として使用することは完全に正確ではありません。.NETは、経過時間が経過する前にタイマーがティックしないことを保証するだけだからです。

現在、上記で使用したのと同じ120 BPMの例でこれを回避するために、ティックを100ミリ秒のようなものに設定し、5番目のタイマーティックごとにクリック音のみを再生しています。これは精度をかなり向上させますが、ちょっとしたハックのように感じる場合。

それで、正確なダニを取得するための最良の方法は何ですか?Visual Studioですぐに利用できるWindowsフォームタイマーよりも多くのタイマーが利用できることは知っていますが、私はそれらにあまり詳しくありません。

4

6 に答える 6

11

.NETには「タイマー」と呼ばれる3つのタイマークラスがあります。Windowsフォームを使用しているように見えますが、実際にはSystem.Threading.Timerクラスの方が便利な場合がありますが、プールスレッドを呼び出すため、フォームを直接操作することはできませんので注意してください。コールバック。

別のアプローチは、Win32マルチメディアタイマー(timeGetTime、timeSetPeriodなど)をp/invokeすることです。

簡単なグーグルがこれを見つけました。これは役に立つかもしれませんhttp://www.codeproject.com/KB/miscctrl/lescsmultimediatimer.aspx

「マルチメディア」(タイマー)は、このコンテキストで検索する流行語です。

于 2008-08-12T12:34:43.443 に答える
1

C++ アプリケーションは何を使用していますか? 常に同じものを使用するか、タイマー コードを C++ から C++/CLI クラスにラップすることができます。

于 2008-08-12T13:17:49.410 に答える
1

最近のデータロギングプロジェクトを開発しているときに、この問題が発生しました。.NET タイマー ( windows.forms、system.threading、および system.timer ) の問題は、.NET に組み込まれているイベント スケジューリングが原因で、約 10 ミリ秒までしか正確ではないことです。(ここでは .NET 2 について話している)。これは私には受け入れられなかったため、マルチメディア タイマーを使用する必要がありました (dll をインポートする必要があります)。また、すべてのタイマーのラッパー クラスを作成したので、必要に応じて最小限のコード変更でそれらを切り替えることができます。ここで私のブログ投稿をチェックしてください: http://www.indigo79.net/archives/27

于 2011-02-11T10:09:44.037 に答える
0

タイマー クラスは、次の「ティック」が発生するまでにタイマー「ティック」イベント コードの実行が終了しないと、奇妙な動作を開始する可能性があります。これに対処する 1 つの方法は、ティック イベントの開始時にタイマーを無効にし、最後に再度有効にすることです。

ただし、このアプローチは、「ティック」コードの実行時間がティックのタイミングで許容できないエラーである場合には適していません。これは、その間タイマーが無効になる (カウントしない) ためです。

タイマーを無効にするオプションがある場合は、実行、x ミリ秒のスリープ、実行、スリープなどを行う別のスレッドを作成することによって、同じ効果を達成することもできます。

于 2008-08-12T14:09:28.523 に答える
0

System.Windows.Forms.Timer精度は 55 ミリ秒に制限されています...

于 2010-10-04T03:30:24.467 に答える