Q&A

  • (질문)쓰레드로 값 넘기기....


쓰레드란걸 해보려합니다.



사용자 메시지를 받으면, 쓰레드를 하나 만들어서

거기서 해당 메시지에 따라 처리하고, 메시지 또 오면 쓰레드하나 만들어서 처리하고,,,



이런식으로 만들려고 합니다.



그런데, 쓰레드 생성할때, 각각의 메시지에 대해 처리하려면 메시지값을

전달해 주어야 할 것 같은데 어떻게 넘겨주어야 하는지 모르겠더여..ㅜ.ㅡ



고수님들의 조언을 ...부탁드립니다..







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.



2  COMMENTS
  • Profile
    델초야~ 2001.10.16 18:44
    저두 초보지만 제가 어제 델파이 예제를 하나 봤거든여.

    거기서 님이 질문하신 거에 대한 참고를 할 수 있습니다.

    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니깐 선조클래스의 메소드를 호출하져.



    왜 이런 절차를 거치는지는 고수님들한테 물어보고 싶군여. 앗 여기서두 질문을...

    고수님들 부탁합니다.



    자 그러면 쓰레드로 값 넘기는건 이해하셨져? 그럼 이만....



  • Profile
    동급최강바보 2001.10.16 12:06
    TThread를 상속받아서 Thread를 사용하시길 바랍니다.

    굳이 API를 쓰지않아도 TThread를 사용한다면 굳이 어려울것이 없다고 생각하는데.