مجید آرتا 5,874 ارسال شده در 11 اردیبهشت، ۱۳۹۵ اشتراک گذاری ارسال شده در 11 اردیبهشت، ۱۳۹۵ به نام خداوند بخشنده و مهربان با عرض سلام و ادب به دوستان و کاربران عزیز انجمن 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 هستش. خداوندا چنان کن سرانجام کار که تو خشنود باشی ما رستگار. لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
mehrabmmp 528 ارسال شده در 11 اردیبهشت، ۱۳۹۵ اشتراک گذاری ارسال شده در 11 اردیبهشت، ۱۳۹۵ ماشالله عجب حوصله ی داری اینهمه رو مینویسی استاد به این میگن لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
مهدی ایزدی 9,203 ارسال شده در 11 اردیبهشت، ۱۳۹۵ اشتراک گذاری ارسال شده در 11 اردیبهشت، ۱۳۹۵ تشکر کردن با کلید کم بود طبق همیشه عالی بود مجید جان خسته نباشی واقعا امثال مجید آرتا در فضای مجازی خیلی کم گیر میان من خیلی خوش شانش بودم و هستم که مجید آرتا رو 4-5 ساله که کنار خودم دارمش لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
مجید آرتا 5,874 ارسال شده در 11 اردیبهشت، ۱۳۹۵ سازنده اشتراک گذاری ارسال شده در 11 اردیبهشت، ۱۳۹۵ ماشالله عجب حوصله ی داری اینهمه رو مینویسی استاد به این میگن من کوچیک همه ی بچه های انجمن هستم استاد خداست تشکر کردن با کلید کم بود طبق همیشه عالی بود مجید جان خسته نباشی واقعا امثال مجید آرتا در فضای مجازی خیلی کم گیر میان من خیلی خوش شانش بودم و هستم که مجید آرتا رو 4-5 ساله که کنار خودم دارمش مثل همیشه پر نشاط و با انرژی قوت قلبی واسه همه توی انجمن مهدی جان دارم درس پس میدم مهدی جان چاکرتم لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
mahdi tahan 723 ارسال شده در 11 اردیبهشت، ۱۳۹۵ اشتراک گذاری ارسال شده در 11 اردیبهشت، ۱۳۹۵ استاد آرتا مرسی واقعا دم شما رو گرم که وقتتون رو برا انجمن میزارید... خسته نباشی استاد لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
y-khezri 0 ارسال شده در 22 مرداد، ۱۳۹۵ اشتراک گذاری ارسال شده در 22 مرداد، ۱۳۹۵ با سلام و تشکر خدمت شما دوست عزیز اسم کتابخانش یا لینک دانلودش رو اگه محبت کنید ممنون میشم. کارتونم بیسته مهندس لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
حاج حسین 2,098 ارسال شده در 23 مرداد، ۱۳۹۵ اشتراک گذاری ارسال شده در 23 مرداد، ۱۳۹۵ با سلام و تشکر خدمت شما دوست عزیز اسم کتابخانش یا لینک دانلودش رو اگه محبت کنید ممنون میشم. کارتونم بیسته مهندس بفرمایید Threading.rar لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
y-khezri 0 ارسال شده در 23 مرداد، ۱۳۹۵ اشتراک گذاری ارسال شده در 23 مرداد، ۱۳۹۵ بفرمایید تشکر ای کاش فیلم آموزش گام به گام کار با Thread (نخ) هم موجود بود. لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
megacpu 16 ارسال شده در 24 مرداد، ۱۳۹۵ اشتراک گذاری ارسال شده در 24 مرداد، ۱۳۹۵ تشکر ای کاش فیلم آموزش گام به گام کار با Thread (نخ) هم موجود بود. سلام نمونه سورس چند نخی رو براتون ضمیمه کردم که یک شبیه ساز پیانو هست سورس بسیار ساده هست موفق باشید Piano.zip لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
مجید آرتا 5,874 ارسال شده در 26 مرداد، ۱۳۹۵ سازنده اشتراک گذاری ارسال شده در 26 مرداد، ۱۳۹۵ اینم لینک آموزش تصویری کار با ترد » http://answercenter.ir/topic/15712-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1%DB%8C-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-thread-%D8%AF%D8%B1-basic4android/ لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
Hamidbergis 332 ارسال شده در 26 مرداد، ۱۳۹۵ اشتراک گذاری ارسال شده در 26 مرداد، ۱۳۹۵ عالی بود مجید جان واقعا که استاد همه ماییییی لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
y-khezri 0 ارسال شده در 3 شهریور، ۱۳۹۵ اشتراک گذاری ارسال شده در 3 شهریور، ۱۳۹۵ سلام نمونه سورس چند نخی رو براتون ضمیمه کردم که یک شبیه ساز پیانو هست سورس بسیار ساده هست موفق باشید مهندس تشکر نمی دونم چطور محبتتون رو جبران کنم. لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
ارسالهای توصیه شده
بایگانی شده
این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.