الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال حول المسارب النتعددة MultiThrads

مغلق
بدأه essam7 في 7 أغسطس 2006 · 5 رد · 698 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

سؤالي عن المسارب او threads

انا استعمل المسرب بالطريقة المبسطة دون ان اعمل باني جديد للتابع execute

اي بالمختصر اكتب التابع الذي عليه الرك وياخذ من المعالج الوقت اكتبه في وحدة الفورم او وحدة المسرب واستدعيه بوحدة المسرب

وذلك بعد ان اكتب في حدث معين في الفورم

TMyThread.create(false)

المهم هذه الطريقة جيدة في حالة ان العمل الموكل للمسرب واحد اي عند بدايته انشئ المسرب وعندما ينتهي انتهي من عملي!!!

انا اريد (ما زلت افكر نظريا بالمشروع اي اني لم ابدأ عمليا) لكن لأتخيل الفكرة فقط!

انا اريد ان اعمل مثلا داونلودر خاص بي

عملته على مبدأ مسرب وحيد انزل فايل وعندما ينتهي انزل الثاني وهكذا وبالتالي لم استفد من المسارب

اذا كان لدي مثلا 100 فايل اريد تنزيلهم والاحجام متفاوتة فهل اعرف اكثر من متحول على انه من نمط مسرب؟؟ للحصول على مسارب متعددة؟؟

يا شباب اذا ضعتو معي فخلوني بس اقول اني نظريا ساعمل التالي: صححوا لي ان اخطات!!

بفرض روابط الفايلات موجودة في لست بوكس

ساضيف وحدة مسرب جديدة ولتكن باسم TDownloadThread

ثم ساضع بها اجراء يقوم بعمل الداونلود وليكن باسم

DownloadFile(FileURL)

وفي بداية الاجراء مبااااشرة اضع تعليمة لحذف السطر الاول اي مسار الفابل من الlistbox حتى لا ينزل من قبل مسرب اخر

وساكتب بحدث الexecute للمسرب استدعاء الاجراء اي

 DOwnload(ListBox1.items[0])

ثم في وحدة الفورم الرئيسي مثلا وفي حدث الضغط على زر اعرف عشر متحولات عامة او محلية تحت حدث ضغط الزر من المسرب اي

D1,D2,.......,D10: TDownloadThread

ثم سأكتب في حدث الضغط على الزر عشر اسطر:

D1.create(false)
.
.
.
.
D10.create(false)

وعند انتهاء احد المسارب يعيد الكرة من اجل الفايل الاول ايضا وحتى انتهااااء الlistbox

هل حلي صحيح نظريا :blink:

ام بدل عشر متحولات اضيف للمشروع عشر وحدات مسارب ؟؟؟؟؟ :(

كما قلت السؤال نظري وما راح ابدا به عمليا الان (ماني فلضي) وانما فقط للاستئناس :D

يعني ممكن بالمستقبل عيد السؤال بعد اذنكم طبعا!!! ;)

#2

انتبهت لنقطة إنو بدك تعمل 10 متحولات أو 10 مسارب وبدي أطلب منك تكون ديناميكي شوي زيادة :D

#3

شوي ديناميكي؟؟

يعني الطريقتين تعبانين؟؟؟

دلني على الديناميكية ولك جزيييل الشكر

#4

هلأ انتبهت لنقطة وهي اني استطيع ان اعمل كريت للثريد عدة مرات

وضعت فورم به زر وليبل عدد 2

واضفت ثريد للفورم

بحدث نقر الزر وضعت التالي:

TtestThread.create(false)

وفي الثريد كتبت اجراء

procedure test;
begin
  if form1.label1.caption <> 'Label1' then //اي ان اليبل1 قد اخذ من قبل اي عولج
	for i:= 1 to 1000000 do
	   fom1.labe2.caption:= inttostr(i) // لذا اعالج الليبل2
   else for j:= 1 to 1000000  do
			 form1.label1.caption:= inttostr(j);
end;

واستدعيته في حدث الاكزيكيوت

طبعا الطريقة مبهدله ممكن حلها بخلق باني جيد للثريد كرييت لامرر له ما اريد معالجته مثلا

TtestThread.create(false, labal4: tlabel)

صحيح حلي ام ما زلت غير ديناميكي؟؟ :D

طيب كيف اعرف انتهاء الثريد ؟؟

ممكن لما جرب عمليا اجد النتيجة بس كما اسلفت هلأ ما راح ابدا قبل ما افضالها!!

#5

السلام عليكم

الحل في سطر الاخر essam7 وهو

اقتباس
طبعا الطريقة مبهدله ممكن حلها بخلق باني جيد للثريد كرييت لامرر له ما اريد معالجته مثلا

الحل هو التعديل علي الاجراء الافتراضي Create وزياده مدخلاته بما يناسبك ، مثلا الاجراء Create يأخد مدخل واحد فقط وهو المدخل المسؤال عن تشغيل الـThread ، بامكانك اضافة مدخلات جديدة بالتعديل عليها لتأخد مسار الملف من الفورم (ListBox)

الاجراء الاصلي علي حاله

Public
Constructor Create(CreateSuspended:Boolean);

لازم تصير

Public
Constructor Create(Url:String;ToDrive:String;CreateSuspended:Boolean);

ارجوان يكون الشرح مفهوم :unsure:

الإنسان الذي يقول بأنه لا يمكن عمل شيء يجب ألا يعيق مطلقاً الإنسان الذي يقوم بعمل ذلك الشيء.

إن تخطئ فأنت إنسان ... أما أن تلوم جهازك الكمبيوتر على خطأك فهذا أكثر إنسانية.

#6

تماما اخي كما ذكرت

اي عملي في محله

شكرا لك

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…