رفتن به مطلب

آموزش نحوه استفاده از ترد (Thread) در Basic4Android


مجید آرتا

ارسال‌های توصیه شده

به نام خداوند بخشنده و مهربان

با عرض سلام و ادب به دوستان و کاربران عزیز انجمن AnswerCenter

بهترین هارو براتون آرزومندم و امیدوارم که همیشه شاد و خرم در کنار خانوادتون باشید

خب یک چند مدت میشه که بنده میخوام آموزشی رو در این زمینه قرار بدم اما متاسفانه یا وقت نمی کنم و یا به اینترنت دسترسی ندارم

ترد ها یکی مباحث خوب و شیرین در سیستم عامل هستن.ا

گر با پردازش موازی آشنایتی داشته باشید این موضوع رو درک می کنید و توی سیستم های چند پردازنده چند نخی و پردازش موازی به معنای واقعی خودش عمل می کنه ، یعنی انجام وظایف مختلف یک برنامه به وسیله چندین نخ در چندین پروسسور یا CPU.

اما نحوه عملکرد چند نخی در سیستم های تک پردازنده ای به چه شکل هستش ؟ خب توی تک پردازنده ای ها CPU  خیلی سریغ بین ترد ها سویئچ می کنه و این باعث میشه که ما به عنوان کاربر حس کنیم به صورت موازی برناممون داره پردازش میشه.

خب به نظرتون دلیل استفاده از روش چند نخی چی هستش ؟ بله درسته سرعت بالای اجرای فرامین و خود برنامه هستش

در دید کلی هر برنامه ای که اجرا میشه به عنوان یک پردازش یا پروسس شناخته میشه و هر پروسس دارای یک ترد اصلی هستش که وظیفه رندر کردن ui برنامه و به عنوان ترد مادر شناخته میشه ( Main Thread )

ما می تونیم از چندین ترد در برنامه هامون برای قسمت هایی که دارای پردازش سنگین هستن استفاده کنیم اما همیشه این رو بدونید استفاده ی بیش از حد هر چیزی درست و بجا نیست،همونطور که توی خوردن و آشامیدن این قاعده رو رعایت می کنیم توی سیستم عامل هم باید رعایت بشه،برای اینکه بهتر متوجه بشید می تونید مقاله های isi  و مقاله های استاندارد دیگه ای که در این زمینه هستش مطالعه کنید و اطلاعات بیشتری دستگیرتون بشه و بنده هم اطلاعاتم در این زمینه  سطحی و در حد مبتدی هستش.

 

شما فرض کن یک کارگاه کامپیوتر رو بهتون تحویل میدن و این کارگاه دارای 100 کامپیوتر هستش و از شما خواسته شده که تمامی کامپیوتر های کارگاه رو سرویس کنید.خب شاید به تنهایی بتونید انجام بدید ولی خب در نظر بگیرید بخوایید توی یک روز 100 تا سیستم رو سرویس کنید چی به سرتون میاد ؟ خسته کنندس ؟ حتی باعث میشه خسته بشید و درست از کار بکشید ( Force Close ).اما اگر شما 10 نفر باشید چطور ؟ آیا نمیتونید در عرض یک روز این کار رو بدون اینکه حتی ذره ای ففشار بیاد انجام بدید ؟ خیلی احساس خوبیه که کارها سریع پیش میرن درسته ؟ در این حالت خیلی راحت و با آرامش خاطر کارهارو انجام میدید دیگه ؟

خب پس ببینید چقدر ساده میفهمیم که با نقسیم کار می تونیم هم کیفیت کار رو ببریم بالا هم فشار کاری رو کم کنیم ، خب مشابهش هم توی برنامه هامون اتفاق میوفته.چطور ؟

(شما  ترد اصلی برنامه رو خودتون در نظر بگیرید که کارگاه رو بهتون محول کردن).شما به برنامه می گید که بیا 100 تا فایل رو از لینک های فلان دانلود کن بعد در مسیر خاصی قرار بده ، خب به نظرتون چی میشه ؟

آیا شما تونستید 100 تا کامپیوتر رو به راحتی به تنهایی سرویس کنید ؟ آیا با تقسیم کار نتونستید به راحتی انجام بدید و کیفییت کار رو بالا ببرید ؟ اینجوری می تونید به اهمیت ترد پی ببرید.

شاید مثال هایی که میزنم زیاد جالب نباشه ولی خب می تونید عمل های سنگین دیگه ای رو هم در نظر بگیرید واسه خودتون و تشبیه کنید به هم.

تمامی بازی هایی که ساخته میشن از این قاعده مستثنی نیستن،چرا ؟ چون یک ترد نمیتونه به تنهایی صدایی رو در برنامه پخش کنه و اجسام رو به حرکت در بیاره و کارهای مختلفی که در بازی ها انجام داده میشه این همه کار رو به تنهایی انجام بده پس اینجا خلایی حس میشه

ما برنامه هایی که میسازیم همشون روی ترد اصلی برنامه سوار هستن و این سرعت و کیفیت برنامه رو پایین میاره

پس به راحتی می تونیم برای پردازش های سنگین از ترد استفاده کنیم ( به صورت درست و برای هر عمل ساده ای استفاده نشه )،مثلا دانلود کردن فایل ، مثلا گرفتن اطلاعات زیادی از دیتابیس،مثلا گرفتن مخاطبین تلفن و غیره.

 

برای استفاده از ترد در بیسیک کتابخانه ای رو آقای Agraham  ساختن و فعلا مناسبترینش همین هستش و کتابخونه ی دیگه ای فک نکنم در این زمینه ساخته باشن.

فقط نکته ای رو باید بگم که زمان استفاده از ترد ما مستقیما نمی تونیم به اشیا دسترسی داشته باشیم،اشیا همون ویو های روی صفحه مانند لیست ویو ، ادیت تکست و لیبل و . . . . . 

برای دسترسی با اشیا باید به وسیله ترد اصلی این کار انجام بشه که توی کتابخونه ای که ساختن این تابع موجود هستش ( پس غصه نخورید ).

توی جاوا میومدیم به وسیله هندلر این کار رو انجام میدادیم.

 

خب یک نمونه کد از گرفتن مخاطبین بع وسیله ترد هستش قرارش میدم و توضیحی در مورد کدش میدم

Sub Process_Globals
    Dim cu As ContactsUtils
End Sub

Sub Globals
    Dim lstContacts As ListView
    Dim ImageView1 As ImageView
    Dim EditText1 As EditText
    Private lblPhonenum As Label
    Private lstPhonenums As ListView
    Dim TreadContacts As Thread

End Sub
Sub Contacts(org As Object) ' The thread
    Dim phonelist As List = org
    Dim Params(1) As Object   
    Log($"Contacs_started(${org})"$)
    'Log($"cu.FindContactsByPhone()"$)   
    For Each c As cuContact In cu.FindContactsByPhone("", False, False)
        Dim Map1 As Map
        Map1.Initialize
        Map1.Put("DisplayName",c.DisplayName)
        Map1.Put("Id",c.Id)
        'Log($"${c.DisplayName}"$)   
        'Log($"${c.Id}"$)   
        Dim phones As List
        phones.Initialize
        'Log($"cu.GetPhones(${c.Id})"$)   
      For Each phone As cuPhone In cu.GetPhones(c.Id)
            phones.Add(phone.Number)
            'Log($"Phone.Number(${phone.Number})"$)   
      'lstContacts.AddTwoLines2(c.DisplayName,Phone.Number, Phone)
    Next
        Map1.Put("Phones",phones)       
        phonelist.Add(Map1)
        Log($"Phonelist.Size ${phonelist.Size}"$)   
  Next
    Params(0) = phonelist
    ' The list is ready filled and is prepared to used by the next command which will send the reult to the mainthread
    TreadContacts.RunOnGuiThread("ContactsReady",Params)
    TreadContacts.Sleep(10)
End Sub
Sub Contacs_Ended(endedOK As Boolean, error As String) 'The thread has terminated. If endedOK is False error holds the reason for failure
    Log($"Contacs_Ended(${endedOK}, ${error})"$)
End Sub
Sub ContactsReady(contactslist As Object)
    Log($"ContactsReady()"$)   
    lstContacts.Clear
    Dim clist As List = contactslist
    For i=0 To clist.Size-1
        Dim contact As Map = clist.Get(i)
        lstContacts.AddTwoLines(contact.Get("DisplayName"),contact.Get("Id"))
        Dim phones As List = contact.Get("Phones")
        For o = 0 To phones.Size-1
            lstContacts.AddSingleLine(phones.Get(o))
        Next
        Log(clist.Get(i))       
    Next
End Sub
Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        cu.Initialize
    End If
    Activity.LoadLayout("1")
  Dim MyList As List
  MyList.Initialize

    TreadContacts.Initialise("Contacts")
  TreadContacts.Start(Me,"Contacts", Array As Object(MyList))

   
    'For Each c As cuContact In cu.FindAllContacts(True)
        'lstContacts.AddSingleLine2(c.DisplayName, c)
    'Next
End Sub

خب نکته دیگه ای که در مورد ترد باید بدونید اینه که کدهاتون رو باید در تابع بنویسید

 

حالا می پردازیم به کد های بالا

