11-03-2010, 03:16 PM
بسم الله الرحمان الرحيم
السلام عليكم و رحمة الله و بركاته
كيف نبرمج تطبيقاتنا بطريقة حديثة ؟ , كيف يمكن لنا أن نسرع من أداء برنامجنا دون وقوع مشاكل أو :frusty: , كيف لنا أن تشغيل عدة عمليات
في آن واحد (ظاهريا) بالتوازي و بشكل متزامن (مدروس) ؟ , ببساطة البرمجة بالإعتماد على آلية Multi_Thread .
بعض التوضيحات "نظريا" :
أنظمة التشغيل تتوافق تماما مع هندسة المعالج و آلياته , الأنظمة الحديثة (Multi_Tache) أساسا تعتمد على تقليص زمن التنفيذ كيف ؟
عن طريق آلية Pipeline, معالج يدعم pipeline ينفذ تعليمات برنامج ما "بالتزامن في طور عمل واحد" وفق روتينا المعالج :
Fetch,decode,memory access,write back لاحظ الجدول التالي الدي يوضح آلية معالجة برنامج بـ Pipeline![[صورة: 1561g.jpg]](http://img191.imageshack.us/img191/4423/1561g.jpg)
نفرض مثلا أن لدينا برنامج 20 %تعليمات تحميل و تخزين , 40 %تعليمات منطقية و مقارنة ... , 40 %تعليمات قفز و تفرع ...
لو كان المعالج لا يدعم pipeline سيظطر لتنفيذ تعليمة بعد تعليمة و لن يدخل للتعليمة الجديدة حتى ينهي السابقة ! و إذا كان كل صنف
من التعليمات يحتاج طورين أو أكثر لتنفيذ التعليمة الواحد لك أن تتخيل "مدى بطئ معالجة تعليمات البرنامج المحمل الواحد" لكن مع pipline
أطوار عمل أقل و أداء أسرع يمكن أن ننفذ أكثر من برنامج (Process) بشكل متزامن (Synchronize) بإزاحة توافق (Priority) المخصصة
لكل process على أساس Pid(رقم تعريف البروسس), hProcess(مقبض البروسس), لم أشرح كثيرا فقط صطحيا للدخول في جو الدرس ! ."الان ماذا لو قمنا بنفس عمل نظام التشغيل داخل تطبيقاتنا ؟ يعني أن ننفذ العديد من العمليات بشكل متزامن في آن واحد (ظاهريا) !."
- هناك عشرات التعريفات و المقدمات حول موضوع الـ THread لذا كان علي الدخول من منطلقالشكل العام لإنشاء thread واحد كمثال أول , نعتمد على خصائص البرمجة poo بشكل عادي يعني إنشاء
class مورث من TThread في ديلفي .
التوجيه IFDEF هنا أظفته متعمدا لتحديد إصدار دلفي المعتمد في التطبيق يمكن تجاوزها (إظافة فقط) كما أني أظفت التوجيه $X
الدي يتيح لنا دمج الدوال و الإجراءات دون مراعات ترتيب الـ implementation (أيضا كإظافة:tong
,
قمنا بإدراج initialization / finalization يكفي أن نعمل Resume لبدأ تنفيذ Execute الخاص بالـ Thread آليا !.
class مورث من TThread في ديلفي .
PHP كود :
{$IFDEF VER150}//delphi 7
Type
MyThread = Class (TTHread)
Private
_i:Byte;
Protected
Procedure DoSomeThing;
Procedure Execute;OverRide;
Public
Constructor Create (Suspended:Boolean);
Destructor Destroy;OverRide;
End;
{$ENDIF}
var
MainFrm: TMainFrm;
MyTh :MyThread;
implementation
{$R *.dfm}
Constructor MyThread.Create;
Begin
Inherited Create(Suspended);//If False = start when we call create constructor !.
_i:= 0;//Initialization ...
End;
Destructor MyThread.Destroy;
Begin
//Set Object That Created Free ...
Inherited;//Call the oroginal Destructor (TThread Class).
End;
Procedure MyThread.Execute;
Begin
repeat
Sleep(100); //500 = 1/2 s
Synchronize(DoSomeThing);
until Terminated;
End;
{$X+}// Set extended syntax on
Procedure MyThread.DoSomeThing;
Begin
Inc(_i);
If _i <= 255 Then
MainFrm.Label3.Caption:= IntToStr(_i) Else
_i:= 0;
End;
procedure TMainFrm.Button1Click(Sender: TObject);
begin
MyTh:=MyThread.Create(False);
end;
procedure TMainFrm.Button2Click(Sender: TObject);
begin
Try
MyTh.Suspend;
Except
On E : Exception Do
MessageBoxA(0,Pchar(E.Message),Nil,0);
End;
end;
procedure TMainFrm.Button3Click(Sender: TObject);
begin
Try
MyTh.Resume;
Except
On E : Exception Do
MessageBoxA(0,Pchar(E.Message),Nil,0);
End
end;
procedure TMainFrm.Button4Click(Sender: TObject);
begin
MyTh.Terminate;
//finalization ...
Label3.Caption:= '0';
MainFrm.Button1.Enabled:= True;
end;
procedure TMainFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Button4Click(Sender);// THread Must Be Terminated!.
ExitProcess(GetLastError);//Exit .
end;
initialization
MyTh:=MyThread.Create(True);
finalization
MyTh.Free;
end.
الدي يتيح لنا دمج الدوال و الإجراءات دون مراعات ترتيب الـ implementation (أيضا كإظافة:tong
, قمنا بإدراج initialization / finalization يكفي أن نعمل Resume لبدأ تنفيذ Execute الخاص بالـ Thread آليا !.
أخر , هدا التطبيق الأول مثال بسيط للمناقشة ....
![[صورة: myapp.gif]](http://img715.imageshack.us/img715/9628/myapp.gif)
. في هذا المثال قمنا ببرمجة عداد بسيط لن تنجح في تنفيذه دون إستعمال الـ threads! , هنا لم يتجمد البرنامج (freeze)
& النتيجة دورية 1/10 ثانية & تحكم أكثر & أداء أحسن (مثلا إستغنينا عن الـ Timer).
& النتيجة دورية 1/10 ثانية & تحكم أكثر & أداء أحسن (مثلا إستغنينا عن الـ Timer).
I'M Fly Like A G6


![[-]](https://delphi4arab.net/forum/D4A2020/collapse.png)

![[صورة: 51651.gif]](http://img65.imageshack.us/img65/2439/51651.gif)