const
CM_THREADMSG = WM_APP + 8000;
. . . . . . . .
protected
procedure CMTHREADMSG(var Message: TMessage); Message CM_THREADMSG;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// WORD WINAPI ThreadFunc( LPVOID );
function ThreadFunc(pMyParm : Pointer): DWORD; stdcall;
var
i : Integer;
begin
if Assigned(pMyParm) then begin
Form1.Edit1.Text := IntToStr(PInteger(pMyParm)^); -> 받은 핸들값이랑 아래 디버깅용에서 찍은게 변해여..
end;
Form1.ListBox1.Clear;
Form1.ProgressBar1.Position := 0;
Form1.ProgressBar1.Max := 2000;
i := 0;
while i <= 2000 do begin
i := i + 1;
Form1.ListBox1.Items.Add(IntToStr(i) );
Form1.ProgressBar1.Position := i;
Form1.ListBox1.ItemIndex := i;
end;
Form1.Edit1.Text := IntToStr(PInteger(pMyParm)^); // 디버깅용 ( 여기서 찍어보면 쓰레드 2-3개 생성시킬때는 핸들값이 지맘대로 들어오다가 그 후론 또 제대로 들어오는데..? 뭘 모르고 있나요..??
PostMessage(PInteger(pMyParm)^, CM_THREADMSG, 0, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hThread, hMyForm : THandle;
ThreadId : DWORD;
begin
hMyForm := Form1.Handle;
Edit3.Text := IntToStr(hMyForm);
hThread := CreateThread(nil,0,@ThreadFunc,@hMyForm,0,hreadId);
Sleep(10);
if hThread = 0 then
ShowMessage('Thread 생성실패');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ThreadFunc(nil);
end;
procedure TForm1.CMTHREADMSG(var Message: TMessage);
begin
Edit2.Text := '메세지받음';
Edit2.Color := clYellow;
inherited;
end;
end.
제가보기에는 좀 문제가 있어 보이는군요.
핸들값이 일정치 않게 바뀐다고 하셨는데요.
제가 보기에는 당연한듯 싶습니다.
문제는 핸들값을 로컬 변수에 복사해서 로컬변수의 포인터를 넘기는데 있다고 생각합니다.
어차피 로컬변수의 허용범위는 그 함수내부이기 때문에 해당 로컬변수의 포인터가 Thread가 생성될 때까지 남아있으리라는 보장은 없습니다.
즉, Thread가 생성될 때 이미 로컬변수는 Scope가 다 되어서 그 포인터에는 의미없는 쓰레기 값이 들어가 있을 가능성이 높다는것이죠.
차라리 Heap에 메모리를 잡아서 그곳에 Handle값을 넣은 다음에 Heap의 Pointer를 넘겨준 후에 Thread에서 delete하는 것이 낳지 않을까 싶습니다.
도움이 되시길...