PDA

View Full Version : سوال: نحوه ساخت Thread و استفاده در برنامه



AmirAmiri
شنبه 21 اردیبهشت 1387, 21:55 عصر
سلام دوستان من میخوام تو برنامه هایی که از این به بعد مینویسم از Tread استفاده کنم میشه آموزش ساخت Tread رو بگید. لطفاً سورس نزارید بگید بیاد اینم Tread خواهش میکنم به طور مفصّل توضیح بدید. امیدوارم کمک کنید.
توضیح برای اونایی که نمیدونن Tread چیه :
Tread یا نخ LWP فرآیندیه که باعث جلوگیری از هنگ کردن برنامه میشه یعنی باعث افزایش امکان محاوه کاربر با فرآیند در حال اجرا میشه (فرآیند هم همون برنامه در حال اجراست).
از همه مهم تر برای نوشتن برنامه های حرفه ای که بتونن تو معماری چند پردازنده ای به اجرا در بیان به کار میره.
زمانی که شما یک برنامه معمولی مینویسید در واقع شما هیچ Tread درست نکردید و اگر برنامه به بردازش سنگین بر بخورده به حالت Not Responding میره و از حالت محاوره ای خارج میشه. اما زمانی که شما در برنامه از Tread استفاده میکنید مثله اینه که هر قسمت از برنامه به صورت جداگانه در CPU پردازش بشه و هیچ وقت برنامه هنگ نمیکنه. البته استفاده از Tread ها کار هر کی هر کی نیست چون خطا یابیه اون خیلی سخته.
اگر بازم متوجه نشدید که Tread چیه این مثال میتونه کمک بزرگی براتون باشه:
فرض کنید ما تو برنامه به یک زیر برنامه بر میخوریم


CopyFile("C:\Test.dat" , "D:\test.dat")
.
.
.
.
Dim strName As string = InputBox("Enter your name : ")
در اینجا تا زمانی که زیر برنامه CopyFile به اتمام نرسه دستورات بعد از اون به اجرا در نمیاد ولی با استفاده از Tread میشه کاری کرد که بعد از اجرای دستور CopyFile برنامه منتظر نمونه و بقیه دستورات اجرا بشه در اینجا اجرای اون تکه کد به عهده Tread هست و برنامه به صورت محاوره ای است یعنی با هر عمل کاربر برنامه یک پاسخ از خودش نشون میده. در این حالت کاربر هیچ وقت احساس نمیکنه CPU در حال پردازش چیزی است و به نظرش CPU در اختیار او هست.
خب تا اینجا توضیحش با من بود از اینجا به بعد آموزشش با دوستان هست دیگه. من منتظرم.

AmirAmiri
شنبه 21 اردیبهشت 1387, 22:22 عصر
ببینید دوستان من خودم نحوه استفاده از Tread رو بلدم اما نمیدونم که باید دقیقا کجا ها از استفاده بشه. مثلا همون کد بالا میتونه به این شکل باشه


Dim Thread as new system.Threadning.Thread(AddressOf CopyFile("C:\Test.dat" , "D:\test.dat"))
Thread.Start
.
.
.
.
Dim strName As string = InputBox("Enter your name : ")
اما میخوام مثلا بدونم که اگه کاربر قبل اتمام عمل کپی برنامه رو ببنده چه اتفاقی می افته؟ و برای مقابله با چنین اتفاقهایی چه راهکار هایی وجود داره؟

Evil 69
شنبه 21 اردیبهشت 1387, 23:38 عصر
اگر کاربر قبل از اتمام کار برنامه رو ببنده مثل اینه که شما هنگام کپی کردن یک سری فایل کلید cncel رو بزنی
از نخ ها در موارد زیادی میشه استفاده کرد مثلا در مواردی که حجم داده هایی که نیاز به ÷ردازش دارن بالا باشه و از طرفی از ÷ردازش باید در هنگام لود شدن برنامه باشه خوب حالا در این چنین موارد شما میتونین از نخ ها استفاده کنین البته باید این نکته رو هم بگم که سیستم عامل به شما قول هیچ کمکی رو نمیده و فقط از نخ های برنامه ی شما ÷شتیبانی میکنه یعنی فقط میذاره شما نخ تولید کنی کنترل نخ ها با خودتونه که این هم یک امر نسبتا سخت است

AmirAmiri
یک شنبه 22 اردیبهشت 1387, 00:07 صبح
سلام علی جان. ممنون از نظرت. ولی میبینم که داری حرفهای استاد زجاجی رو تحویله من میدی...!!!


سیستم عامل به شما قول هیچ کمکی رو نمیده و فقط از نخ های برنامه ی شما ÷شتیبانی میکنه یعنی فقط میذاره شما نخ تولید کنی کنترل نخ ها با خودتونه که این هم یک امر نسبتا سخت است


عزیزم منم واسه همین گفتم که کاره هر کی هر کی نیست دیگه. اصلا پستها رو خوندی؟

من منظورم این نبود که بیاید بگید مانند cancel کردنه میخوام یکی همه چیز بلد بیاد و تمام دستورات thread رو تو این تاپیک آموزش بده. میخوام تمام دستوراتش رو یاد بگیرم یک به یک و مو به مو. حالا اگر کسی میتونه لطفا بیاد و آموزششو بزاره تا همه استفاده کنن. ممنون.

Hossein Bazyan
یک شنبه 22 اردیبهشت 1387, 00:48 صبح
سلام
خیلی عالی میشه .

