الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما هي طريقة عمل الحدث tick للاداة timer

مغلق
بدأه prof.programer في 24 فبراير 2007 · 8 رد · 1,193 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

ودي بسؤال من الاخوة الاعضاء عن أداة timer هل الحدث tick لهذه الدالة يعمل ك thread ام ماذا ؟

لاني استخدم هذه الاداة في برنامج صغير كانه real time و يعالج البيانات ليقرر حسب الوقت هل سينجز مهمة ام لا

و بسبب العمليات المتداخلة الاحظ انه الساعة الداخلية في النظام تتاخر عن ساعة الويندوز بمعدل ثانية و نصف كل نصف ساعة

و بالتالي سيحصل خطا في اتخاذ البرنامج لقرار

هل تقترحون طريقة معينة لمعالجة مشكلة التاخير الحاصل ؟

وما هو رايكم بسخدام اداة ال process او ال background process

لان اغلب برمجتي database application وليس لدي خبرة كافية في ال realtime applcation

املين منكم المشورة و النصح

اقتباس

أبكـــــي فتبتسم الجراح من البكا

فكـــــأنّها في كـل جارحـــــــة فـم ُ

يالابتسـام الجــرح كـم أبكي و كم

ينساب فــــوق شفاهه الحمرا دم

ُ

#2

بالنسبة لموضوع معالج البيانات يمكنك استخدام العنصر Backgroundworker أو يمكنك تنفيذ عملية التحقق على thread مختلف برمجيا

بالنسبة للحدث Tick الخاص بـ timer ينفذ ضمن الـ thread الحالي ولا ينشئ thread خاص به

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

يا شباب استخدم الحين backgroundworker

و لكن المشكلة فجاة يطلع خطا اثناء اطلاق حدث بدء المعالجة لانه احيانا يكون ما انتهى خلال ثانية واحدةمن العملية السبقة و يتم استدعاء

اخر لها فيحصل خطا

عالجت الخطا بوضع try catch

لكن تعود مشكلة تاخر الوقت في النظام عن ساعة الكمبيوتر فما هو الحل الان ؟

علما لا استطيع استخدام شرط if لانه من الضروري ان يتم تنفيذ خطوة استدعاء ال workgroundworker

.؟؟؟؟؟

اقتباس

أبكـــــي فتبتسم الجراح من البكا

فكـــــأنّها في كـل جارحـــــــة فـم ُ

يالابتسـام الجــرح كـم أبكي و كم

ينساب فــــوق شفاهه الحمرا دم

ُ

#4

ضع مثالا عن الكود حتى نحاول تصحيحه معا

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

هذا كود ال tick

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

'

Me.Second()

'

Me.TextBox1.Text = Me.Clocks & " : " & Me.Minutes & " : " & Me.Seconds

'

'

Select Case SCase

'

Case 1

'

Me.BackgroundWorker1.RunWorkerAsync()

SCase = 2

'

Case 2

'

Me.BackgroundWorker2.RunWorkerAsync()

SCase = 1

'

End Select

'

End Sub

اقتباس

أبكـــــي فتبتسم الجراح من البكا

فكـــــأنّها في كـل جارحـــــــة فـم ُ

يالابتسـام الجــرح كـم أبكي و كم

ينساب فــــوق شفاهه الحمرا دم

ُ

#6

بالنسبة لكود بدء عملية التنبيه و لنهاء عملية التنبيه هي

Sub StartPlayer()

'

If Me.AlarmerState And Me.AlarmTime = Me.TextBox1.Text Then

'

Me.CtrAlarmerState = True

Me.CtrReplay = False

s.URL = Me.AlarmingFile

'

ElseIf Me.SCount = Me.ReplayAfter Then

'

Me.CtrAlarmerState = True

Me.CtrReplay = False

s.URL = Me.AlarmingFile

'

End If

'

'

End Sub

'

Sub StopPlayer()

'

If Me.Count = Me.StopTime Then

'

Me.CtrAlarmerState = False

Me.CtrReplay = True

s.close()

'

End If

'

End Sub

اقتباس

أبكـــــي فتبتسم الجراح من البكا

فكـــــأنّها في كـل جارحـــــــة فـم ُ

يالابتسـام الجــرح كـم أبكي و كم

ينساب فــــوق شفاهه الحمرا دم

ُ

#7

هنا تتم عملية استدعء بدء او ايقاف التنبيه عن طريق backgroundworker وقد جعلتها اثنتين لتفادية عملية الانشغال

و لكن بعد التتبع من الملاحظ انه تتم عملية التاخير عندما يتم فتح برنامج جديد في الويندوز يقوم بايقاف عمليات برنامجي و هذا الذي يولد خطا بان backgroundworker مشغول لانه بنبض الثانية تحصل استدعاء جديد و يكون الاستدعاء السابق غير مكتمل التطبيق

و اعتذر اذا كان الكود غير مفهوم كثيرا

Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

'

Me.StartPlayer()

Me.StopPlayer()

'

End Sub

'

Private Sub BackgroundWorker2_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork

'

Me.StartPlayer()

Me.StopPlayer()

'

End Sub

اقتباس

أبكـــــي فتبتسم الجراح من البكا

فكـــــأنّها في كـل جارحـــــــة فـم ُ

يالابتسـام الجــرح كـم أبكي و كم

ينساب فــــوق شفاهه الحمرا دم

ُ

#8

بسم الله الرحمن الرحيم

اول ملاحظة كتعليق على مقولة الاخ محمد سامر ابو سلو

"بالنسبة للحدث Tick الخاص بـ timer ينفذ ضمن الـ thread الحالي ولا ينشئ thread خاص به"

من الملاحظ عند اطلاق msgbox في اي حدث يتوقف البرنامج لحين اغلاق الرسالة بينما لا يتوقف مطلقا في ال tick و على العكس

تستمر الرسالة بالظهور الى ما لا نهاية (الى ان تصبح overfloow ) و على التالية اي لا يتم اغلاق الرسالة ذاتيا

بالنسبة لمشكلة التوقف في مكان ما حل الموضوع بطريقة بسيطة و هي تطويل الدورة التي يمر بها البرنامج

اي بشكل مبسط قمت بزيادة عدد ال backgroundworker و في كل مرة اسندها العمل الى واحد منهم

ملاحظة لا نستطيع تكوين مصفوفة من ال backgroundworker لاننا بحاجة الى events

و بالنسبة لمشكلة حصول خطا عندما ينطلق برنامج اخر ليعمل فيقوم الوندوز بايقاف اطلاق عملية ما في برنامجي

قد حلت ايضا فلم تعد ساعة النظام تتقدم على الساعة الموجودة في البرنامج و ذلك من خلال تعديل خاصية ال set Priority

يدويا من normal الى reatime وهذه الخاصة قمت بتعديلها من خلال task manager

و لكن من غي رالمنطقي ان اقوم بالتعديل اليدوي في كل مرة

و السؤال الان هو كيف اعدل خاصية set priority الى realtime من خلال البرنامج اما بجعلها قيمة ابتدائية لل

programe instanse او من خلال الكود اثناء حصول الحدث load مباشرة

اقتباس

أبكـــــي فتبتسم الجراح من البكا

فكـــــأنّها في كـل جارحـــــــة فـم ُ

يالابتسـام الجــرح كـم أبكي و كم

ينساب فــــوق شفاهه الحمرا دم

ُ

#9
اقتباس
من الملاحظ عند اطلاق msgbox في اي حدث يتوقف البرنامج لحين اغلاق الرسالة بينما لا يتوقف مطلقا في ال tick و على العكس

تستمر الرسالة بالظهور الى ما لا نهاية (الى ان تصبح overfloow ) و على التالية اي لا يتم اغلاق الرسالة ذاتيا

هذا معناه غالبا أنه يتم التنفيذ على مسار آخر بس في نقطة بتلاحظها أنك من دالة في مسار thread آخر لايمكنك استخدام التحكمات الموجودة على النموذج مباشرة ولكن في الحدث tick لـ timer يمكنك فعل ذلك وهذا دليل على أن التنفيذ يتم على نفس المسار thread

يمكنك تعديل أولوية المسار الحالي برمجيا

أولا استخدم الاستيراد التالي في بداية الملف قبل كل شئ

Imports System.Threading

ثم قم بتعديل أولوية المسار thread الحالي كما يلي

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal


Thread.CurrentThread.Priority = ThreadPriority.Highest


Thread.CurrentThread.Priority = ThreadPriority.Lowest

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 27 فبراير 2007 في 11:52

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

هذا الموضوع مغلق.

مواضيع مشابهة