Q&A

  • 스레드에서 Sleep()가 사용되는 이유를 알고 싶습니다


CreateThread() 함수로 MyThread1(스레드1)을 생성시킨 다음,

수행될 부분의 함수를 정의하는 부분입니다.



의문사항1.

다음과 같이 스레드에서 수행될 작업을 정하는 부분에서요,

Sleep(2)처럼 스레드 수행을 2ms동안 일지중지 시켰는데

그 이유를 알고 싶습니다.



의문사항2.

책 앞의 예제에서는 Result값을 정해주는 부분을 생략했었는데,

여기 크리티컬 섹션부분에서는 Result 값을 정해주었습니다.

앞의 예제처럼 Result값을 특별히 정해주지 않아도 되는지,

이 부분(Result:= 0;)을 생략하고 넘어가도 되는지

알고 싶습니다.





//스레드1에서 수행될 작업내용



function MyThread1(P: Pointer): LongInt; stdcall;

var

i: Integer;

begin

Form1.Memo1.Clear;

Form1.ProgressBar1.Position:= 0;

for i:=1 to 300 do

begin

EnterCriticalSection(CSection);

Sleep(2); <==============================의문사항1

j:= j+1;

Form1.Memo1.Lines.Add(IntToStr(j));

Form1.Memo3.Lines.Add(IntToStr(j));

Form1.ProgressBar1.Position:= j;

LeaveCriticalSection(CSection);

end;

Result:= 0; <==============================의문사항2

end;



2  COMMENTS
  • Profile
    밥벌레 2000.08.07 22:21
    음 일단 별로 안좋은 예제 같은데요(책 예제 맞지요?)..^^

    sleep(2) 는 크리티컬 섹션 테스트 하느라 일부러 넣은것 같습니다..

    아니면 너무 for문이 빨리 끝나서 크리티컬 섹션이 동작 하는지 확인하기 힘드니까요..

    그러니깐 실제 프로그래밍 할때는 필요 없을것 같습니당..

    그리구 result 는 getexitcodethread 함수로 쓰레드가 제대로 끝났는지 확인할때 사용합니다..0일때는 none error니까..0을 안넣으면 쓰레기값이 나오겠죠..

    BOOL GetExitCodeThread(

    HANDLE hThread, // handle to the thread

    LPDWORD lpExitCode // address to receive termination status

    );



    안좋은 예제라는 이유는, 쓰레드 내에서 VCL로 화면을 갱신하는 루틴을 포함하기 때문입니다.. 쓰레드 내에서 VCL로 화면 갱신하는 부분은 꼭 Synchronize 프로시져로 묶어줘야 하는데, 그부분이 완전 생략되어 있네요.. 크리티컬 섹션이 비슷한 일을 수행할 수 있다고 생각하기 쉽지만, 현재 정의되어 있는 상태의 크리티컬 섹션은 쓰레드 끼리만 서로 막아 주기 때문에 쓰레드가 돌아가는 동안 주프로세스에서도 화면 갱신을 하게 되면 서로 동시에 같은 Canvas에 접근해서 뭔가 하려다가 뻑이나는 수가 있습니당..^^

    TThread 형을 상속받아서 만드는 VCL 쓰레드를 사용하도록 하심이 좋을듯 합니당..

    TThread 사용법은 헬프에 예제까지 자세히 나와있습니다..

    그럼 도움이 되었길~~

    안녕히 계셔요~~



    류제훈 wrote:

    >

    > CreateThread() 함수로 MyThread1(스레드1)을 생성시킨 다음,

    > 수행될 부분의 함수를 정의하는 부분입니다.

    >

    > 의문사항1.

    > 다음과 같이 스레드에서 수행될 작업을 정하는 부분에서요,

    > Sleep(2)처럼 스레드 수행을 2ms동안 일지중지 시켰는데

    > 그 이유를 알고 싶습니다.

    >

    > 의문사항2.

    > 책 앞의 예제에서는 Result값을 정해주는 부분을 생략했었는데,

    > 여기 크리티컬 섹션부분에서는 Result 값을 정해주었습니다.

    > 앞의 예제처럼 Result값을 특별히 정해주지 않아도 되는지,

    > 이 부분(Result:= 0;)을 생략하고 넘어가도 되는지

    > 알고 싶습니다.

    >

    >

    > //스레드1에서 수행될 작업내용

    >

    > function MyThread1(P: Pointer): LongInt; stdcall;

    > var

    > i: Integer;

    > begin

    > Form1.Memo1.Clear;

    > Form1.ProgressBar1.Position:= 0;

    > for i:=1 to 300 do

    > begin

    > EnterCriticalSection(CSection);

    > Sleep(2); <==============================의문사항1

    > j:= j+1;

    > Form1.Memo1.Lines.Add(IntToStr(j));

    > Form1.Memo3.Lines.Add(IntToStr(j));

    > Form1.ProgressBar1.Position:= j;

    > LeaveCriticalSection(CSection);

    > end;

    > Result:= 0; <==============================의문사항2

    > end;

    >

  • Profile
    류제훈 2000.08.08 01:20
    꾸벅~ 상세한 답변에 감사드립니다.

    날씨가 더운데도 불구하고, 이렇게 답변을 해 주시니

    이 초보는 감사할 따름입니다.



    책 예제 맞습니다. ^^;

    그리구 이 책에 않좋은 예제 엄청 많습니다. ^^

    제가, 이 쌩초보가 일일히 수정(?)해가면서 본다니깐요...



    답변중에 Synchronize 와 VCL에 대한 부분에서는

    많은 것을 얻었습니다. 다른 곳에서 VCL을 건드릴 수

    있다는 것을 미처 생각지 못했습니다.. ㅠㅠ



    주옥같은 답변에 정말 다시 한 번 감사드리면서.. 꾸벅.

    좋은 하루 되세요~~ ^^