تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] مشكلة في Timer
#1
سلام عليكم

اخواني عند ماخصلت برنامج واصبح قابل لاستخدام
واجهتني مشكلة وهي انه البرنامج يتجمد عند
تشغيل التايمر يعني بهنج
الرجاء النظر للكود داخل الـTimer
والتعديل علية ليصبح Timer يشتغل بوقت محدد او
ايجاد حل لهذه المشكلة 
وشكراً

الرد }}}
تم الشكر بواسطة:
#2
شوف اخي اذا كانت التايمر تعمل بشكل سليم لاكن تعلق البرنامج لفتره حتى تنفذ الكود المطلوب ثم يرجع البرنامج طبيعي 

استخدم BackgroundWorker فهاذا حل المشكله ان شاء الله

شكرا لك
الحمد لله رب العالمين على كل شي
الرد }}}
تم الشكر بواسطة:
#3
جرب الامر Try
الرد }}}
تم الشكر بواسطة:
#4
هذا سببه  الاستخدام الخاطي للتايمر
فكما هو واضح من الكود أنك تحاول ارسال بيانات معينة من خلال تايمر و ايضا من خلال Loop
منطقي جدا ان البرنامج يهنج
إما أن تستخدم threading أو تقوم بعمل SyncLock للتايمر حتي لا يتم تنفيذ الأوامر الموجودة داخل التايمر مرة واحدة
أعتقد أنك أيضا تحتاج أن  تتأكد من ان البيانات لا تساوي Nothing  قبل تنفيذ الأمر Send
واضح انك أيضا تحاول ارسال بيانات لموقع معين علي الانترنت
أعتقد انك محتاج تتأكد إنك متصل فعلا بالموقع او بالايميل او بالانترنت هذا  يحدده ما تقوم بتنفيذه من الكود من خلال Loop
الرد }}}
تم الشكر بواسطة: العزابي
#5
كمثال توضيحي
افتح مشروع و ضع علي الفورم ليست بوكس و باتون و تايمر

و اكتب الكود بالشكل التالي
فقط شاهد ما يحدث عند الضغط علي الباتون لتشغيل التايمر

PHP كود :
Public Class Form1

    Private txt 
As String "vb4arab#data#ali#color#sunclock#ali#anystring#---------"
 
   Public lastTxt As Integer = -1
    Private txtLock 
As New Object
    Private strings
() As String = New String(100) {}
 
   Private Sub Timer1_Tick(sender As ObjectAs EventArgsHandles Timer1.Tick
        
' و ممكن تكتب الكود بين هاتين السطرين 
        SyncLock txtLock
            For Each s As String In txt.Split("#"c)
                lastTxt += 1
                If lastTxt < txt.Length Then
                    strings(lastTxt) = s
                End If
            Next
        End SyncLock
        For i = 0 To strings.Length - 1
            Dim current As String = strings(i)
            If Not String.IsNullOrEmpty(current) Then
                ListBox1.Items.Add(current)
            End If
        Next

        '' أو ممكن تستخدم التايمر نفسه 
        '
SyncLock Timer1
        
'    For Each s As String In txt.Split("#"c)
        ' 
       lastTxt += 1
        
'        If lastTxt < txt.Length Then
        ' 
           strings(lastTxt) = s
        
'        End If
        ' 
   Next
        
'End SyncLock
        '
For 0 To strings.Length 1
        
'    Dim current As String = strings(i)
        ' 
   If Not String.IsNullOrEmpty(currentThen
        
'        ListBox1.Items.Add(current)
        ' 
   End If
 
       'Next
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Timer1.Enabled = True
        Timer1.Interval = 1000
    End Sub
End Class 
الرد }}}
تم الشكر بواسطة: العزابي
#6
السلام عليكم

كأبسط طريقة ممكن تستغل الأمر Application.DoEvents داخل كل حلقة تكرار مثل For أوDo وغيرها
كود :
For i = 0 To 10
    Application.DoEvents

    For Each s In o
        Application.DoEvents


    Next
Next
الرد }}}
تم الشكر بواسطة:
#7
الأخ مساعدة

لو استخدمت SyncLock أو أي Lock أخر مناسب مع التايمر فهنا انت لا تحتاج نهائي ان تستخدم Application DoEvent و ربما لا تحتاج الي جملة Try أيضا
عموما هذا كله مرتبط بما تنفذه من كود داخل التايمر
بشكل عام الفكرة هنا انك لا تجعل التايمر يهنج البرنامج
الرد }}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم