sajioo
سه شنبه 11 آذر 1393, 09:34 صبح
دوستان سلام و وقت بخیر به همگی
بنده طی آموزش های بسیار مفید سایت برنامه نویس :قلب: با ترد ها در دلفی تا حدودی آشنا شدم.
وقتی ترد از اشیای روی فرم استفاده نمیکنه خیلی خوب کار میده.
اما سوال من اینه
بنده 1 ترد نوشتم که برای مثال بر روی فرم یک من که 3 اسکرول باکس داره 10 تا پنل درست کنه.
نمونه کد رو در زیر قرار میدم.
Type MyThread = Class(TThread)
private
public
str:string;
control:string;
procedure p1;
procedure p2;
procedure p3;
protected
procedure Execute; override;
end;
//**********************************************
procedure MyThread.Execute;
begin
if control='p1' then
p1;
if control='p2' then
(p2);
if control='p3' then
(p3);
Exit;
end;
procedure mythread.p1;
var
command : TStringList ;
i:integer;
panel:TPanel;
begin
command := TStringList.Create();
try
Split('|',str, command);
finally
for i := command.Count - 1 downto 1 do
begin
panel:=TPanel.Create;
with panel do
begin
Parent:=form1.sScrollBox1;
Align:=altop;
Caption:=command[i];
end;
end;end;end;
///*****************************
procedure mythread.p2
;var
command : TStringList ;
i:integer;
panel:TPanel;
begin
command := TStringList.Create();
try
Split('|',str, command);
finally
for i := command.Count - 1 downto 1 do
begin
panel:=TPanel.Create;
with panel do
begin
Parent:=form1.sScrollBox2;
Align:=altop;
Caption:=command[i];
end;
end;end;end;
//***************************************
procedure mythread.p3;
var command : TStringList ; i:integer;
panel:TPanel;begin command := TStringList.Create(); try Split('|',str, command);
finally
for i := command.Count - 1 downto 1 do if (i mod 2) = 0 then begin
panel:=TPanel.Create;with panel dobegin Parent:=form1.sScrollBox3; Align:=altop; Caption:=command[i];end;
end;end;end;
خوب الان بعدش برای اجرا از کد زیر استفاده می کنم.
T:=MyThread.Create(true);
T.str:=str;
T.control:='p1';
T.FreeOnTerminate := True;
T.Execute;
T.Suspend;
T.Terminate;
T:=MyThread.Create(true);
T.str:=str;
T.control:='p2';
T.FreeOnTerminate := True;
T.Execute;
T.Suspend;
T.Terminate;
T:=MyThread.Create(true);
T.str:=str;
T.control:='p3';
T.FreeOnTerminate := True;
T.Execute;
T.Suspend;
T.Terminate;
خوب همانطور که مشاهده میکنید بنده کدهایم را اینطور نوشتم.
این کد درست کار میکند فقط یک مشکل دارد و آن اینکه اول صبر میکند و پنل های اسکرول 1 را میسازد سپس پنل های اسکرول 2 و سپس پنل های اسکرول 3.
بررسی زیاد کردم در پست های پیشین از Synchronize هم استفاده کردم که موثر واقع نشد و متوجه شدم که Synchronize ترد را پاس میدهد به ترد اصلی( البته به زبان ساده)
چه راه حلی دوستان برای موازی سازی این کار پیشنهاد میدهند و آیا اصولا راهی موجود است یا نه؟:متفکر:
بسیار تشکر:تشویق:
بنده طی آموزش های بسیار مفید سایت برنامه نویس :قلب: با ترد ها در دلفی تا حدودی آشنا شدم.
وقتی ترد از اشیای روی فرم استفاده نمیکنه خیلی خوب کار میده.
اما سوال من اینه
بنده 1 ترد نوشتم که برای مثال بر روی فرم یک من که 3 اسکرول باکس داره 10 تا پنل درست کنه.
نمونه کد رو در زیر قرار میدم.
Type MyThread = Class(TThread)
private
public
str:string;
control:string;
procedure p1;
procedure p2;
procedure p3;
protected
procedure Execute; override;
end;
//**********************************************
procedure MyThread.Execute;
begin
if control='p1' then
p1;
if control='p2' then
(p2);
if control='p3' then
(p3);
Exit;
end;
procedure mythread.p1;
var
command : TStringList ;
i:integer;
panel:TPanel;
begin
command := TStringList.Create();
try
Split('|',str, command);
finally
for i := command.Count - 1 downto 1 do
begin
panel:=TPanel.Create;
with panel do
begin
Parent:=form1.sScrollBox1;
Align:=altop;
Caption:=command[i];
end;
end;end;end;
///*****************************
procedure mythread.p2
;var
command : TStringList ;
i:integer;
panel:TPanel;
begin
command := TStringList.Create();
try
Split('|',str, command);
finally
for i := command.Count - 1 downto 1 do
begin
panel:=TPanel.Create;
with panel do
begin
Parent:=form1.sScrollBox2;
Align:=altop;
Caption:=command[i];
end;
end;end;end;
//***************************************
procedure mythread.p3;
var command : TStringList ; i:integer;
panel:TPanel;begin command := TStringList.Create(); try Split('|',str, command);
finally
for i := command.Count - 1 downto 1 do if (i mod 2) = 0 then begin
panel:=TPanel.Create;with panel dobegin Parent:=form1.sScrollBox3; Align:=altop; Caption:=command[i];end;
end;end;end;
خوب الان بعدش برای اجرا از کد زیر استفاده می کنم.
T:=MyThread.Create(true);
T.str:=str;
T.control:='p1';
T.FreeOnTerminate := True;
T.Execute;
T.Suspend;
T.Terminate;
T:=MyThread.Create(true);
T.str:=str;
T.control:='p2';
T.FreeOnTerminate := True;
T.Execute;
T.Suspend;
T.Terminate;
T:=MyThread.Create(true);
T.str:=str;
T.control:='p3';
T.FreeOnTerminate := True;
T.Execute;
T.Suspend;
T.Terminate;
خوب همانطور که مشاهده میکنید بنده کدهایم را اینطور نوشتم.
این کد درست کار میکند فقط یک مشکل دارد و آن اینکه اول صبر میکند و پنل های اسکرول 1 را میسازد سپس پنل های اسکرول 2 و سپس پنل های اسکرول 3.
بررسی زیاد کردم در پست های پیشین از Synchronize هم استفاده کردم که موثر واقع نشد و متوجه شدم که Synchronize ترد را پاس میدهد به ترد اصلی( البته به زبان ساده)
چه راه حلی دوستان برای موازی سازی این کار پیشنهاد میدهند و آیا اصولا راهی موجود است یا نه؟:متفکر:
بسیار تشکر:تشویق: