PDA

View Full Version : سوال: شمارش اعداد با mutithreading



yako_yako
سه شنبه 07 مهر 1388, 12:27 عصر
سلام
خسته نباشید دوستان
راستش در مورد mutithreading تو سایت چیزایی پیدا کردم
اما متاسفانه چون مبتدیم نتونستم کاری رو که میخوام باهاش انجام بدم
لطفا اگر امکانش هست توسط mutithreading یک برنامه ساده بنویسید که توسط یه حلقه For از 1 تا 1000000 رو شمارش کنه و در listbox قرار بده طوری که برنامه فریز نشه
با تشکر از شما

masoodinfo
پنج شنبه 09 مهر 1388, 17:26 عصر
Imports System.Threading
Public Class Form1
Dim Tadd As Thread
Delegate Sub addtolistdelegate(ByVal s As Integer)
Dim addtolist As addtolistdelegate
Sub sub_addtolist(ByVal s As Integer)
ListBox1.Items.Add(s)
End Sub
Sub thread_working()
For i As Integer = 0 To 100000000
ListBox1.Invoke(addtolist, i)
Thread.Sleep(100)
Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
addtolist = AddressOf sub_addtolist
Tadd = New Thread(AddressOf thread_working)
Tadd.IsBackground = True
Tadd.Start()

End Sub
End Class

yako_yako
پنج شنبه 09 مهر 1388, 18:44 عصر
خیلی ممنونم از شما
میشه درباره کدها هم یه توضیحی بدین؟
ممنون میشم

masoodinfo
پنج شنبه 09 مهر 1388, 20:38 عصر
با سلام .
بله حتما ولی خودم هم زیاد وارد نیستم.:لبخند:

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


Delegate Sub addtolistdelegate(ByVal s As Integer)

در کد بعدی ایجاد یک متغییر از نماینده می باشد.



Dim addtolist As addtolistdelegate


حالا باید آدرس تابعی که دارای پارامتر های مساوی با نماینده ی تعریف شده در بالا را به متغییر addtolist بدهید.این کار حداقل یک بار باید انجام شود.اجرای چند باره این کد هم تاثیری ندارد.



addtolist = AddressOf sub_addtolist


سپس در تابعی که برای thread نوشته شده با استفاده از متد Invoke شی مورد نظر امکان دست رسی برای ایجاد تغییرات در شی خواهد بود.
این متد دارای دو پارامتر می باشد:
1- متغییری که از جنس نماینده باشد ( در مثال ما : addtolist)
2- پارامتر های تابعی که متغییر addtolist به آن اشاره دارد.

با thread ها به راحتی می توانید با پایگاه داده هم کار کنید.

انشاالله که تونسته باشم مطلب رو برسونم.
موفق باشید.

mina.net
پنج شنبه 30 مهر 1388, 16:49 عصر
سلام دوستان
با جستجو این تاپیک رو که یک کم ازش گذشته بود رو بالا آوردم.
هر چند جناب masoodinfo در رابطه با کدی که گذاشتند توضیح دادن ولی من از منطق این کد هیچی سر در نیاوردم. اگه می شه یکی بیشتر توضیح بده. البته کد اجرا شد و مشکلی نداشت منتها من می خوام از روش کار Thread سر در بیارم و هر جای براساس نیاز خودم از اون استفاده کنم.
اگه می شه یکی این موضوع رو برام بیشتر باز کنه.

mina.net
پنج شنبه 30 مهر 1388, 17:11 عصر
Imports System.Threading
PublicClass Form1
PublicSharedSub ThreadProc()
MsgBox("")
Thread.Sleep(0)
EndSub
PublicSharedSub Main()
Dim t AsNew Thread(AddressOf ThreadProc)
t.Start()
Thread.Sleep(0)
t.Join()
EndSub
PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
Main()
EndSub
EndClass

این کد رو هم از msdn گرفتم البته با یک کم تغییرات. حالا با منطق برنامه یک کم آشنا شدم یعنی تازه فهمیدم چطور باید Thread تعریف و سپس فراخوانی کرد.
می خوام در مورد Thread بیشتر بدونم. لطفا کمک کنید.
راستی خط کد Thread.Sleep(0) چه عملی انجام می ده ؟؟؟؟ چون وقتی برداشتمش هم برنامه به خوبی اجرا شد.

mina.net
پنج شنبه 30 مهر 1388, 17:21 عصر
آیا راهی وجود دارد تا بفهمیم یک Threadدر حال اجرا هست و از فراخوانی مجدد اون جلوگیری کنیم یا بابد از خودمون با استفاده از الگوریتم ها این کار رو بکنیم؟

masoodinfo
شنبه 09 آبان 1388, 20:40 عصر
با سلام

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