고수님들의 도움을 부탁드립니다.
쓰레드 프로그램을 작성하는 데 원하는대로 동작하지 않는군요..
제가 원하는 것은 어떤 작업이 진행되는 동안 ProgressBar에 진행상태를
나타낼려고 합니다.
그래서 아래와 같은 테스트 프로그램을 만들어 봤지만 역시 원하는대로
작동하지 않는군요.
Button1을 누르면 쓰레드를 생성하고 sleep 함수를 사용하여 잠시멈춰 있도록
했는데, 멈춰있는 동안 쓰레드가 작동을 해서 ProgressBar에 진행상태를 표시해야
되는데, sleep 함수가 완료되고 나서야만 쓰레드가 실행되더군요..
혹시 문제점이나 해결책을 알고계신 고수분이 계시면 답변을 부탁드립니다.
감사합니다.
//-------------------------------------------------------------------
// 메인프로그램
//-------------------------------------------------------------------
unit Unit1;
interface
;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ProgressBar1: TProgressBar;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses unit2;
var ProgressThread1: TProgressThread;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
ProgressThread1 := TProgressThread.create(false);
sleep(5000); <-- 여기서 sleep함수가 완료된 후에만
<-- 쓰레드가 실행
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ProgressThread1.terminate;
end;
end.
//----------------------------------------------------------------
// 쓰레드 프로그램
//----------------------------------------------------------------
unit Unit2;
interface
uses
Classes, Windows;
type
TProgressThread = class(TThread)
private
{ Private declarations }
procedure UpdateProgress;
protected
procedure Execute; override;
end;
implementation
uses unit1;
procedure TProgressThread.UpdateProgress;
begin
form1.ProgressBar1.Position := form1.ProgressBar1.Position + 10;
end;
procedure TProgressThread.Execute;
begin
while not Terminated do begin
synchronize(UpdateProgress);
beep(200,200);
sleep(1000);
end;
end;
end.
고드름 김정입니다.
Sleep() 함수는 프로세스 자체를 멈춰버립니다.
따라서 자식 쓰레드가 있더라도, 프로세스의 일부이기 때문에 같이 쉽니다. ^^;
이런 경우, WaitForSingleObject( Thread.handle, timeout ); API 함수를 사용하세요.
그럼.
이선주 wrote:
> 고수님들의 도움을 부탁드립니다.
>
> 쓰레드 프로그램을 작성하는 데 원하는대로 동작하지 않는군요..
> 제가 원하는 것은 어떤 작업이 진행되는 동안 ProgressBar에 진행상태를
> 나타낼려고 합니다.
>
> 그래서 아래와 같은 테스트 프로그램을 만들어 봤지만 역시 원하는대로
> 작동하지 않는군요.
>
> Button1을 누르면 쓰레드를 생성하고 sleep 함수를 사용하여 잠시멈춰 있도록
> 했는데, 멈춰있는 동안 쓰레드가 작동을 해서 ProgressBar에 진행상태를 표시해야
> 되는데, sleep 함수가 완료되고 나서야만 쓰레드가 실행되더군요..
>
> 혹시 문제점이나 해결책을 알고계신 고수분이 계시면 답변을 부탁드립니다.
>
> 감사합니다.
>
>
>
> //-------------------------------------------------------------------
> // 메인프로그램
> //-------------------------------------------------------------------
> unit Unit1;
>
> interface
> ;
>
> type
> TForm1 = class(TForm)
> Button1: TButton;
> Button2: TButton;
> ProgressBar1: TProgressBar;
> Edit1: TEdit;
> procedure Button1Click(Sender: TObject);
> procedure Button2Click(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> end;
>
> var
> Form1: TForm1;
>
> implementation
>
> uses unit2;
>
> var ProgressThread1: TProgressThread;
>
> {$R *.DFM}
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> ProgressThread1 := TProgressThread.create(false);
>
> sleep(5000); <-- 여기서 sleep함수가 완료된 후에만
> <-- 쓰레드가 실행
> end;
>
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> ProgressThread1.terminate;
> end;
>
> end.
>
>
> //----------------------------------------------------------------
> // 쓰레드 프로그램
> //----------------------------------------------------------------
> unit Unit2;
>
> interface
>
> uses
> Classes, Windows;
>
> type
> TProgressThread = class(TThread)
> private
> { Private declarations }
> procedure UpdateProgress;
> protected
> procedure Execute; override;
> end;
>
> implementation
>
> uses unit1;
>
> procedure TProgressThread.UpdateProgress;
> begin
> form1.ProgressBar1.Position := form1.ProgressBar1.Position + 10;
> end;
>
> procedure TProgressThread.Execute;
> begin
> while not Terminated do begin
> synchronize(UpdateProgress);
> beep(200,200);
> sleep(1000);
> end;
> end;
>
> end.
>