GetPixel и потоки

newb86
Дата: 25.06.2009 13:22:05
Пишу программу в которой должны выполняться два потока параллельно, общих переменных для этих двух потоков нету. Один поток проверят цвет пикселя в координате №1, второй поток проверят цвет пикселя в координате №2. Причем выполняться эти действия должны пока не закроешь приложение. Цвет пикселя получаю через GetPixel. Все действия, выполняемые с визуальными компонентами вызываю через метод Synchronize.
Вопрос заключается в следующем:

Требуется ли для функции GetPixel вызывать метод Synchronize? Так как по истечению какого то промежутка времени приложение зависает (кушает ресурсы процессора, но действия никакие не выполняет. Причем приложение можно перемещать)
Соколинский Борис
Дата: 25.06.2009 13:36:24
Для Windows.GetPixel не надо, для Canvas.GetPixel надо (можно просто критическую секцию вставить).
newb86
Дата: 25.06.2009 13:50:23
Соколинский Борис
Для Windows.GetPixel не надо, для Canvas.GetPixel надо (можно просто критическую секцию вставить).


использую функцию
windows.GetPixel

но приложение все равно подвисает :(
Соколинский Борис
Дата: 25.06.2009 13:54:19
Значит на чем-то другом висит. Легко проверить, если вызов GetPixel обернуть критической секцией.
newb86
Дата: 25.06.2009 14:01:04
Соколинский Борис
Значит на чем-то другом висит. Легко проверить, если вызов GetPixel обернуть критической секцией.


Не подскажешь как? И что даст критическая секция?
Соколинский Борис
Дата: 25.06.2009 14:11:09
Как нибудь так.
Var // глобальная переменная
  CrsGetPixel:   TCriticalSection;

function GetPixel(DC: HDC: X,Y: Integer): COLORREF;
begin
  CrsGetPixel.Enter;
  try
    result:=Windows.GetPixel(DC, X, Y);
    if result=CLR_INVALID 
      then RaiseLastOSError;
  Finally
    CrsGetPixel.Leave;
  end;
end;
Не забудь инициализировать CrsGetPixel до первого вызова и убить в конце.
Зайцев Фёдор
Дата: 25.06.2009 14:14:07
Соколинский Борис
Как нибудь так.
Var // глобальная переменная
  CrsGetPixel:   TCriticalSection;

function GetPixel(DC: HDC: X,Y: Integer): COLORREF;
begin
  CrsGetPixel.Enter;
  try
    result:=Windows.GetPixel(DC, X, Y);
    if result=CLR_INVALID 
      then RaiseLastOSError;
  Finally
    CrsGetPixel.Leave;
  end;
end;
Не забудь инициализировать CrsGetPixel до первого вызова и убить в конце.

а что это даст? какой смысл разделять 2 чтения ?
Соколинский Борис
Дата: 25.06.2009 14:16:52
Зайцев Фёдор
а что это даст? какой смысл разделять 2 чтения ?
Даст автору возможность проверить свою гипотезу. А также инструмент для проверки других.
newb86
Дата: 25.06.2009 14:48:42
А вообще есть какой-нибудь инструмент для слежения состояния потоков?
Можно по Alt+Ctrl+T вызвать окно, но там кроме как состяния процессов ничего не пишется Running и Stopped
Petro123
Дата: 25.06.2009 14:58:52
newb86
А вообще есть какой-нибудь инструмент для слежения состояния потоков?
Можно по Alt+Ctrl+T вызвать окно, но там кроме как состяния процессов ничего не пишется Running и Stopped

- на чём может подвисать поток, если он ничего не делает кроме получения цвета точки?
- инструмент есть в ОСи - счётчики в WinXP