Q&A

  • 뮤텍스 사용시 델파이에서 CreateThread에 대한 ...
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure WMLBUTTONDOWN(var Message : TMessage);Message WM_LBUTTONDOWN;
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }

    ThreadID : DWORD;
    hThread : THandle;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  hMutex : THandle;
  buf : array[0..100] of integer;
implementation



{$R *.dfm}
function ThreadFunc(Temp : Pointer): DWORD ;stdcall;
var
   i : integer;
begin
   WaitForSingleObject(hMutex,INFINITE);
   FOR i := 0 to 100 do begin
        Sleep(30);
        buf[i] := i;
        if i = 30 then ReleaseMutex(hMutex);
   end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     hMutex := CreateMutex(nil,False,nil);

end;

procedure TForm1.WMLBUTTONDOWN(var Message: TMessage);
var
   j : integer;
begin
    InvalidateRect(Form1.Handle,nil,True);
    UpdateWindow(Form1.Handle);

    hThread := CreateThread(nil,0,@ThreadFunc,nil,0,ThreadId);
    Sleep(10);
    WaitForSingleObject(hMutex,INFINITE);
    for  j := 0 to 30 do begin
      
        Canvas.TextOut(10,j*20,Format('%D Line is %d',[j,buf[j]]));
    end;
    ReleaseMutex(hMutex);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    CloseHandle(hMutex);
end;

end.

백그라운드 뮤텍스인데요..
100까지 다 계산해서 보여 주는 것이 아니라 30까지 계산이 되면 화면에 뿌려줍니다..
잘 작동하는데요..

한가지 질문이 있습니다..
델파이에서는 직접 CreateThread를 사용해서 작성했는데요..
쓰레드를 보호하기 위해서 뮤텍스를 사용했구요..

델파이에서 이렇게 해도 됩니까?
꼭  synchronize사용안해도 됩니까?

위 소스에서 델파이에 적합하지 안는 것이 있나요.. 꼭 답변 부탁합니다..

4  COMMENTS
  • Profile
    꿈의대화 2003.03.05 20:41
    .
  • Profile
    김해우 2003.03.05 21:41
    그럼 델파이에서 비주얼 컴포넌트를 멀티 쓰레드로 할 경우에는 반드시(?)

    synchronize를 사용해야 한다는 거군요..

  • Profile
    박용규 2003.03.06 01:10

    반드시 그렇지는 않습니다.
    예를 들어 , 데이터를 발생 순서대로 처리해야 할경우는 다르죠.
    동시다발적으로 처리하는 것은 sync method 를 통해 처리해야 하는게
    마땅하지만, 그렇지 않은 경우도 있다는 말이죠.
    (추가로, 만약 순서대로 처리 해야 할 경우라면, 접근속도가 훨씬 빠른
      critical section 으로 처리하는것도 고려 해 볼만 하지 않을까요?)
  • Profile
    몽상 2003.03.06 01:42
    크리티컬 섹션과 뮤텍스 ,세마포어, 이벤트로 전부 다시 만들어 보았는데요

    역시 속도는 크리티컬 섹션이든 군요..

    Synchronize를 언제 사용하는가에 대한 것이 궁금했는데..

    충분히 이해했습니다.

    감사합니다.. (-.-)(_._)