PDA

View Full Version : thread و مشکل هنگ



BEHESHT*
پنج شنبه 12 اسفند 1389, 12:12 عصر
سلام دوستان

من یه thread ساختم و توش عملیات مورد نظرم رو انجام میدم اما متسفانه باعث هنگ برنامه میشه علتش چی می تونه باشه؟

این یونیت ترد هست»

unit UTread;


interface

uses SysUtils,Classes;

Type
MyThread = Class(TThread)

private
//procedure doProgress;
procedure BR () ;
protected
procedure Execute; override;
end;

Implementation


uses uMine;



procedure MyThread.BR ();

var
List: TStringList;
begin
LIST := TStringList.create;
try
for I := 0 to frmMine.integerCount do
begin
lsit.Add(inttostr(i));
end;
finally
List.Free;
end;
end;

procedure MyThread.Execute;
begin
Synchronize(BR);
Terminate;
Exit;
end;

این هم کد استفاده :

bTread := MyThread.Create(True);
bTread.FreeOnTerminate := True;
bTread.Resume;

دسوتان محبت می کنند کمک کنند؟

Felony
پنج شنبه 12 اسفند 1389, 12:33 عصر
اون Terminate و Exit تو Execute برای چی هست ؟

BEHESHT*
پنج شنبه 12 اسفند 1389, 14:54 عصر
برای خروج و آزاد سازی thread و این هم اضافه کنتم کد ها رو من ساده کردم و گرنه تو اون حلقه MD5 فایل ها رو می گیریم که فایل های بالا 4 مگ کندی رو به همراه داره.

و اولین باری هست که دارم با thread کار می کنم

BEHESHT*
پنج شنبه 12 اسفند 1389, 15:59 عصر
یه نمونه خیلی ساده دیگه

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls;

type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

type
TmyThread = class (TThread)
private
procedure s ;
public
protected
procedure Execute; override;
end;

implementation

procedure TmyThread.s;
var i :Integer;
begin
for I := 0 to 100 do
Sleep(100);
end;

procedure TmyThread.Execute;

begin
Synchronize(Self,s);
end;

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
g : TmyThread ;
begin
g := TmyThread.Create(True);
g.Execute;
g.Terminate;
g.WaitFor;
g.Free;
end;

end.



مثالش هم ضمیمه کردم برای رفع این مشکل چه کنم

دلفی 2010 هم نصب دارم

Felony
شنبه 14 اسفند 1389, 07:01 صبح
برای خروج و آزاد سازی thread و این هم اضافه کنتم کد ها رو من ساده کردم و گرنه تو اون حلقه MD5 فایل ها رو می گیریم که فایل های بالا 4 مگ کندی رو به همراه داره.

و اولین باری هست که دارم با thread کار می کنم
این کارتون اشتباه هست !
برای آزاد سازی ترد بعد از اتمام کار باید متد FreeOnTerminate رو با True مقدار دهی کنید ، رویداد Execute به صورت زیر در میاد :
procedure MyThread.Execute;
begin
Synchronize(BR);
end;
با True شدن متد FreeOnTerminate ترد پس از اتمام کار حافظه اختصاصی به خودش رو به صورت خودکار آزاد میکنه و نیازی به هیچ کار دیگه ای برای آزاد سازی ترد نیست .


یه نمونه خیلی ساده دیگه

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls;

type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

type
TmyThread = class (TThread)
private
procedure s ;
public
protected
procedure Execute; override;
end;

implementation

procedure TmyThread.s;
var i :Integer;
begin
for I := 0 to 100 do
Sleep(100);
end;

procedure TmyThread.Execute;

begin
Synchronize(Self,s);
end;

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
g : TmyThread ;
begin
g := TmyThread.Create(True);
g.Execute;
g.Terminate;
g.WaitFor;
g.Free;
end;

end.



مثالش هم ضمیمه کردم برای رفع این مشکل چه کنم

دلفی 2010 هم نصب دارم

طبیعی هست که برنامه فریز بشه ، Synchronize باعث میشه تا ترد شما تو Context ترد اصلی برنامه اجرا بشه و با اون همزمان سازی بشه ، شما تو کدتون از تابع Sleep استفاده کردید پس با توجه به اینکه تردتون تو ترد اصلی اجرا میشه پس نباید انتظار دیگه ای داشت ، با توجه به حلقه و تابع Sleep برنامتون باید به مدت 10 ثانیه فریز شه !

رویداد اجرا هم به صورت زیر در میاد :
var
g : TmyThread ;
begin
g := TmyThread.Create(True);
g.FreeOnTerminate:= True;
g.Execute;
end;
اون کدی که نوشتی باعث میشه ترد اجرا شه و چون عملیاتت تو ترد دیگه ای هست برنامه بقیه خط ها رو اجرا میکنه و سریعا به Free میرسه و ترد رو با این حال که کارش تموم نشده آزاد میکنه !