쓰레드란걸 해보려합니다.
사용자 메시지를 받으면, 쓰레드를 하나 만들어서
거기서 해당 메시지에 따라 처리하고, 메시지 또 오면 쓰레드하나 만들어서 처리하고,,,
이런식으로 만들려고 합니다.
그런데, 쓰레드 생성할때, 각각의 메시지에 대해 처리하려면 메시지값을
전달해 주어야 할 것 같은데 어떻게 넘겨주어야 하는지 모르겠더여..ㅜ.ㅡ
고수님들의 조언을 ...부탁드립니다..
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs
;
type
TForm1 = class(TForm)
procedure WMMyMessage(var smsg: TMessage); message WM_USER+1000;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
function MyThread(P:Pointer):LongInt;StdCall;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMMyMessage(var smsg: TMessage);
var
hThread : THandle;
ThreadID : DWORD;
begin
hThread := CreateThread(nil,0,@MyThread, sMsg , 0 ,ThreadID); <<======요기요
if hThread = 0 then
Application.MessageBox('스레드를 생성하는 데 실패했습니다.','확인',0);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
self.Left := -400;
self.Top := -400;
end;
function TForm1.MyThread(P:Pointer):LongInt;StdCall
var
smsg: TMessage;
begin
case sMsg.Msg of
WM_USER+1000: ShowMessage('genuine');
else
ShowMessage('babo');
end;
Application.Terminate;
end;
end.
거기서 님이 질문하신 거에 대한 참고를 할 수 있습니다.
Demo디렉토리안에 ThrdDemo를 보세요.
요기 보면 일단 클레스,상속,생성자 등등의 개념을 잡을 수 있을듯...^^
일단 예제를 먼저 보시구여.
여기선
procedure TThreadSortForm.StartBtnClick(Sender: TObject);
begin
RandomizeArrays;
ThreadsRunning := 3;
with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do
OnTerminate := ThreadDone;
with TSelectionSort.Create(SelectionSortBox, SelectionSortArray) do
OnTerminate := ThreadDone;
with TQuickSort.Create(QuickSortBox, QuickSortArray) do
OnTerminate := ThreadDone;
StartBtn.Enabled := False;
end;
버튼 클릭과 함께 쓰레드를 생성시킵니다. 보면 뒤에 뭔가를 보내주져
이제 쓰레드를 보면
TSortThread = class(TThread)
private
FBox: TPaintBox;
FSortArray: PSortArray;
FSize: Integer;
FA, FB, FI, FJ: Integer;
procedure DoVisualSwap;
protected
procedure Execute; override;
procedure VisualSwap(A, B, I, J: Integer);
procedure Sort(var A: array of Integer); virtual; abstract;
public
constructor Create(Box: TPaintBox; var SortArray: array of Integer);
end;
{ TBubbleSort }
TBubbleSort = class(TSortThread)
protected
procedure Sort(var A: array of Integer); override;
end;
{ TSelectionSort }
TSelectionSort = class(TSortThread)
protected
procedure Sort(var A: array of Integer); override;
end;
{ TQuickSort }
TQuickSort = class(TSortThread)
protected
procedure Sort(var A: array of Integer); override;
end;
TSortThread를 TBubbleSort ,TSelectionSort ,TQuickSort 가 상속을 받았습니다.
그럼 상속받은 요놈들은 생성자를 보면 여튼 Create라고 하니깐 제가 생성자라고
하지만 확실히 정확한 표현인지는 모르겠습니다. 저두 잘...헤헤헤.
constructor TSortThread.Create(Box: TPaintBox; var SortArray: array of Integer);
begin
FBox := Box;
FSortArray := @SortArray;
FSize := High(SortArray) - Low(SortArray) + 1;
FreeOnTerminate := True;
inherited Create(False);
end;
선언에 보시면 Public으로 선언되었으니깐 각각 상속받은 놈들은 요놈을 실행시키겠져?
그리고 inherited Create(False);는 inherited니깐 선조클래스의 메소드를 호출하져.
왜 이런 절차를 거치는지는 고수님들한테 물어보고 싶군여. 앗 여기서두 질문을...
고수님들 부탁합니다.
자 그러면 쓰레드로 값 넘기는건 이해하셨져? 그럼 이만....