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;
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;
>