2010-12-13 9 views
4

私は、USBベースのデータ収集C#dotnet実行可能ファイルを呼び出すpythonスクリプトを持っています。メインのpythonスクリプトは他の多くのことを行います。ステッピングモーターを制御します。この目的のために、dotnet exeは、C#Stopwatch.GetTimestamp()のタイムスタンプを使用してログを生成します。これは、わかっている限り、win32 API QueryPerformanceCounter()の呼び出しと同じ数値を返します。python on win32:絶対タイミング/ CPUサイクルカウントを取得する方法

今、私はpythonスクリプトから同様の数字を取得したいと思います。 time.clock()はそのような値を返しますが、残念ながらtime.clock()の最初の呼び出し時に得られた値を減算します。どうすればこの問題を回避できますか?既存のPythonモジュールからQueryPerformanceCounter()を呼び出すのは簡単か、Cで独自のPython拡張を記述する必要がありますか?私が言及するのを忘れてしまった

、ティム・ゴールデンにより、pythonのWMIモジュールは、この行います wmi.WMI()Win32_PerfRawData_PerfOS_System()[0] .Timestamp_PerfTime が、それは、いくつかの48msのオーバーヘッドが遅すぎます。 < = 1msのオーバーヘッドが必要です。 time.clock()はc#Stopwatch.GetTimestamp()と同様に十分に速いようです。

TIA、 Radim

答えて

8

ctypesを試しましたか?

+1

うまく機能していますが、約0.5ms離れたところで(WMIで48msと比較して)読み出しが可能です。ありがとう、リュック。 –

+0

ここに、WindowsのPythonのmicros()、millis()、delay()、およびdelayMicroseconds()関数の上記の拡張があります:http://stackoverflow.com/questions/38319606/how-to-get-millisecond -and-microsecond-resolution-timestamp-in-pythonです。 PythonでQueryPerformanceCounterにアクセスする構文を提供してくれてありがとう@luc! –

+0

@luc、あなたは 'val = c_int64()'の代わりに 'val = c_uint64()'を使うべきですか? –

0

あなただけできなかったのPythonから直接C#StopWatchクラスを呼び出すことができますか?小さなラッパーが必要かもしれません(Python/C#interopの詳細を知らない - 申し訳ありません) - データ取得にC#を既に使用している場合、Stopwatchでタイミングを同じにすることは、他の方法より簡単です。

関連する問題