السلام عليكم ورحمة الله وبركاته
قبل قليل كنت اجرب شي وهو عمل تايمر عن طريق BackgroundWorker وتفاجئت عندما رأيت انه اسرع من التايمر العادي وحبيت اضع هذا المقال ان شاء الله يفيدكم , بالرغم ان كلامها نفس السرعة عند وضع [b]interval يساوي 1000 لكن ممكن وضع قيمة 0 للفئة الجديدة وهي اصلا اسرع عندما كلاهما 1 بكثير[/b]
اولآ سنقوم بعمل التايمر ثم نقارن بين السرعتين:
نفتح مشروع جديد ونضيف كلاس جديد ونسميه Mytimer
الان انسخ الكود الذي عملته وهو اداة تشبه التايمر الى الكلاس
واعمل Build للمشروع ستلاحظ ظهور الاداة كما في الصورة
نضيف الاداة على الفورم ونضيف Timer العادي و2 ليست بوكس وزر بوتون و2 ليبل كما في الصورة
ونختار لكلا التايمرين interval=1
الان نضع هذا الكود في الفورم
وكما تلاحظون تعمدت تشغيل التايمر العادي قبل الكلاس الذي انشأته لكن ستلاحظون فرق كبير بالسرعة حيث تقريبا عندما وضعت Interval للكلاس يساوي 15 تقريبا تساوت السرعتان
ان شاء الله يكون موضوع مفيد للبعض وتحياتي
قبل قليل كنت اجرب شي وهو عمل تايمر عن طريق BackgroundWorker وتفاجئت عندما رأيت انه اسرع من التايمر العادي وحبيت اضع هذا المقال ان شاء الله يفيدكم , بالرغم ان كلامها نفس السرعة عند وضع [b]interval يساوي 1000 لكن ممكن وضع قيمة 0 للفئة الجديدة وهي اصلا اسرع عندما كلاهما 1 بكثير[/b]
اولآ سنقوم بعمل التايمر ثم نقارن بين السرعتين:
نفتح مشروع جديد ونضيف كلاس جديد ونسميه Mytimer
الان انسخ الكود الذي عملته وهو اداة تشبه التايمر الى الكلاس
كود :
Imports System.ComponentModel
Public Class MyTimer
Inherits Component
Private WithEvents Background As New BackgroundWorker _
With {.WorkerSupportsCancellation = True}
Event Tick(ByVal sender As Object, ByVal e As EventArgs)
Private En As Boolean = False
Property Enabled() As Boolean
Get
Return En
End Get
Set(ByVal value As Boolean)
En = value
If value = True Then
If Not Background.IsBusy Then
Background.RunWorkerAsync()
End If
Else
If Background.IsBusy Then
Background.CancelAsync()
End If
End If
End Set
End Property
Private Intrvl As Integer = 100
Property Interval() As Integer
Get
Return Intrvl
End Get
Set(ByVal value As Integer)
Intrvl = value
End Set
End Property
Public Sub Start()
Enabled = True
End Sub
Public Sub _Stop()
Enabled = False
End Sub
Private Sub Background_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Background.DoWork
RaiseEvent Tick(Me, New EventArgs)
End Sub
Private Sub Background_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles Background.RunWorkerCompleted
wait(Interval)
If Me.Enabled Then
Background.RunWorkerAsync()
End If
End Sub
Public Sub New()
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
End Sub
Private Sub wait(ByVal interval As Integer)
On Error Resume Next
Dim sw As New Stopwatch
sw.Start()
Do While sw.ElapsedMilliseconds < interval
Application.DoEvents()
Loop
sw.Stop()
End Sub
End Class
واعمل Build للمشروع ستلاحظ ظهور الاداة كما في الصورة
نضيف الاداة على الفورم ونضيف Timer العادي و2 ليست بوكس وزر بوتون و2 ليبل كما في الصورة
ونختار لكلا التايمرين interval=1
الان نضع هذا الكود في الفورم
كود :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Timer1.Start()
MyTimer1.Start()
End Sub
Dim a As Integer = 0
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If a = 400 Then
Timer1.Enabled = False
Label2.Text = "Timer: 1"
End If
ListBox2.Items.Add(a)
a += 1
End Sub
Dim i As Integer = 0
Private Sub MyTimer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyTimer1.Tick
If i = 400 Then
MyTimer1.Enabled = False
Label1.Text = "MyTimer: 1"
End If
ListBox1.Items.Add(i)
i += 1
End Sub
وكما تلاحظون تعمدت تشغيل التايمر العادي قبل الكلاس الذي انشأته لكن ستلاحظون فرق كبير بالسرعة حيث تقريبا عندما وضعت Interval للكلاس يساوي 15 تقريبا تساوت السرعتان
ان شاء الله يكون موضوع مفيد للبعض وتحياتي