در ابتدا باید شما یک متغییر از ترد تعریف کنید و باید اینیشیالیز بشه

خب در ادامه هم که اینیشیالیز شد هر کجا که دوست داشتید ترد شروع به کار کنه اونجا از تابع Start استفاده می کنیم که این تابع 3 تا ورودی داره :

 

- ورودی اول : ماژولی که قراره ترد رو داخلش استارت کنیم که میزنیم Me

- ورودی دوم تابعی که کدهامون رو داخلش نوشتیم و قراره به وسیله این ترد اجرا بشه اسمش رو به صورت رشته بین " " قرار می دیم

- ورودی سوم هم بستگی به کاری که انجام میدید هستش

مثلا توی این مورد ما چون قراره لیستی از مخاطبین رو بگیریم و توی لیست ویو نمایش بدیم خب ما نیاز داریم که یک متغییر لیست داشته باشیم تا این مقادیر رو ذخیره کنیم

و این متغییر رو به ورودی سوم تابع نسبت بدیم

خب تابعی که مخاطبین رو فقط دریافت می کنه و داخل لیست قرار میده این تابع هستش Contacts.( ببینید توی این تابع فقط لیست مخاطبین گرفته میشن و توی لیست ویو قرار داده نمیشن. چرا ؟ چون گفتیم ترد به طور مستقیم نمیتونه به اشیا دسترسی داشته باشه.حالا توی همین تابع میگیم که چطور این کار رو توسط تابع دیگه ای و ترد اصلی انجام میدیم).

خب کد های این تابع به این شکل هستش که میاد تمامی مخاطبین رو میگیره که الگوریتمش از قبل توی سایت بنده و آقای ایزدی قرار داده بودیم و فقط در قالب یک ترد داریم اجراش می کنیم

در این تابع یک آرایه از نوع Object  تعریف کردیم (تک عنصره ):

Dim Params(1) As Object  

دلیل تعریف و کاربردش کجاس ؟ ما برای اینکه بتونیم لیست مخاطبینی رو که گرفتیم بتونیم توی لیست ویو نمایش بدیم باید به وسیله تابع RunOnGuiThread که مربوط به کتابخانه ترد هستش اینکار رو انجام بدیم و این تابع دوتا ورودی داره که ورودی اول اسم تابعی که ایتم ها به لیست ویو اضافه میشن و ورودی دوم آیتم هایی که قراره به لیست ویو اضافه کنیم باید قرار بدیم.یعنی باید متغییر لیستی که تعریف کردیم و قراره مخاطبین رو داخلش ذخیره کنه به این ورودی بدیم ولی ما مستقیما این لیست رو اینجا توی ورودی قرار نمیدیم،ما متغییر لیست رو یعنی phonelist  برابر با متغییر Params می کنیم.( متوجه دلیل تعریف این متغییر شدید دیگه )

 

در ادامه هم که مخاطبین رو در یک map میریزه و این map  رو میریزیم توی لیستمون.به جای map  می تونید لیست هم تعریف کنید.

 

