PDA

View Full Version : سوال: ارسال تابع به یک کلاس thread به عنوان پارامتر



parsdarab
دوشنبه 16 اسفند 1389, 10:28 صبح
چطوری میشه آدرس یک تابع را به عنوان یک پارامتر به یک کلاس فرستاد و اون کلاس بتونه اون تابع رو شروع به اجرا کنه.
به کد زیر نگاه کنید.


Public Class thread
Dim Stat_1 AsStatC
Dim Tr As Threading.Thread
Public Enum StatC
vbStop = 0
vbRun = 1
vbPause = 2
End Enum
Public Sub _Start()
If Stat_1 = StatC.vbStop Then
Me.Tr = New Threading.Thread(New Threading.ThreadStart(AddressOfMe.Roshan))
Tr.Priority = Threading.ThreadPriority.Highest
Tr.Start()

End If
End Sub
Public Sub _Resume_()
If Not IsNothing(Tr) Then Tr.Resume()
Stat_1 = StatC.vbPause
End Sub
Public Sub _Pause()
If Not IsNothing(Tr) Then Tr.Suspend()
Stat_1 = StatC.vbPause
End Sub
Public Sub _Stop()
If Not IsNothing(Tr) Then Tr.Abort()
Stat_1 = StatC.vbStop
Form1.Cursor = Cursors.Default
End Sub
Private Sub Roshan()
Try
If Form1.FolderBrowserDialog1.ShowDialog = DialogResult.OK Then
Form1.TreeView1.Nodes.Clear()
Dim nd AsNewTreeNode
Dim inifolder AsString = Form1.FolderBrowserDialog1.SelectedPath.ToString
nd = Form1.TreeView1.Nodes.Add(inifolder)
'Me.Show()
Application.DoEvents()
Form1.Cursor = Cursors.WaitCursor
ScanFolder(inifolder, nd)
Form1.Cursor = Cursors.Default
End If
Catch ex AsException
End Try
End Sub
End Class
 
 


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



با تشکر از کسانی که بتونن به این سئوال پاسخ دهند

:متفکر:

محسن شامحمدی
دوشنبه 16 اسفند 1389, 16:50 عصر
راه حل این مشکل دست Delegate هاست.
کدتون رو به این صورت تغییر بدید.

این رو به کلاستون اضافه کنید

Public Delegate Sub Testsub()


حالا کد تابع Start تون رو به این صورت تغییر بدید.
Me.Tr = New Threading.Thread(New Threading.ThreadStart(AddressOf YourSub.Invoke))

حالا یک نمونه از طریقه استفاده این کد به اینصورته:
Private Sub main() Handles MyBase.Load
Dim a As New thread()
a._Start(AddressOf mywork)
End Sub

Private Sub mywork()
MsgBox("a")
End Sub

parsdarab
سه شنبه 17 اسفند 1389, 12:28 عصر
67238
ارور بالا رو می ده؟

محسن شامحمدی
سه شنبه 17 اسفند 1389, 19:45 عصر
شرمنده این خط رو یادم رفت
Public Sub _Start(ByVal Yoursub As Testsub)

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