2011-12-26 2 views
0

Исходя из этого article:Является ли код Execute Thread Safe?

Я использую этот код, чтобы сделать анимацию на заданную оконную ручку, делая какую-то работу на моей базе данных:

while not Terminated do 
begin 
// some code.... 

// draw onto the Window DC 
DC := GetDC(FWnd); // FWnd is the Window Handle 
// DC := GetDCEx(FWnd, 0, DCX_VALIDATE or DCX_LOCKWINDOWUPDATE); 
if DC <> 0 then 
    try 
    BitBlt(DC, 
     FPaintRect.Left, 
     FPaintRect.Top, 
     ImageRect.Right, 
     ImageRect.Bottom, 
     Bitmap.Canvas.handle, 
     0, 0, 
     SRCCOPY); 
    finally 
    ReleaseDC(FWnd, DC); 
    end; 

    // more code.... 

end; // end while 

ли это поточно, или я должен каким-то образом Заблокируйте ОКРУГ КОЛУМБИЯ?

Кроме того, могу ли я использовать GetDCEx? Спасибо.

+0

Windows есть резьба сходство. Этот код должен запускаться в потоке пользовательского интерфейса. –

ответ

2

Нет, ваш код не является потокобезопасным, если в главном (GUI) потоке создается дескриптор окна (FWnd). Стандартным подходом VCL является вызов всех функций GDI в потоке GUI через Synchronize или Queue методов класса TThread.

+0

Как реализовать 'Синхронизировать' внутри моего TThread? мне нужно переместить все локальные переменные в 'Execute' метод в частный раздел моего TThread, написать метод, например' SyncPaintWindow', и использовать Synchronize (SyncPaintWindow)? – kobik

+0

@kobik - да, точно; альтернативой перемещению локальных переменных в 'TThread' является использование' Syncronize' с анонимным методом (доступно с Delphi 2009) – kludg

+0

Я понимаю часть о рисовании на ручке окна. но, чтобы быть ясным: если я использую локальную переменную «Bitmap: TBitmap;», а затем создаю ее внутри моего метода Execute, то нарисуйте что-нибудь на ней, это тоже не потокобезопасно? – kobik