私は50ms(シリアル通信用)をLinux(Monoを使用)にポーリングするWindows C#アプリケーションを移植しています。私たちは現在、ZylSimer(by ZylSoft)を使って各間隔で "tick"イベントを生成していますが、このライブラリはpInvoke呼び出しをWindowsマルチメディアライブラリにラップするので、もちろんこれを使うことはできません。Mono高解像度タイマー(Linux版)
//i.e.
timZylComms.Tick += new ZylTimer.TickEventHandler(timZylComms_Tick);
timTimeout.Tick += new ZylTimer.TickEventHandler(timTimeout_Tick);
これは、私がモノの下で使用できる代替品が存在するかどうかを尋ねます。 ティックイベントで「ストップウォッチ」クラス(高解像度でカウントされるクラス)を拡張するのが最善の方法でしょうか?
また、この機能を再現するためにラップすることのできるライブラリがありますか? これを達成する他の方法がありますか?
これに感謝しています。
EDIT: はこれで行くと何か問題があるでしょう:
internal class LinuxHiResTimer{
internal event EventHandler Tick;
private System.Diagnostics.Stopwatch watch;
internal int Interval{ get; set;}
private bool enabled;
internal bool Enabled {
get{ return enabled; }
set {
if (value) {
watch.Start();
Task.Run (tickGenerator);
enabled = value;
} else {
enabled = value;
}
}
}
private async Task tickGenerator(){
while (enabled){
if (watch.ElapsedMilliseconds > Interval) {
watch.Reset();
if (Tick != null)
Tick (this, new EventArgs());
} else {
float fWaitPeriod = (float)(0.8 * (Interval - watch.ElapsedMilliseconds));
if (fWaitPeriod>20)
await Task.Delay(TimeSpan.FromMilliseconds(fWaitPeriod));
}
}
watch.Stop();
}
internal LinuxHiResTimer(){
watch = new Stopwatch();
}
~LinuxHiResTimer(){
watch.Stop();
}
}
これを達成するために、おそらくPOSIXのにclock_gettimeをラップする方法は、()がありますか? – drone
Use System.Diagnostics.Stopwatch http://stackoverflow.com/questions/7736013/cross-platform-high-resolution-tick-counter-on-mono –
@ rytis-i Stopwatchにはtick()メソッドがありません。最良のアプローチは、Tickイベントで "Stopwatch"クラス(高解像度でカウントされる)を拡張することでしょうか? – drone