###前提・実現したいこと
C#のStopWatchクラスを使って正確な時間を計測したい。
###発生している問題・エラーメッセージ
ペンタブレットの軌跡情報と一緒に時間も取りたくてStopWatchクラスを使用しました。
実行は出来るのですが、取得している時間が正しくありません。
1秒以上動作させても数ミリ秒程度しか出力されません。
実際に手動で時間を計測したところ2秒のものが4ミリ秒ほどになってしまっています。
以下は実行結果の一部です。カンマ区切りの一番左が時間です。
00:00:00.0000167,455,427,0
00:00:00.0004014,454,452,0
00:00:00.0004126,455,450,0
00:00:00.0004457,456,447,0
00:00:00.0004694,457,444,0
00:00:00.0005223,458,439,0
###該当のソースコード
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Interop;
using WintabNET;
namespace WpfWintabSample
{
/// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window {
//StopWacth呼び出し System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); //roop外でoldpress宣言 int oldpress = 0; // ウインドウプロシージャ private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == (int)EWintabEventMessage.WT_PACKET) { WintabPacket packet = WintabManager.GetPacket(lParam, (UInt32)wParam.ToInt32()); sw.Start();//StopWatch(再)スタート if (packet.pkNormalPressure.pkAbsolutePressure == 0) { Point screenPoint = PointToScreen(new Point(0, 0)); int x = (int)(packet.pkX - screenPoint.X); int y = (int)(packet.pkY - screenPoint.Y); //int t = sw.Elapsed; int p = (int)packet.pkNormalPressure.pkAbsolutePressure; sw.Stop();//StopWatchストップ if (x != (int)m_Point.X && y != (int)m_Point.Y /*&& oldpress == p*/) { //時間、座標、筆圧の書き出し(ペンUP) Console.WriteLine("{0},{1},{2},{3}\n", sw.Elapsed, x, y, p); //screenText.Text += + sw.Elapsed + ","+ x + "," + y + "," + p + "\n"; //あとでtを追加 } //位置保存 m_Point.X = x; m_Point.Y = y; } else { Point screenPoint = PointToScreen(new Point(0, 0)); int x = (int)(packet.pkX - screenPoint.X); int y = (int)(packet.pkY - screenPoint.Y); int p = (int)packet.pkNormalPressure.pkAbsolutePressure; sw.Stop();//StopWatchストップ if (m_Point.X == -1) { m_Point.X = x; m_Point.Y = y; } else { if (x == (int)m_Point.X && y == (int)m_Point.Y && oldpress == p) { //線の追加 addPath((int)m_Point.X, (int)m_Point.Y, x, y, (int)packet.pkNormalPressure.pkAbsolutePressure); // 位置の保存 m_Point.X = x; m_Point.Y = y; oldpress = p; } else { //時間、座標、筆圧の書き出し(ペンDOWN) Console.WriteLine("{0},{1},{2},{3}\n", sw.Elapsed, x, y, p); //screenText.Text += + sw.Elapsed + ","+ x + "," + y + "," + p + "\n";//あとでtを追加 //線の追加 addPath((int)m_Point.X, (int)m_Point.Y, x, y, (int)packet.pkNormalPressure.pkAbsolutePressure); // 位置の保存 m_Point.X = x; m_Point.Y = y; oldpress = p; } } } } return IntPtr.Zero; } // 線をCanvasに追加する private void addPath(int x, int y, int x2, int y2, int pressure) { Line l = new Line(); // 始点と終点の設定 l.X1 = x; l.Y1 = y; l.X2 = x2; l.Y2 = y2; // 線のスタイル設定 l.Stroke = Brushes.Black; l.StrokeStartLineCap = PenLineCap.Round; // 線の太さは筆圧によって変更する l.StrokeThickness = (double)pressure / (double)m_MaxPressure * 10.0; // Canvasへ線を追加 screenCanvas.Children.Add(l); } }
}
###試したこと
sw.ElapsedMillisecondsでミリ秒単位だけ取得しようとしましたが、
3秒以上実行しても6ミリ秒程しか進みません。
###補足情報(言語/FW/ツール等のバージョンなど)
僕のプログラムではなくネットの
WDN技術者(http://blog.wdnet.jp/tech/archives/156)さんのサンプルコードの
addpathというメソッドに直接書き込んでいます。
回答3件
あなたの回答
tips
プレビュー