쓰레드를 사용하지 않고 DHTML Edit 컴포넌트를 사용했을때는
에러없이 잘돌아가는데..
쓰레드를 사용할경우 에러가 납니당...
현제 VB에서 지원하지 않는 몇가지 문제점을 해결하기 위해
델파이로 단위 테스트를 하며 컨버젼 작업을 수행하려하는데..
문서, URL 페이지 로딩시 CUP부하가 많아 쓰레드 처리를 하려는데
델파이에서 에러가 나네용...
혹시나 해서 JAVA++에서 만들어 보았더니.. 잘 돌아가는군요..
샘플 소스를 올립니다.. 프로젝트 파일은 첨프 하겠습니다..
문제점, 해결방안을 지적 해주십시요.
델파이에서는 5.0, 6.0에서 테스트 해보았는데..
5.0에서는 에러처리는 하지 않는데, 결과(로딩)이 안나오네요.
6.0에서는 엑세스 바이올레이션 에러가 처리 됩니다.
감사합니다.
=============================
Source (.pas)
=============================
unit Test;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, OleCtrls, DHTMLEDLib_TLB, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
BitBtn1: TBitBtn;
DHTMLEdit1: TDHTMLEdit;
ProgressBar1: TProgressBar;
Animate1: TAnimate;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ActionView();
end;
TDHTML_Thread = class(TThread)
private
protected
public
procedure Execute; override;
end;
TProBar_Thread = class(TThread)
private
protected
public
procedure Execute; override;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ActionView();
begin
DHTMLEdit1.LoadURL(Edit1.Text);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if (Edit1.Text <> '') then
begin
TProBar_Thread.Create(false);
TDHTML_Thread.Create(false);
end
else
begin
ShowMessage('Url을 입력하세요');
ActiveControl := Edit1;
end;
end;
// DHTML Edit Thread //
procedure TDHTML_Thread.Execute;
begin
Form1.ActionView();
end;
// Progress Bar Thread //
procedure TProBar_Thread.Execute;
var
i : integer;
begin
for i:=0 to 100000 do
begin
Form1.ProgressBar1.Position := i;
end;
for i:=100000 downto 0 do
begin
Form1.ProgressBar1.Position := i;
end;
end;
end.
> 쓰레드를 사용하지 않고 DHTML Edit 컴포넌트를 사용했을때는
> 에러없이 잘돌아가는데..
> 쓰레드를 사용할경우 에러가 납니당...
>
> 현제 VB에서 지원하지 않는 몇가지 문제점을 해결하기 위해
> 델파이로 단위 테스트를 하며 컨버젼 작업을 수행하려하는데..
> 문서, URL 페이지 로딩시 CUP부하가 많아 쓰레드 처리를 하려는데
> 델파이에서 에러가 나네용...
>
> 혹시나 해서 JAVA++에서 만들어 보았더니.. 잘 돌아가는군요..
>
> 샘플 소스를 올립니다.. 프로젝트 파일은 첨프 하겠습니다..
> 문제점, 해결방안을 지적 해주십시요.
>
> 델파이에서는 5.0, 6.0에서 테스트 해보았는데..
> 5.0에서는 에러처리는 하지 않는데, 결과(로딩)이 안나오네요.
> 6.0에서는 엑세스 바이올레이션 에러가 처리 됩니다.
> 감사합니다.
>
>
> =============================
> Source (.pas)
> =============================
> unit Test;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> ComCtrls, OleCtrls, DHTMLEDLib_TLB, StdCtrls, Buttons;
>
> type
> TForm1 = class(TForm)
> Label1: TLabel;
> Edit1: TEdit;
> BitBtn1: TBitBtn;
> DHTMLEdit1: TDHTMLEdit;
> ProgressBar1: TProgressBar;
> Animate1: TAnimate;
> procedure BitBtn1Click(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> procedure ActionView();
> end;
>
> TDHTML_Thread = class(TThread)
> private
> protected
> public
> procedure Execute; override;
> end;
>
> TProBar_Thread = class(TThread)
> private
> protected
> public
> procedure Execute; override;
> end;
>
> var
> Form1: TForm1;
>
> implementation
>
> {$R *.DFM}
>
> procedure TForm1.ActionView();
> begin
> DHTMLEdit1.LoadURL(Edit1.Text);
> end;
>
> procedure TForm1.BitBtn1Click(Sender: TObject);
> begin
> if (Edit1.Text <> '') then
> begin
> TProBar_Thread.Create(false);
>
> TDHTML_Thread.Create(false);
> end
> else
> begin
> ShowMessage('Url을 입력하세요');
> ActiveControl := Edit1;
> end;
> end;
>
> // DHTML Edit Thread //
> procedure TDHTML_Thread.Execute;
> begin
> Form1.ActionView();
> end;
>
> // Progress Bar Thread //
> procedure TProBar_Thread.Execute;
> var
> i : integer;
> begin
> for i:=0 to 100000 do
> begin
> Form1.ProgressBar1.Position := i;
> end;
>
> for i:=100000 downto 0 do
> begin
> Form1.ProgressBar1.Position := i;
> end;
> end;
>
> end.
>
>
>
>
DHTML Edit 함수의 호출시 동기화의 문제였습니다...
자바에서는 동기화 하지 않았는데 돌아가더군요.....
한가지더 참고하실점은.. DHTML Edit의 함수(LoadUrl.. 등등) 처리시
Thread로 조금이나마 CPU점유를 해결하려 했는데.. 별다른 효과가 없었습니다.
DHTML Edit 컴포넌트에 뭔가 문제가 있는듯 하네용...
좀더 Low 레벨에서 생각한다면.. 해결 방안이 있을것도 같은데.. 델파이실력이
미치질 않는군요...