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
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.