2011-01-20 2 views
1

У меня есть функция, которая проверяет цвет в определенных положениях (используя GetPixel от winapi) в течение очень короткого периода времени (50 мс). Прямо сейчас я использую таймер в форме для вызова этой функции каждые 50 мс, но мое приложение зависает, как ад.CheckPixelColor on thread

Как сделать это в отдельном потоке, который повторяется до бесконечности, чтобы он не затормозил интерфейс пользователя?

ответ

0

Поскольку пользовательский интерфейс является потоком STA, вы не можете получить к нему доступ из темы, отличной от той, которая ее создала. Или вы можете использовать «Control.Invoke», но в этом случае он работает на петлях сообщения, поэтому я думаю, что вы также испытаете некоторую задержку.

4

Я бы посоветовал решить проблему с перфомансом, прежде чем вынести нить канона. 50 миллисекунд - это долгое время. Этот пример кода не оказывает никакого влияния на интерактивности, ни сделал всплеск от нагрузки центрального процессора, даже если он не оптимизирован:

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()); 
      } 
     } 
    }