私は、指定された位置(winapiのGetPixelを使用)で非常に短い時間(50ms)色をチェックする機能を持っています。 今私は50ミリ秒ごとにその関数を呼び出すためにフォーム上のタイマーを使用しますが、私のアプリケーションは地獄のようにフリーズします。スレッド上のCheckPixelColor
ユーザーインターフェイスをフリーズしないように、それ自体を無限に繰り返す別のスレッドではどうすればよいですか?
私は、指定された位置(winapiのGetPixelを使用)で非常に短い時間(50ms)色をチェックする機能を持っています。 今私は50ミリ秒ごとにその関数を呼び出すためにフォーム上のタイマーを使用しますが、私のアプリケーションは地獄のようにフリーズします。スレッド上のCheckPixelColor
ユーザーインターフェイスをフリーズしないように、それ自体を無限に繰り返す別のスレッドではどうすればよいですか?
UIはSTAスレッドなので、作成したスレッドと異なるスレッドからはアクセスできません。または、 "Control.Invoke
"を使用することもできますが、この場合はメッセージループで実行されるため、遅延が発生すると思います。
スレッドキャノンを引き出す前にperf問題に取り組むことをお勧めします。 50ミリ秒は長い時間です。このサンプルコードは、最適化されていなくても、対話に影響を及ぼさなかったり、CPUの負荷にブリップをした:
Random rand = new Random();
private void timer1_Tick(object sender, EventArgs e) {
using (var bmp = new Bitmap(1, 1)) {
using (var gr = Graphics.FromImage(bmp)) {
gr.CopyFromScreen(rand.Next(800), rand.Next(600), 0, 0, new Size(1, 1));
Console.WriteLine(bmp.GetPixel(0, 0).ToString());
}
}
}
は、バックグラウンドワーカーを使用し、)(backgroundworker.runasync呼び出すためにタイマーを使用し;. http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx