PDA

View Full Version : سوال در مورد Multithreading



امین مستانی
سه شنبه 03 بهمن 1391, 10:08 صبح
سلام خدمت اساتید گرامی

یک سوال در مورد چند نخی یا همون Multithreading داشتم .

وقتی ما توی یک نخ از یک تابع سنگین استفاده کنیم که مثلا اجراش 10 دقیقه زمان ببره (از وب بروزر استفاده شده) میتونیم همزمان توی یک نخ دیگه از همون تابع استفاده کنیم ؟؟

اینجوری تابع قاطی نمیشه ؟؟ :متفکر::لبخند:

متشکرم

tstsst
سه شنبه 03 بهمن 1391, 11:05 صبح
سلام
هر نخ فقط از کنترول که پابلیک باشه یا مال خودش باشه می تونه استفاده کنه و وببروزر رو تا در فرمی نباشه اکتیو اکس اجازه تغیر آدرس رو نمی ده (Unable to get the window handle for the 'WebBrowser' control. Windowless ActiveX controls are not supported.) ولی از باقی امکانات میشه استفاده کرد .

ولی می تونی این طوری بنویسی


Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim th1, th2 As Thread
th1 = New Thread(AddressOf t1)
th2 = New Thread(AddressOf t2)
WebBrowser1.Navigate("google.com")
th1.Start(WebBrowser1)
th2.Start(WebBrowser1)
End Sub
Dim web As WebBrowser
Sub t1(ByVal e As Object)
web = e
web.Navigate("fSD")
End Sub
Sub t2(ByVal e As Object)
web = e
web.Navigate("gfd")
End Sub

امین مستانی
سه شنبه 03 بهمن 1391, 11:19 صبح
منظور من اینه که واسه هر تابع یک وب بروزر تعیین کنیم مثلا :


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Web(WebBrowser1)
End Sub

Function Web(Wb As WebBrowser)
'Code
Wb.Navigate("Test.com")
'Code
End Function



ولی تابع عملیاتش خیلی طولانی باشه مثلا 10 دقیقه طول بکشه . آیا استفاده همزمان در نخ ها باعث تداخل نمیشه ؟؟؟

tstsst
سه شنبه 03 بهمن 1391, 11:23 صبح
باعث کند شدن اینترنت شبکه می شه ولی تداخلی نباید ایجاد کنه و سرعت برنامه هم بسته به مشخصات سیستم کند میشه. برای سرعت بیشتر بروزر هم می تونید از انجین های دیگه استفاده کنید.

امین مستانی
سه شنبه 03 بهمن 1391, 12:24 عصر
یک سوال دیگه :

آیا میشه موقع اجرا یا همون ران تایم نخ جدید ایجاد کرد ؟؟ مثل بروز ها که هر تب جدید که اضافه میشه وظیفه اون تب رو به نخ جدید میده .
فکر کنم باید از آرایه استفاده کرد درسته ؟؟

متشکرم

tstsst
سه شنبه 03 بهمن 1391, 13:32 عصر
نخ های th1 ,th2 رانتایم ساخته شدن !
اینجوری هم میشه نوشتش

Dim th As Thread
th = New Thread(AddressOf t1)
th.Start(WebBrowser1)
th = New Thread(AddressOf t2)
th.Start(WebBrowser1)

اگر هم بخوای همزمان تعداد زیادی داشته باشی

Dim Thlst As New List(Of Thread)
For i = 0 To 100
Dim trd= New Thread(AddressOf t1)
'trd.Start()
Thlst.Add(trd)
Next

امین مستانی
سه شنبه 03 بهمن 1391, 16:39 عصر
ولی فکر نکنم اینجوری باشه جون اینم باز توی کدنویسیه دیگه :اشتباه::اشتباه:

من اینجوری استفاده میکنم و جواب میده . همه نخ ها یک اسم دارن . درسته ؟؟


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim T As New System.Threading.Thread(AddressOf Web)
T.IsBackground = True
T.Start(WebBrowser1)
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim T As New System.Threading.Thread(AddressOf Web)
T.IsBackground = True
T.Start(WebBrowser2)
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim T As New System.Threading.Thread(AddressOf Web)
T.IsBackground = True
T.Start(WebBrowser3)
End Sub

Function Web(Wb As WebBrowser)
Wb.Navigate("google.com")
SleepFor(5)
Wb.Navigate("yahoo.com")
End Function

tstsst
سه شنبه 03 بهمن 1391, 21:44 عصر
اون کدی که نوشتم

Dim Thlst As New List(Of Thread)

لیستی از نخ هاست و می تونی این طوری استفاده کنی استفاده کنی

Thlst(1).start
Thlst(2).start
Thlst(3).start
Thlst(n).start