기존 그리기 함수를 Thread에서 불러서 사용했는데. 잘 그려지지 않습니다.
Thread에서 그리기 함수 호출은 정상 적으로 되구요. 그려질때도 있느데 한번 안그려지면 계속 안그려지더라구요..
Project Test.Exe raised exeption class EOutOfResources with Message '핸들이 잘못되었습니다.'
Process stopped. Use Step or Run to continue.
그리고 Paint Event를 계속 발생 시키면 이런 에러도 뜨구요. (화면 위에서 Dialog Box를 계속 움직이면..)
Thread에서는 그리기를 할수 없나요?,,,
Thread 소스 입니다.
<!--CodeS-->
unit uDrawThread;
interface
uses
Windows, Classes, SysUtils, SyncObjs;
type
TDrawThread = class(TThread)
private
{ Private declarations }
public
procedure CreateEvent;
constructor Create;
destructor Destroy; override;
procedure Execute; override;
end;
var
fThread : TDrawThread;
CS : TRTLCriticalSection;
entDraw : TEvent;
bThreadFlag : Boolean = False;
implementation
uses
uView;
constructor TDrawThread.Create;
begin
inherited Create(false);
bThreadFlag := true;
FreeOnTerminate := True;
Priority := tpIdle ;
end;
destructor TDrawThread.Destroy;
begin
inherited;
DeleteCriticalSection(CS);
entDraw.Free;
end;
procedure TDrawThread.CreateEvent;
begin
InitializeCriticalSection(CS);
entDraw := TEvent.Create(nil, false, false, 'test');
end;
procedure TDrawThread.Execute;
begin
while not Terminated do
begin
EnterCriticalSection(CS);
sleep(1);
if entDraw.WaitFor(INFINITE) = wrSignaled then begin
fView.DrawDesign; // 그리기 함수 호출
entDraw.ResetEvent;
end;
LeaveCriticalSection(CS);
end;
end;
end.
<!--CodeE-->
이틀 동아 미치겠네요.. -.-;
좋은답변 부탁드립니다.
그럼.. ~~~
CriticalSection만으로 해결이 안되구요
TThread에 정의된 Synchronize함수를 이용해야 합니다.
다음과 같이 바꾸면 될듯 합니다.
// 이 procedure를 class정의부(Type)에 추가합니다.
procedure TDrawThread.DoDraw;
begin
fView.DrawDesign; // 그리기 함수 호출
end;
procedure TDrawThread.Execute;
begin
while not Terminated do
begin
if entDraw.WaitFor(INFINITE) = wrSignaled then begin
Synchronize(DoDraw); // TObject를 상속받은 instance에 뭔가를 수정/실행할때...
entDraw.ResetEvent;
end;
end;
end;
도움이 되셨길 바랍니다.