تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Thread Methods & Proprties & Attributes
#1
كاتب الموضوع : !!! BoriS !!!

تكملة لهذا الموضوع


http://vb4arb.com/vb/showthread.php?726


سنبدأ على بركة الله بطرق وخصائص ال Thread .

تحتوى الفئة Thread على خصائص وطرق هامة عند التعامل مع مسار تنفيذى Thread .

نقوم باستيراد مجال الاسماء


كود :
[color=#000000][COLOR=#0000bb]Imports System[/color][color=#007700].[/color][COLOR=#0000bb]Threading  
[/COLOR][/COLOR]




الطريقة Start كما هو واضح من اسمها انها تقوم بتشغيل مسار التنفيذ والطريقة Abort تقوم بايقافة

كود :
[color=#000000][COLOR=#0000bb]Sub Boris[/color][COLOR=#007700]()
        [/COLOR][color=#0000bb]Dim Con [/color][color=#007700]As [/color][COLOR=#0000bb]Integer
        [/COLOR][color=#007700]For [/color][color=#0000bb]Con [/color][color=#007700]= [/color][COLOR=#0000bb]1 To 10
            [/COLOR][color=#007700]If [/color][color=#0000bb]Con [/color][color=#007700]= [/color][COLOR=#0000bb]5 Then
                Thread[/COLOR][color=#007700].[/color][color=#0000bb]CurrentThread[/color][color=#007700].[/color][color=#0000bb]Abort[/color][color=#007700]()  [/color][COLOR=#0000bb]ايقاف المسار التنفيذى
            End [/COLOR][COLOR=#007700]If
            [/COLOR][color=#0000bb]MessageBox[/color][color=#007700].[/color][color=#0000bb]Show[/color][color=#007700]([/color][color=#dd0000]"#"[/color][color=#0000bb]c[/color][COLOR=#007700])
        [/COLOR][COLOR=#0000bb]Next
    End Sub
    [/COLOR][color=#007700]Private [/color][color=#0000bb]Sub Form1_Load[/color][color=#007700]([/color][color=#0000bb]ByVal sender [/color][color=#007700]As [/color][color=#0000bb]Object[/color][color=#007700], [/color][color=#0000bb]ByVal e [/color][color=#007700]As [/color][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]EventArgs[/color][color=#007700]) [/color][color=#0000bb]Handles Me[/color][color=#007700].[/color][COLOR=#0000bb]Load
        Boris[/COLOR][COLOR=#007700]()
    [/COLOR][COLOR=#0000bb]End Sub  
[/COLOR][/COLOR]


المثال السابق هو عبارة عن اجراء يقوم باستخدام المسار الحالى للبرنامج ( لم ننشى مسار تنفيذى جديد) وذلك عن طريقة الطريقة CurrentThread.

المسار الحالى تم تشغيلة من طرف VB.NET الا اننا قمنا بايقافة بالطريقة Abort عندما وصلت قيمة الحلقة التكرارية الى 5 . ثم نفذنا الشرط

كود :
[color=#000000][COLOR=#0000bb] MessageBox[/color][color=#007700].[/color][color=#0000bb]Show[/color][color=#007700]([/color][color=#dd0000]"#"[/color][color=#0000bb]c[/color][COLOR=#007700])  
[/COLOR][/COLOR]


ال C المرافقة لل Special Character (#) لتحوبلة الى Optimization >>> Char

مثل الطريقة Start للتشغيل و Abort للايقاف ( بشكل نهائى ) لدينا الطريقتين Suspend و Resume

الطريقة Suspend تقوم بايقاف المسار الحالى مؤقتـــا وبالتالى Resume لتشغيل المسار.


للتاكد من كلامى انظر الكود الاتى
كود :
[color=#000000][COLOR=#0000bb]Sub BorisSuspendResume[/color][COLOR=#007700]()
        [/COLOR][color=#0000bb]Dim Con [/color][color=#007700]As [/color][COLOR=#0000bb]Integer
        [/COLOR][color=#007700]For [/color][color=#0000bb]Con [/color][color=#007700]= [/color][COLOR=#0000bb]1 To 10
            [/COLOR][color=#007700]If [/color][color=#0000bb]Con [/color][color=#007700]= [/color][COLOR=#0000bb]5 Then
                Thread[/COLOR][color=#007700].[/color][color=#0000bb]CurrentThread[/color][color=#007700].[/color][color=#0000bb]Suspend[/color][color=#007700]()  [/color][COLOR=#0000bb]ايقاف المسار التنفيذى مؤقتـــــا
            End [/COLOR][COLOR=#007700]If
            [/COLOR][color=#0000bb]MessageBox[/color][color=#007700].[/color][color=#0000bb]Show[/color][color=#007700]([/color][color=#0000bb]Thread[/color][color=#007700].[/color][color=#0000bb]CurrentThread[/color][color=#007700].[/color][color=#0000bb]IsAlive[/color][COLOR=#007700])
            [/COLOR][color=#0000bb]MessageBox[/color][color=#007700].[/color][color=#0000bb]Show[/color][color=#007700]([/color][color=#dd0000]"#"[/color][color=#0000bb]c[/color][COLOR=#007700])
        [/COLOR][COLOR=#0000bb]Next
    End Sub  
[/COLOR][/COLOR]


يتضح لنا من الكود السابق ان Suspend قامت بايقاف مسار التنفيذ دون قتلة او ايقاف نهائيا وذلك من خلال الرسالة التى استخدمنا بها الطريقة IsAlive والتى تعود ب True او False لاظهار حالة المسار الحالى.
كود :
[color=#000000][COLOR=#007700]Private [/color][color=#0000bb]Sub Form1_Load[/color][color=#007700]([/color][color=#0000bb]ByVal sender [/color][color=#007700]As [/color][color=#0000bb]Object[/color][color=#007700], [/color][color=#0000bb]ByVal e [/color][color=#007700]As [/color][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]EventArgs[/color][color=#007700]) [/color][color=#0000bb]Handles Me[/color][color=#007700].[/color][COLOR=#0000bb]Load
   BorisStartAbort[/COLOR][COLOR=#007700]()
        [/COLOR][color=#0000bb]Dim BorisThread [/color][color=#007700]As New [/color][color=#0000bb]Thread[/color][color=#007700]([/color][color=#0000bb]AddressOf BorisSuspendResume[/color][COLOR=#007700])
        [/COLOR][color=#0000bb]BorisThread[/color][color=#007700].[/color][color=#0000bb]Start[/color][COLOR=#007700]()  
        [/COLOR][color=#0000bb]BorisThread[/color][color=#007700].[/color][color=#0000bb]Suspend[/color][COLOR=#007700]()
        [/COLOR][color=#0000bb]BorisThread[/color][color=#007700].[/color][color=#0000bb]Resume[/color][COLOR=#007700]()
        [/COLOR][color=#0000bb]BorisThread[/color][color=#007700].[/color][color=#0000bb]Abort[/color][COLOR=#007700]()
    [/COLOR][COLOR=#0000bb]End Sub  
[/COLOR][/COLOR]


الطريقة Sleep تقوم بايقاف مسار التنفيذ ولكن لفترة زمنية معينة .



كود :
[color=#000000][COLOR=#007700][[/color][color=#0000bb]left[/color][color=#007700]][/color][color=#0000bb]Thread[/color][color=#007700].[/color][color=#0000bb]CurrentThread[/color][color=#007700].[/color][color=#0000bb]Sleep[/color][color=#007700]([/color][color=#0000bb]100[/color][color=#007700]) [/color][color=#0000bb]لمدة ثانيـــــة واحدة[/color][color=#007700].[/[/color][color=#0000bb]left[/color][COLOR=#007700]]  
[/COLOR][/COLOR]

الطريقة Join تقوم بايقاف عمل مسار التنفيذ الحالى حتى ينتهى مسار اخر من عملية التنفيذ اى عند Abort. وليس Suspend.

الخاصية ThreadState تمنكك من معرفة حالة المسار الحالى.

MessageBox.Show(BorisThread.ThreadState.ToString)

وهى تحتوى على طرق يمكن استخدمها والاستعلام عنها بواسطة If مثلا.


Data Sharing : مشاركة البيانـــان ( الله يكفينا شـــرها ) ....

كما ذكرت سابقا فى المقال السابق انواع ال Threads ..

Free Threads - Apartment Threads

مسارات التنفيذ الحرة تستطيع مشاركة البيانات فيما بينها ليس هذا فحسب بل تصل بها الجرائة والوقاحة للمشاركة حتى فى مصــادر النظام System Resources او حتى ال Hardewares

كود :
[color=#000000][COLOR=#007700][[/color][color=#0000bb]left[/color][COLOR=#007700]]
[/COLOR][COLOR=#0000bb]مسار تنفيذى يقوم باستدعاء هذا الاجراء

x [/COLOR][color=#007700]= [/color][COLOR=#0000bb]25
[/COLOR][color=#007700]if [/color][color=#0000bb]x [/color][color=#007700]= [/color][COLOR=#0000bb]25 then
x [/COLOR][color=#007700]+=[/color][COLOR=#0000bb]1
end [/COLOR][COLOR=#007700]if  

[[/COLOR][color=#0000bb]color[/color][color=#007700]=[/color][color=#dd0000]"Blue"[/color][color=#007700]][/color][color=#0000bb]مسار اخـــر للاسف الشديد[/color][color=#007700][/[/color][color=#0000bb]color[/color][COLOR=#007700]]


if [/COLOR][color=#0000bb]x [/color][color=#007700]= [/color][COLOR=#0000bb]25 then
x[/COLOR][color=#007700]-=[/color][COLOR=#0000bb]1
end [/COLOR][COLOR=#007700]if
[/[/COLOR][color=#0000bb]left[/color][COLOR=#007700]]  
[/COLOR][/COLOR]

المثال مشروح بالمقال السابق.

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


اليك الحل أخى وهـــو مايعرف باســـم التزامــن Synchronization.

SyncLockEnd SyncLock Structure ... يحتاج متغير من النوع reference عند التصريح.

التركيب SyncLock تركيب رائع جدا بحيث يقصر تشغيل الاكواد الموجودة بين ضلعية على مسار تنفيذى واحد حتى لو وجد 100 مسار تنفيذى اخر..



كود :
[color=#000000][COLOR=#007700][[/color][color=#0000bb]left[/color][COLOR=#007700]]
[/COLOR][color=#0000bb]Sub Sync[/color][COLOR=#007700]()
        [/COLOR][COLOR=#0000bb]SyncLock y
            [/COLOR][color=#007700]If [/color][color=#0000bb]x [/color][color=#007700]= [/color][COLOR=#0000bb]10 Then
                x [/COLOR][color=#007700]= [/color][COLOR=#0000bb]0
            [/COLOR][COLOR=#007700]Else
                [/COLOR][color=#0000bb]x [/color][color=#007700]= [/color][COLOR=#0000bb]10
            End [/COLOR][COLOR=#007700]If
        [/COLOR][COLOR=#0000bb]End SyncLock
    End Sub
[/COLOR][color=#007700][/[/color][color=#0000bb]left[/color][COLOR=#007700]]  
[/COLOR][/COLOR]

الكود السابق سينفذ من طرف مسار واحد فقط رغمــا عن أنف الجميـــع....

اليك أيضا مواصفة من مواصفات أخرى تقوم بعمل التركيب السابق الا انها تتيح لك عدم اعادة التركيب السابق فى كل Sub تريد تنفيذه من قبل مسار تنفيذى واحد .


كود :
[color=#000000][COLOR=#007700][[/color][color=#0000bb]left[/color][color=#007700]]<[/color][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]Runtime[/color][color=#007700].[/color][color=#0000bb]Remoting[/color][color=#007700].[/color][color=#0000bb]Contexts[/color][color=#007700].[/color][color=#0000bb]Synchronization[/color][color=#007700]()> [/color][color=#0000bb]_[/color][color=#007700][/[/color][color=#0000bb]left[/color][COLOR=#007700]]  
[/COLOR][/COLOR]

اكتبها كما هى فى اول ال Class .

عليك العلم أخى ان عند استخدامك للمواصفة Synchronization او التركيب SyncLock فلاداعى اصلا الى استخدام ال Multi Threads لانك قمت بالتعامل مع Thread واحد فقط

أذن اليك الحــل

MethodImpl Attribute.

المواصفة MethodImpl تمكنك من تحديد ال Memebers الخاصة بك التى تود تنفيذهــا من قبل مسار تنفيذى واحــد .



كود :
[color=#000000][COLOR=#007700]Class [/color][COLOR=#0000bb]Boris
[/COLOR][color=#007700]<[/color][color=#0000bb]MethodImpl[/color][color=#007700]([/color][color=#0000bb]MethodImplOptions[/color][color=#007700].[/color][color=#0000bb]Synchronized[/color][color=#007700])> [/color][COLOR=#0000bb]_
Sub PL[/COLOR][color=#007700]([/color][color=#0000bb]ByVal C [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
******************
[/COLOR][COLOR=#0000bb]End Sub  
[/COLOR][/COLOR]


وللحديث بقية ان شاء الله.


الملفات المرفقة
.rar   Multi Threads.rar (الحجم : 39.33 ك ب / التحميلات : 46)
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 2,268 06-10-12, 12:20 AM
آخر رد: RaggiTech
  تزامن المسارات Thread Synchronization RaggiTech 2 2,582 03-10-12, 08:35 AM
آخر رد: RaggiTech
  الطرائق المُوَسِّعة Extension Methods من جديد VB2008 RaggiTech 1 2,052 02-10-12, 07:31 PM
آخر رد: RaggiTech
  استخدام بحيرة المسارات Using the Thread pool RaggiTech 0 2,137 02-10-12, 01:36 AM
آخر رد: RaggiTech
  The FieldOffset &amp; Structayout Attributes RaggiTech 0 1,533 01-10-12, 06:48 PM
آخر رد: RaggiTech

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


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