Hossein Bazyan
یک شنبه 22 اردیبهشت 1387, 16:32 عصر
سلام
من چندی پیش فایل pdf زیر را پیدا کردم نمیدانم به درد میخورد یا نه
به هر حال آپلودش میکنم

AmirAmiri
یک شنبه 22 اردیبهشت 1387, 19:50 عصر
سلام حسین آقا خیلی ممنون به خاطر فایل pdf ولی این آموزش ماله vb6 هست اگر چیزی در مورد دستورات کامل thread در VB.Net داشتید خیلی ممنون میشم بذارید.

rezaei manesh
دوشنبه 23 اردیبهشت 1387, 09:53 صبح
سلام
در دات نت 2005 backgroundWorker اومده که این کار رو انجام می ده اما کار باهاش یکم سخت هستش و..
من با همین thread می خوام وقتی روی دکمه کلیک شد، یک فرم که حاوی یک progressbar و یک labelهست نمایش داده بشه و داخل حلقه ای مشخص که در فرم اول هست مقادیر این این دو کنترل عوض بشه
حالا من می تونم که یه فرم نمایش بدم و مثلا بعد نمایش اون فرم همراه حلقه یک مسج باکس بدم اما نمی تونم از کنترل های اون فرم استفاده کنم چون مجبورم که تابع موجود در فرم 2 رو public shared تعریف کنم و..
چطور اینکار رو انجام بدم؟

AmirAmiri
دوشنبه 23 اردیبهشت 1387, 10:39 صبح
سلام دوست عزیز. فکر میکنم بهتر بود یه تاپیک جدید برای مشکلتون میزدید به هر حال... شما قصد دارید کنترلهای فرم دوم رو از داخل فرم اول مفدار دهی کنید این کار چه لزومی داره خوب تو همون فرم دوم مقدار دهی کنید و با استفاده از thread اونارو اجرا کنید البته تو همون فرم دوم باید از thread استفاده کنید.

rezaei manesh
دوشنبه 23 اردیبهشت 1387, 11:09 صبح
سلام
من نخاستم تاپیک با موضوع یکسان بزنم و اینکه فکر کردم بهتره که بحث های با موضوع یکسان در یک جا باشند این طوری برای آیندگان راحت تر هستش
امیر جان اگر من می خوام فرم 2 رو از داخل فرم یک مقدار بدم حتماً دلایلی دارم عزیز جان و...
مثلا من حدود 10 فرم دارم که باید با این فرم 2 کار کنند حالا من باید 10 تا تابع در فرم 2 بنویسم و هر بار یکی فراخوانی کنم خوب چه کاریه در ضمن و کالکشن های رو در فرم یک پر کرده دارم چه دلیلی داره اونا رو ببرم به فرم 2 و...

AmirAmiri
دوشنبه 23 اردیبهشت 1387, 11:32 صبح
دوست عزیز اگه من درست متوجه شده باشم این کد باید مشکل شما رو حل کنه.



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Form2.ProgressBar1.Value += 1
End Sub


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

rezaei manesh
دوشنبه 23 اردیبهشت 1387, 11:35 صبح
سلام
ممنون از توجه شما اما من می خوام تغییرات به پراپرتی های فرم 2 فرستاده شود و در فرم 2 اون پراپرتی ها در جاهای مربوطه قرار گیر نه اینکه من از فرم یک این کار رو مستقیم با کنترل های اون انجام بدم و...
به هر حال ممنون از توجه ای که می کنید.

AmirAmiri
دوشنبه 23 اردیبهشت 1387, 11:43 صبح
میشه در مورد برنامه توضیح بدید مثلا برنامه قراره چه کاری انجام بده و اینکه چه پرارتی هایی قراره تغییر کنه و پراپرتی ها چه کاری انجام میدن و اینکه اینا رو میخواید با thread انجام بدید یا فرقی نمیکنه. فکر کنم اگه توضیح بدید بیشتر بشه کمک کرد چون الان مسئله خیلی گنگه مثلا من متوجه نشدم منظور شما چیه...

rezaei manesh
دوشنبه 23 اردیبهشت 1387, 11:53 صبح
ببینید
در فرم 1 یک دکمه هست که با زدن اونو مثلا 500 تا پرسنل باید یکی یکی پس از محاسبات برای هرکدوم به گراید اضافه بشند حالا من می خوام وقتی داره این کار صورت می گیره یک فرم(2)باز بشه و نام پرسنل و میزان پیشرفت پراگرس بار در فرم 2 نمایش داده بشه و می خوام میزان پیشرفت و نام پرسنل به پراپرتی های خودشون در فرم 2 فرستاده بشن و اونجا با فراخانی تابع مورد نظر این عمل صورت بگیره
همین
کد فرم2:


Private Sub FrmProgressBar_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.PrgB1.Maximum = Me.IntMaxProgress
Me.PrgB1.Value = 0
Me.PrgB1.Step = 1


End Sub
Public Sub changeProgress()
Me.LblStatus.Text = Me.StrMessageList

Threading.Thread.Sleep(200)
Me.PrgB1.PerformStep()

End Sub

اینم فرم1


Private Sub ButtPerYearAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtPerYearAll.Click
Dim f As New FrmProgressBar
With f 'My.Forms.FrmProgressBar
.MaxProgress = 100
Dim th As New Threading.Thread(AddressOf FrmProgressBar.changeProgress)
th.Start()
.ShowDialog()

For i As Int16 = 0 To 500
.MessageListValue = "حامد : " & i
th.Join()
Next
.Close()
End With

End Sub