السلام عليكم إخواني
عندي مشكل مع THREAD و هو أنه أحاول عمل increment لكن عند نقر Button يتوقف عند 1
لكن من المفترض أن يتوقف العداد عند 10
الكود سورس في المرفقات
بارك الله فيك أخي
عندي سؤال آخر إن إستسمحت
هل Synchronize تنادي الدالة EnParallel يعني تعمل Update ?
و ممكن تعطني تعريف لSynchronize و خصوصياتها?
و جزاك الله كل خير
unit MY_THREAD2;
interface
uses
Classes,Windows,StdCtrls,SysUtils;
type
TMY_THREAD2 = class(TThread)
private
My_Label : TLabel;
{ Déclarations privées }
protected
procedure Execute; override;
public
constructor create(LABEL_Display : TLabel);
end;
implementation
constructor TMY_THREAD2.create(LABEL_Display: TLabel);
begin
FreeOnTerminate:=True;//le thread sera detruit a la fin de l'execution
inherited create(False);//appel au constructor original
My_Label:=LABEL_Display;
end;
procedure TMY_THREAD2.Execute;
var
count : integer;
begin
count :=0;
repeat
Sleep(100);
inc(count);
My_Label.Caption:=IntToStr(count);
until count [color=Red]>=[/color]10;
end;
end.
synchronize لنزامن تنفيذ إجراء ما مع تنفيذ الثريد , في حالة يوجد أكثر من thread تعمل جميعها بشكل متوازي
و لتفادي حالة التداخل, نلجأ لـ الخاصية synchronize , في حالة وجود thread واحد فقط يمكن أن نستدعي
الإجراء مباشرة .
إقتباس :synchronize لنزامن تنفيذ إجراء ما مع تنفيذ الثريد , في حالة يوجد أكثر من thread تعمل جميعها بشكل متوازي
و لتفادي حالة التداخل, نلجأ لـ الخاصية synchronize , في حالة وجود thread واحد فقط يمكن أن نستدعي
الإجراء مباشرة .
هناك شيء أراه مهم لم ننبه عليه
بخصوص استعمال مكتبات المكونات VCL، ومحتوى الملاحظة المتضمنة عند إنشاء THread أخي TF6M
Important : les méthodes et propriétés des objets de la VCL peuvent uniquement
être utilisés dans une méthode appelée en utilisant Synchronize, comme :
Synchronize(UpdateCaption);
où UpdateCaption serait de la forme
procedure TMY_THREAD.UpdateCaption;
begin
Form1.Caption := 'Mis à jour dans un thread';
end;
وهي سبب استخدام Synchronize عوضا عن كتابة التعليمات مباشرة في Execute.