العودة   منتدى رياض الجنة - Riad Al-Ganah > الرياض التقنية > روضة الكورسات والدورات التقنية والعلمية > روضة دورات تقنية الـ .NET بلغاتها المختلفة > دورة .NET 2008 من منتدى فيجوال بيسك للعرب

دورة .NET 2008 من منتدى فيجوال بيسك للعرب مقدم الدورة : أحمد جمال ، نوع الدورة : كتابية مصحوبة بصور ، حالة الدورة : انتهت ، عدد الدروس : 80 درس . مستوى الدورة : من البداية للاحتراف .

إضافة رد

 
أدوات الموضوع انواع عرض الموضوع
  #1  
قديم 02-28-2010, 05:52 PM
الصورة الرمزية khaledbelal
khaledbelal khaledbelal غير متواجد حالياً
مبرمج المنتدى
الادارة تكليف لا تشريف
 
تاريخ التسجيل: Oct 2009
العمر: 34
المشاركات: 3,606
افتراضي الدرس الثامن والأربعون : Multithreading - دورة .net 2008

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

تعرف نظم التشغيل الحديثة بأنها multitasking systems وهو ما يعني امكانية تنفيذ اكثر من مهمة في نفس الوقت ، لذا تجد أن بامكانك تشغيل عدة برامج في نفس الوقت .

برامج .net من هذا النوع افتراضياً ، لكنك تلاحظ في بعض البرامج ان البرنامج الواحد قادر على تنفيذ اكثر من عملية في نفس الوقت دون أن يكون لهما تأثير متعارض ، هذا ما يعرف باسم multithreading .

لذا تجد ان برنامج الماسنجر يتيح لك ارسال ملفات والحديث واستخدام الكاميرا والتحدث مع اكثر من شخص بنفس الوقت ، وهو ما لم يكن الماسنجر قادراً عليه لو لم يكن يفصل هذه المهام داخل البرنامج الواحد عن بعضها ، هذا هو مضمون درسنا الحالي .

جميع الأوامر التي سنتعامل معها هنا تقع تحت نطاق الأسماء System.Threading ، لذا قم باستيراده أولاً .

العناصر الاساسية داخل مجال الاسماء هذا هي :

Thread : لتعريف Thread جديد والتعامل معه .
ThreadPool : مجموعة من ال Threads يمكن لها التعامل فيما بينها .
ThreadState : Enum يحتوي على عدة حالات لأي Thread .
ThreadStart : بدء التنفيذ في Thread .
ThreadPriority : تحديد اولوية هذا ال Thread .

بالاضافة إلى :

Semaphore
Mutex
Monitor

وهي في الاساس الجوريزمات تستخدم لعمليات التزامن synchronization بحيث لا يسمح لأكثر من Thread بالوصول إلى نفس المصادر في نفس الوقت ، لمزيد من التعرف على هذه الالجوريزمات يمكن البدء من هنا :
[IMG]http://en.wikipedia.org/wiki/Semaphore_(programming[/url])
http://en.wikipedia.org/wiki/Mutual_exclusion
http://en.wikipedia.org/wiki/Monitor_(synchronization)

System.Threading.Thread

الفئة الاساسية في مجال الاسماء هذا ، تتيح لنا انشاء threads وتنفيذ مهامنا المختلفة عليها ، مكونات هذه الفئة الاساسية هي :

Sleep() : توقف عمل ال thread لفترة من الوقت .
IsAlive : قيمة توضح إذا كان ال thread ما زال يعمل ام لا .
IsBackground : إذا كان ال thread يعمل في background .
Priority : الأولوية الحالية .
ThreadState : حالة ال Thread .
Name : اسم ال thread .
Abort() : خروج .
Join() : توقف عمل ال thread حتى حدوث الحدث في join .
Resume() : استئناف العمل بعد ايقافه .
Start() : بدء العمل للمرة الأولى .
Suspend() : ايقاف العمل مؤقتاً .

سنقوم بداية بعمل تجربة سريعة للاستدلال على معنى ان يتم تنفيذ مهمتين في نفس الوقت ، نعود بعدها لاستئناف شرح المفاهيم الخاصة بالموضوع .

قم بتجربة الكود التالي :

c#:
كود PHP:
static void Main(string[] args)
        {
            
order1();
            
order2();
            
            
Console.ReadKey();
        }
        static 
void order1()
        {
            for (
int i 0100i++)
            {
                
Console.ForegroundColor ConsoleColor.Green;
                
Console.Write(i.ToString() + " ");
            }
        }
        static 
void order2()
        {
            for (
int i 1000i--)
            {
                
Console.ForegroundColor ConsoleColor.Red;
                
Console.Write(i.ToString() + " ");
            }
        } 