این سه خط آخر کد تابع Contacts  رو ببینید :

   Params(0) = phonelist 
    TreadContacts.RunOnGuiThread("ContactsReady",Params)
    TreadContacts.Sleep(10

خب بعد از اینکه مخاطبین گرفته شد و توی لیست ریخته شد و بعد به متغییر params  واریز شد حالا وقت اینه که ما این مخاطبین رو برای کاربر به وسیله لیست ویو به نمایش در بیاریم

چون گفتم به وسیله تردی جز ترد اصلی نمیشه اشیا رو کنترل کرد، توی خود همین کتابخونه یک تابع برای همین ایجاد شده تا بتونید اشیا رو هم کنترل کنید.تابع هم RunOnGuiThread هستش

خب Sleep هم مربوط به وقفه ترد هستش یعنی ترد یک 10 میلی ثاانیه بیکار میمونه بعد شروع به کار می کنه.میتونید از 10 میلی ثانیه بیشتر کنید(اصن می تونید یک شمارنده بسازید با تابع ).

خب حالا تابع ContactsReady  اجرا میشه و میریم سراغ همین تابع ببینیم چی داره :

Sub ContactsReady(contactslist As Object)
    Log($"ContactsReady()"$)   
    lstContacts.Clear
    Dim clist As List = contactslist
    For i=0 To clist.Size-1
        Dim contact As Map = clist.Get(i)
        lstContacts.AddTwoLines(contact.Get("DisplayName"),contact.Get("Id"))
        Dim phones As List = contact.Get("Phones")
        For o = 0 To phones.Size-1
            lstContacts.AddSingleLine(phones.Get(o))
        Next
        Log(clist.Get(i))       
    Next
End Sub

کدها خیلی ساده و خوانا هستن.تنها کاری که کرده اومده ورودی تابع که همون لیست مخاطبین هستش رو گرفته توی لیست ویو اضافه کرده.

در ضمن ترد رویدادی داره به اسم Ended که می تونید توی این تابع ترد که کارش تموم شد یک پیغامی چیزی چاپ کنید و یا یک عمل خاصی رو انجام بدید

 

این کتابخونه توابع دیگه ای هم داره ولی اونارو خودتون تست و تمرین کنید.کار اصلی رو ما با 2 تا تابع زیر انجام میدیم »

  • Start
  • RunOnGuiThread 

فهمیدیم که چه زمانی از RunOnGuiThread  استفاده کنیم و اصلا برای چی استفاده میشه

کلا مبحث ترد ها راحته و شیرینه،فقط باید کمی کار کنید باهاش

نمیدونم تونستم مفهوم رو برسونم یا نه.

ولی در هر صورت امیدوارم که مفید و موثر واقع بشه.

کتابخونش رو هم یکی از دوستان پیوست کنه.و دوستان این کد هارو در پروژه ای جدا قرار بدن و پروژه رو تست کنن اگه خطایی چیزی داره رفع کنن و پروزه رو هم پیوست کنن تا دوستان دیگه هم استفاده کنن.

اگه قسمت بشه آموزش تصویریش رو اقای ایزدی و یا بنده آماده می کنم ( بنده قول نمیدم ).

این آموزش اختصاصی از انجمن AnswerCenter  هستش.

خداوندا چنان کن سرانجام کار که تو خشنود باشی ما رستگار.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ماشالله 

عجب حوصله ی داری اینهمه رو مینویسی

استاد به این میگن

:heart:  :heart:  :heart:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

تشکر کردن با کلید کم بود

طبق همیشه عالی بود مجید جان  :kiss3:

خسته نباشی واقعا

امثال مجید آرتا در فضای مجازی خیلی کم گیر میان  :53:  من خیلی خوش شانش بودم و هستم که مجید آرتا رو 4-5 ساله که کنار خودم دارمش  ♥

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ماشالله 

عجب حوصله ی داری اینهمه رو مینویسی

استاد به این میگن

:heart:  :heart:  :heart:

من کوچیک همه ی بچه های انجمن هستم استاد خداست  :53: 

 

 

تشکر کردن با کلید کم بود

طبق همیشه عالی بود مجید جان  :kiss3:

خسته نباشی واقعا

امثال مجید آرتا در فضای مجازی خیلی کم گیر میان  :53:  من خیلی خوش شانش بودم و هستم که مجید آرتا رو 4-5 ساله که کنار خودم دارمش  ♥

 

مثل همیشه پر نشاط و با انرژی  ♥ 

قوت قلبی واسه همه توی انجمن مهدی جان  :53: 

دارم درس پس میدم مهدی جان  :give_rose:  :53:  چاکرتم  :53: 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

استاد آرتا مرسی واقعا دم شما رو گرم که وقتتون رو برا انجمن میزارید...

  :53:   :give_rose:  :heart:  خسته نباشی استاد :heart:  :heart:  :53:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

  • 3 ماه بعد...

با سلام و تشکر خدمت شما دوست عزیز :areuok: 

 

اسم کتابخانش یا لینک دانلودش رو اگه محبت کنید ممنون میشم. :fekr: 

 

کارتونم بیسته مهندس :53:  :53: 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

با سلام و تشکر خدمت شما دوست عزیز :areuok: 

 

اسم کتابخانش یا لینک دانلودش رو اگه محبت کنید ممنون میشم. :fekr: 

 

کارتونم بیسته مهندس :53:  :53: 

 

بفرمایید 

Threading.rar

لینک ارسال
به اشتراک گذاری در سایت های دیگر

تشکر

 

ای کاش فیلم آموزش گام به گام کار با Thread (نخ) هم موجود بود.

 

 

 سلام

نمونه سورس چند نخی رو براتون ضمیمه کردم که یک شبیه ساز پیانو هست

سورس بسیار ساده هست

موفق باشید

Piano.zip

لینک ارسال
به اشتراک گذاری در سایت های دیگر

لینک ارسال
به اشتراک گذاری در سایت های دیگر

عالی بود مجید جان واقعا که استاد همه ماییییی

لینک ارسال
به اشتراک گذاری در سایت های دیگر

  • 2 هفته بعد...

 سلام

نمونه سورس چند نخی رو براتون ضمیمه کردم که یک شبیه ساز پیانو هست

سورس بسیار ساده هست

موفق باشید

مهندس تشکر نمی دونم چطور محبتتون رو جبران کنم.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...