مشكل مع thread
#1
السلام عليكم إخواني
عندي مشكل مع THREAD و هو أنه أحاول عمل increment لكن عند نقر Button يتوقف عند 1
لكن من المفترض أن يتوقف العداد عند 10
الكود سورس في المرفقات


الملفات المرفقة
.rar   MY_THREAD.rar (الحجم : 2.28 ك ب / التحميلات : 24)
الرد
#2
و عليكم السلام و رحمة الله و بركاته

قارن و إستنتج الخطأ :tong: ....

PHP كود :
unit MY_THREAD2;

interface

uses
  Classes
,Windows,StdCtrls,SysUtils;

type
  TMY_THREAD2 
= class(TThread)
  Private
   
count : Byte;
   
My_Label : TLabel;
  protected
    
procedure Execute; override;
    
procedure Enparallel;
  public
   
constructor create(LABEL_Display : TLabel);
  
end;

implementation

constructor TMY_THREAD2
.create (LABEL_Display : TLabel);
begin
inherited create
(False);
FreeOnTerminate:= False;
My_Label:=LABEL_Display;
end;

procedure TMY_THREAD2.Enparallel;
Begin
 My_Label
.Caption:= IntToStr(count);
End;

procedure TMY_THREAD2.Execute;
begin
count 
:=0;
  
repeat
    inc
(count);
    
Synchronize(Enparallel);
     
Sleep(100);
  
until (Terminated) or (count >=10);
MessageBoxA(0,'Thread Terminted !',Nil,0);
end;

end. 
بالتوفيق ,,
I'M Fly Like A G6

الرد
#3
بارك الله فيك أخي
عندي سؤال آخر إن إستسمحت
هل Synchronize تنادي الدالة EnParallel يعني تعمل Update ?
و ممكن تعطني تعريف لSynchronize و خصوصياتها?
و جزاك الله كل خير
الرد
#4
السلام عليكم
غريب! نفس الخطأ
الرد
#5
عفوا الخطأ كان مني قلت التركيز :oops:

كود :
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.
الرد
#6
synchronize لنزامن تنفيذ إجراء ما مع تنفيذ الثريد , في حالة يوجد أكثر من thread تعمل جميعها بشكل متوازي
و لتفادي حالة التداخل, نلجأ لـ الخاصية
synchronize , في حالة وجود thread واحد فقط يمكن أن نستدعي
الإجراء مباشرة .

I'M Fly Like A G6

الرد
#7
إقتباس :synchronize لنزامن تنفيذ إجراء ما مع تنفيذ الثريد , في حالة يوجد أكثر من thread تعمل جميعها بشكل متوازي
و لتفادي حالة التداخل, نلجأ لـ الخاصية synchronize , في حالة وجود thread واحد فقط يمكن أن نستدعي
الإجراء مباشرة .
هناك شيء أراه مهم لم ننبه عليه
بخصوص استعمال مكتبات المكونات VCL، ومحتوى الملاحظة المتضمنة عند إنشاء THread أخي TF6M Wink
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#8
kachwahed كتب :
هناك شيء أراه مهم لم ننبه عليه
بخصوص استعمال مكتبات المكونات VCL، ومحتوى الملاحظة المتضمنة عند إنشاء THread أخي TF6M Wink

ممكن شرح أكثر أخي kachwahed , هل تقصد حالة الـ blocking ؟.
I'M Fly Like A G6

الرد
#9
التحكم في المكونات من خلال Thread، الملاحظة:
كود :
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.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#10
ممكن رابط الموضوع أخي kachwahed ؟.
I'M Fly Like A G6

الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم