PDA

View Full Version : مشکلی در "چند سر نخ کشی"



MohsenPS
دوشنبه 04 آذر 1387, 20:43 عصر
سلام،
در قطعه کدی شبیه کد زیر میخوام با استفاده از نخ کشی، در سابروتین F تایمر Timer1 رو فعال کنم ، اما نمیشه !

Public Class Form1
Private Th As Threading.Thread


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 1000
Timer1.Enabled = False
Th = New Threading.Thread(AddressOf F)
Th.Start()
End Sub


Private Sub F()
Timer1.Enabled = True
End Sub


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
MsgBox("OK")
End Sub
End Class

راه حل این مشکل چیه؟

reza1944
سه شنبه 05 آذر 1387, 01:02 صبح
با عرض پوزش این کد اشتباه بود

rooshan2008
سه شنبه 05 آذر 1387, 01:32 صبح
کد
Th = New Threading.Thread(AddressOf F)

نمیتونه سابروتن f فراخوانی کنه



PublicClass Form1
Private Th As Threading.Thread

PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
Timer1.Interval = 1000
Timer1.Enabled = False
'فراخوانی سابروتن
f()
EndSub

PrivateSub f()
Th = New Thread(AddressOf f)
Th.Start()
Timer1.Enabled = True
EndSub

PrivateSub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
MsgBox("OK")
EndSub
EndClass

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

reza1944
سه شنبه 05 آذر 1387, 20:41 عصر
من از دیشب فکر میکنم رو این مثئله مشل شما با Thread است که حل میشه!
بعدش هم یک Thread نمیتونه یک ساب رو فراخانی کنه

MohsenPS
سه شنبه 05 آذر 1387, 22:33 عصر
با تشکر از دوستان عزیز،
کدی که در ابتدای تاپیک مطرح کردم در واقع یک نمونه ساده است که ممکنه در عمل خیلی پیچیده تر باشه، همون طور که دوست خوبمون rooshan2008 اشاره کردن مسئله اصلی اینه که چطوری میشه در یک سابروتین فراخوانی شده بوسیله نخ کشی، تایمر مورد نظر رو فعال کنیم ؟


راستی آقای reza1944 اینکه گفتین :

بعدش هم یک Thread نمیتونه یک ساب رو فراخانی کنه
هم درست نیست هم عجیبه (:متفکر:)

reza1944
چهارشنبه 06 آذر 1387, 02:37 صبح
شما یک نمونه بزارید که بشه توی همینشم گیر کردین تا چه برسه به پیچیده تر

rooshan2008
چهارشنبه 06 آذر 1387, 12:30 عصر
شما یک نمونه بزارید که بشه توی همینشم گیر کردین تا چه برسه به پیچیده تر

به نیابت من یک مثال برای آقایreza1944 بزنم



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim TH = New Threading.Thread(AddressOf Roshan)
TH.Start()
End Sub

Private Sub Roshan()
CallProc()
End Sub

Private Sub CallProc()
MsgBox("ok")
End Sub

این هم که گفته بودی ساب رو نمیشه فراخونی کنه.دیدیم که شد.:چشمک:

بعد من به یک نتیجه رسیدم شما اگه داخل تابع مرتبط با نخ خودتون یک Msgbox بکار ببرید timer بکار می افته ...عجیبه:متفکر:(داخل تابع f)

mostafaaa
چهارشنبه 06 آذر 1387, 13:26 عصر
مشکل شما به این علت پیش اومده که شما از Timer کلاس Windows.Forms استفاده کردی و زمانی که رویداد این تایمر از داخل یه نخ فراخوانی میشه توی یه صف(queue) دیگه خارج از صف اصلی برنامه اضافه میش و طبیعتا dispatch هم نمیشه. راه حل مشکل اینه که به جای این :

Dim WithEvents Timer1 As New System.Windows.Forms.Timerاز این

Dim WithEvents Timer1 As New System.Timers.Timerیا این

Dim WithEvents Timer1 As New System.Threading.Timerاستفاده کنید.

Public Class Form1
Dim WithEvents Timer1 As New System.Timers.Timer
Dim TH As Threading.Thread
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 1000
TH = New Threading.Thread(AddressOf A)
TH.Start()
End Sub
Public Sub A()
Timer1.Start()
End Sub
Private Sub Timer1_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
MsgBox("OK")
End Sub
End Class