vb.net:
كود PHP:
Private Shared Sub Main(ByVal args As String()) 
    
    
order1() 
    
order2() 
    
    
    
Console.ReadKey() 
End Sub 
Private Shared Sub order1() 
    For 
As Integer 0 To 99 
        Console
.ForegroundColor ConsoleColor.Green 
        Console
.Write(i.ToString() + " "
    
Next 
End Sub 
Private Shared Sub order2() 
    For 
As Integer 100 To 1 Step -
        Console
.ForegroundColor ConsoleColor.Red 
        Console
.Write(i.ToString() + " "
    
Next 
End Sub 
الكود كما هو واضح يقوم بطباعة الأرقام تصاعدياً وتنازلياً ، الناتج الطبيعي هو طباعة التصاعدي ومن ثم التنازلي ، في حين يتم طباعة نتائج الدالة الأولى بالأخضر والثانية بالأحمر للتفريق لتكون شاشة النتائج بالشكل التالي مثلاً :

http://vb4arab.com/vb/uploaded/3/012...28computing%29

نعود مرة أخرى ، لتحديد Priority أي مهمة لدينا نستخدم ال enum التالي :

كود PHP:
 
public enum ThreadPriority
{
AboveNormal,
BelowNormal,
Highest,
Idle,
Lowest,
Normal// Default value.
TimeCritical

ويصبح الكود بالشكل التالي مثلاً :
كود PHP:
t1.Priority System.Threading.ThreadPriority.Highest
قبل البعد عن المواضيع الاساسية ، لا تنسى ان بامكانك استخدام sleep لايقاف التنفيذ لمدة ، supponse لايقاف مؤقت ... الخ من النقاط التي بدأنا بها شرحنا لهذا الدرس .

ParameterizedThreadStart :

لعلك لاحظت في المثال السابق اننا نمرر الدالة ومن ثم نقوم بعمل start لها لتنفيذها في thread منفصل ، لكن ماذا لو كانت هذه الدالة تستقبل بارميترات ؟

الحل بسيط ، باستخدام ParameterizedThreadStart بالشكل التالي مثلاً :

c#:
كود PHP:
Thread t = new Thread(new ParameterizedThreadStart(functionname));
t.Start(parms); 
vb.net:
كود PHP:
Dim t As New Thread(New ParameterizedThreadStar(functionname))
t.Start(parms)

foreground and background 
هناك نوعان من ال threads :

ForeGround Thread : هذا يعني ان البرنامج لا يمكن ان يغلق حتى يتم الانتهاء من تنفيذ جميع ال foreground threads الموجودة فيه ، النوع الافتراضي لأي thread تقوم بانشاءه هو من هذا النوع .

BackGround Thread : هذا يعني ان البرنامج يمكن ان يتم اغلاقه حتى لو لم يتم تنفيذ كافة ال background threads ، يتم عمله بالشكل التالي مثلاً :
كود PHP:
t.IsBackground true
الدرس القادم سوف نبدأ في المعاناة رقم 1 مع ال multithreading ، مشكلة التداخل بين المهام وعملية ال Synchronization .

بصراحة كنت انوي كتابة موضوع كامل عن ال Threads Synchronization ، ولكني لم اجد نفسي قادراً على اضافة أي جديد في هذا الموضوع لمقال الاخ محمد سامر سلو على هذا الرابط :

http://vb4arab.com/vb/showthread.php?t=6341

لذا يمكنك متابعة الدرس من هناك ، ثم العودة إلى هنا مرة أخرى .

الدرس الذي بعده كان ايضاً عن ال Threadbool ، موجود هنا أيضا للأخ محمد :
http://vb4arab.com/vb/showthread.php?t=6340

الدرس بالفيجوال بيسك.نت ، إذا كنت ترغب في العرض باستخدام c# يمكنك التحويل من هنا .
http://labs.developerfusion.co.uk/co...arp-to-vb.aspx

لذا سآخد راحة اليوم ، نلتقي غداً مع BackgroundWorker وبعدها تعقيب للأخ supersmart .

BackgroundWorker :

تستخدم ال BackgroundWorker لتنفيذ مهمة معينة تأخذ وقتاً طويلاً بعيداً عن المسار الاساسي للبرنامج ، من أمثلة ذلك الدوال الخاصة بالقراءة من web service أو عمليات معالجة الصور او جلب بعض البيانات من كومبيوتر آخر أو تنفيذ عملية بحث ، او اجراء مجموعة من العمليات طويلة الأمد .

ومع أنك كان بإمكانك عمل هذه الدوال عن طريق تنفيذها في thread تقليدي ، إلا أن BackgroundWorker تعطيك مزيد من التحكم ، ببساطة يمكنك اخباره ال بالدالة التي ترغب في تنفيذها ومن ثم تشغيلها عن طريق RunWorkerAsync() ، أخيراً بعد انتهاء التنفيذ يتم تنفيذ حدث RunWorkerCompleted والتي يمكنك فيه مثلاً عرض النتائج بعد انتهاء تنفيذ هذه المهمة .

للبدء بالعمل قم بعمل Windows Form ، قم برسم بعض الادوات ومن ثم ضع زر امر للبدء بتنفيذ المهمة ، واخيراً قم بسحب أداة BackgroundWorker بالشكل التالي مثلاً :

[url]http://vb4arab.com/vb/uploaded/3/01210353005.jpg[/IMG]

أهم دالتين هما هنا DoWork والذي يتم استدعاءه وقت بدء التنفيذ ، والحدث RunWorkerCompleted والذي يتم اطلاقه بعد الانتهاء من التنفيذ بالشكل التالي مثلاً :

C#:
كود PHP:
private void ProcessNumbersBackgroundWorker_DoWork(object sender,
DoWorkEventArgs e)
{
}
private 
void ProcessNumbersBackgroundWorker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{

vb.net :
كود PHP:
Private Sub ProcessNumbersBackgroundWorker_DoWork(ByVal sender As ObjectByVal e As DoWorkEventArgs
End Sub 
Private Sub ProcessNumbersBackgroundWorker_RunWorkerCompleted(ByVal sender As ObjectByVal e As RunWorkerCompletedEventArgs
End Sub 
لاحقاً يتم البدء بالتنفيذ بالشكل التالي :
كود PHP:
ProcessNumbersBackgroundWorker.RunWorkerAsync(args); 
حيث يتم تنفيذ الكود الموجود في الحدث DoWork .

والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .


توقيع : khaledbelal



(أَفَأَمِنَ أَهْلُ الْقُرَى أَن يَأْتِيَهُمْ بَأْسُنَا بَيَاتاً وَهُمْ نَآئِمُونَ {97} أَوَ أَمِنَ أَهْلُ الْقُرَى أَن يَأْتِيَهُمْ بَأْسُنَا ضُحًى وَهُمْ يَلْعَبُونَ {98}
أَفَأَمِنُواْ مَكْرَ اللّهِ فَلاَ يَأْمَنُ مَكْرَ اللّهِ إِلاَّ الْقَوْمُ الْخَاسِرُونَ {99}).
سورة الأعراف.

رد مع اقتباس
  #2  
قديم 03-03-2011, 06:14 PM
الصورة الرمزية ماريا إسلام
ماريا إسلام ماريا إسلام غير متواجد حالياً

عضو متألق

 
تاريخ التسجيل: Oct 2010
العمر: 35
المشاركات: 268
افتراضي

وعليكم الله ورحمة الله وبركااته
،،،
جزاك الله خيرااااا وبارك في مسعاك
ووفقكم لما يحب ويرضاه
دعوااتكم
//


توقيع : ماريا إسلام

ربي هذا العهد لك ... عزم القلب الوفا

تستطيع أن ترى الصورة بحجمها الطبيعي بعد الضغط عليها

تستطيع أن ترى الصورة بحجمها الطبيعي بعد الضغط عليها

صفحتي على الفيسبوك!

رد مع اقتباس
إضافة رد


تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

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

المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
الدرس الثامن والخمسون : Wpf 3d - دورة .net 2008 khaledbelal دورة .NET 2008 من منتدى فيجوال بيسك للعرب 0 03-07-2010 02:19 AM
الدرس التاسع والأربعون : System.IO - دورة .net 2008 khaledbelal دورة .NET 2008 من منتدى فيجوال بيسك للعرب 0 02-28-2010 10:15 PM
الدرس الثاني والأربعون : ال Gc دورة .net 2008 khaledbelal دورة .NET 2008 من منتدى فيجوال بيسك للعرب 0 02-26-2010 04:17 PM
الدرس الثامن والثلاثون : Lambda Expressions دورة .net 2008 khaledbelal دورة .NET 2008 من منتدى فيجوال بيسك للعرب 0 02-25-2010 02:54 PM
الدرس الثامن والعشرون : ICloneable interface دورة .net 2008 khaledbelal دورة .NET 2008 من منتدى فيجوال بيسك للعرب 0 02-24-2010 02:22 PM

استضافة الحياة

الساعة الآن 10:25 AM.


Powered by vBulletin® v3.8.4, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. , TranZ By Almuhajir
النسخة الفضية
Ads Management Version 3.0.1 by Saeed Al-Atwi

SlamDesignzslamDesignzEdited by Riad Al-Ganah Team - جميع الحقوق محفوظة لشبكة رياض الجنة

Privacy Policy Valid XHTML 1.0 Transitional By SlamDesignz Valid CSS Transitional By SlamDesignz