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

درس : التعامل مع الصف المؤقت Timer و مؤقت الأعمال TimerTask

مغلق
بدأه nardien28 في 14 سبتمبر 2006 · 11 رد · 6,268 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كلاهما موجودان في الحزمة التخديمية java.util

كلاهما يعملان مع منصة عمل جافا التقليدية J2SE ومنصة عمل جافا إصدار الأجهزة الجوالة J2ME

تتبع المثال التالي سيوضح كل شيء .

import java.util.*;

public class MyClass extends TimerTask{
  public MyClass() {  }

public void run(){
هنا تضع الكود المعبر عن السلوك الذي تريد التحكم زمنيا بتنفيذه.. 
مثلا طباعة  عبارة "هذا من فضل ربي" 
System.out.println("هذا من فضل ربي");
}  

  public static void main(String[] args) {
	MyClass myclass = new MyClass();
	Timer mytimer=new Timer();

//******************* اختر احد هذه الطرق   ********************//
mytimer.schedule(myclass,2000);
mytimer.schedule(myclass,2000,5000);
mytimer.scheduleAtFixedRate(myclass,2000,5000);
mytimer.schedule(myclass,new Date());
mytimer.schedule(myclass,new Date(),2000);
mytimer.scheduleAtFixedRate(myclass,new Date(),2000);
//******************************************//
  }
}

عمليا يتلخص التعامل مع هذه الحزمة بالخطوات التالية :

  • استيراد الحزمة التخديمية java.util
  • جعل صفك (MyClass .. على سبيل المثال) يرث extends الصف المجرد TimerTask الذي يمثل implements الواجهة Runnable الحاوية على اجرائية وحيدة run() علينا تمثيلها ( كتابة كود يمثل سلوكها) في الصف MyClass
  • انشاء غرض عن الصف Timer
  • انشاء غرض عن صفك MyClass
  • استدعاء أحد الطرق التالية (موضحة مع الكود) الخاصة بالصف Timer التي تمرر لها كبرامتر أول اسم صفك (صف يرث TimerTask) تقبله الطريقة بسبب خاصية تعددية الأشكال

شرح الطرق

mytimer.schedule(myclass,2000);

يعمل على جعل السلوك المراد التحكم في تنفيذه زمنيا الموجود في الطريقة run() التابعة للغرضmyclass المنشأ عن صف ما يرث الصف TimerTask

يتنفذ مره بعد مرور زمن أي تأخير مقداره 2000 ميللي ثانية أي ثانيتان

mytimer.schedule(myclass,2000,5000);

تعمل على جعل السلوك المذكور يتنفذ مرارا وتكرارا(هنا كل 5000 ميللي ثانية أي 5 ثواني) بتأخير ثابت للتنفيذ

أي يبدأ تنفيذ السلوك المذكور بعد مرور 2000 ميللي ثانية (أي ثانيتان) من لحظة تشغيل البرنامج ... تنفيذ 1

وبعد انتهاء عملية التنفيذ بغض النظر عن الزمن الذي استغرقه في التنفيذ ب5 ثواني (وهي الفترة الزمنية الفاصلة بين تنفيذين ) يجري تأخير مره اخرى مقداره ثانيتان ومن ثم اعادة تنفيذ السلوك ذاته مره اخرى ..

تنفيذ 2

وهكذا ..تأخير..تنفيذ ومن ثم فترة فاصلة ثم تأخير فتنفيذ .. طالما ان البرنامج في حالة تشغيل

حتى يتم اغلاق البرنامج أو حدوث حدث (ضغط زر توقف مثلا) يسبب استدعاء الطريقة :

mytimer.cancel();

التي توقف تنفيذ السلوك المذكور لحظة استدعائها .

عملية التنظيم الزمني لأجل أي تنفيذ (تنفيذ 2 مثلا ) تتعلق بزمن التنفيذ الحقيقي للتنفيذ الذي قبله (تنفيذ 1)

حيث قد يستغرق التأخير في بعض مرات التنفيذ زمنا أكثر من الزمن الذي قدرته لظروف معينة قد تتعلق بالذاكرة ونظام التشغيل ... الخ .

مما يؤدي الى ان التنفيذات التالية له ستتأخر عن موعدها .

(قد تتوقع مثلا ان يتم التنفيذ التاسع تمام الساعة السادسة طبقا لجدولتك الزمنية للسلوك المذكور وتتفاجأ انه لم يتنفذ في موعده بل متأخرا عنه )

تختار هذه الطريقة عندما لا يهمك موضوع الضبط الدقيق للوقت

   mytimer.scheduleAtFixedRate(myclass,2000,5000);

تعمل على جعل السلوك المذكور يتنفذ مرارا وتكرارا(هنا كل 5000 ميللي ثانية أي 5 ثواني) بمعدل ثابت للتنفيذ

أي يبدأ تنفيذ السلوك المذكور بعد مرور ثانيتان كزمن تأخير من لحظة تشغيل البرنامج

ومن ثم فترة زمنية فاصلة مقدارها 5 ثواني .. وهكذا

تماما مثل الألية السابقة

ولكن الإختلاف هنا انه كل تنفيذ يتم بالرجوع الى الجدولة الزمنية المبدئية التي وضعتها

ولا علاقة لأي تنفيذ بأي تنفيذ سابق له (ستلاحظ بدء التنفيذ التاسع تمام الساعة السادسة تماما طبقا لحساباتك ) .

mytimer.schedule(myclass,new Date());

يجري تنفيذ السلوك المذكور حال حلول التاريخ المذكور بدون تأخير وان كان التاريخ قد مضى (لم يكن برنامجك شغال وقتها) يجري التنفيذ حال فتح برنامجك اول مره بعد هذا التاريخ .

mytimer.schedule(myclass,new Date(),2000);

اذا حل التاريخ المذكور يجري تأخير مقداره ثانيتان قبل بدء تنفيذ السلوك المذكور

mytimer.scheduleAtFixedRate(myclass,new Date(),2000);

يجري تنفيذ السلوك المذكور كل ثانيتان بدون زمن تأخير ابتداء من التاريخ المذكور

مع مراعاة الزمن المضبوط كما ذكرنا سابقا (الفرق بين schedule و scheduleAtFixedRate )

ملاحظة : mytimer.cancel(); التي توقف تنفيذ السلوك المذكور لحظة استدعائها ... عملها ينطبق على كل الطرق السابقة .

والشكل التالي يمثل مخطط الصفوف الذي يوضح الاستخدام العملي للصف المؤقت ومؤقت الأعمال .

150a7ebe63.gif

كي لا تتعقد الأمور وتبقي صفك ذو السلوك المطلوب جدولته زمنيا منفصلا عن اجراءات الجدولة الزمنية واستدعاءاتها بالاستعانة بصف ثالث TestClass يقوم بعمل غرض عن صفك وعن الصف Timer ويستدعي

اجراءات الجدولة .. ولكن لاغنى من ان تجعل صفك يرث TimerTask وتحدد السلوك المطلوب جدولته زمنيا ضمن run() بالشكل التالي :

d6085b9563.gif

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#2

السلام عليكم :

ما شاء الله كالعادة درس جميل وشرح بسيط وكاف ..

سؤالي خارج الدرس عن المخططات :

أنا بعرف أن ال interface يرسم بالشكل التالي:

1be0.jpg

فهل يصح الوجهان .. أم أن معلوماتي قد أكل الدهر عليها وشرب؟

فحنوت ألثم جرحه الرعافَ فانتكأت جراحي..

وهمت على خدي الدموع فقلت يا روحي وراحي..

هلّا رحمتَ قلوبنا .. وعدلت عن هذا الرّواحِ ِ ..؟

فأجابني البطل المسجّى هازئاً بيَ .. باقتراحي

كفكف دموعك ليس في عبراتك الحرّى ارتياحي

هذي سبيلي .. إن صدقت محبتي .. فاحمل سلاحي

Sun Certified Java Programmer

#3

يجوز استخدام الشكلين انظر المثال .. استخدم الشكلين على نفس الصف :wacko: :

classDiagramInterfaces.gif

من الرابط

http://www.agilemodeling.com/style/classDiagram.htm#Figure5

كذلك انظر الرابط

http://www.sparxsystems.com/resources/uml2...assdiagram.html

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#4

طبعا لا تنسى الـ sterio type : عند استخدام الشكل الثاني

 <<interface>>

تم تعديل هذه المشاركة بواسطة malek_sa في 14 سبتمبر 2006 في 22:24

SCJP 5.0

#5

سؤالي هو :

هل يوجد طريقة أخرى غير الـ extend TimerTask... أي بواسطة implement لواجهة ما ؟؟؟؟

SCJP 5.0

#6

كما ترى جميع طرق الصف Timer بلا استثناء تطلب البرامتر الأول ان يكون غرض من الصف TimerTask وهذا لا يمكن لانه مجرد وبالتالي لابد ان يكون الوسيط الممرر صف ابن ل TimerTask أي يرثه extends

الا اذا كنت حابب تبعد عن شغلة ال Timer و ال TimerTask كلها وتخترع آلية جديدة للجدولة الزمنية .

تم تعديل هذه المشاركة بواسطة nardien28 في 16 سبتمبر 2006 في 03:16

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#7

كود التعامل مع الصفين Timer و TimerTask .. من كتاب Core J2ME™ Technology & MIDP

import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class TimerTemplate extends MIDlet implements CommandListener{
  private Display display;	   
  private Form fmMain;		  
  private Command cmExit;	   
  private Command cmStop;	  
  private Timer tm;		   
  private TestTimerTask tt;		
  private int count = 0;		 

  public TimerTemplate()
  {
	display = Display.getDisplay(this);


	fmMain = new Form("Timer Test");
	fmMain.append("waiting...\n");


	cmExit = new Command("Exit", Command.EXIT, 1);
	cmStop= new Command("Stop", Command.STOP, 2);
	fmMain.addCommand(cmExit);
	fmMain.addCommand(cmStop);
	fmMain.setCommandListener(this);
	tm = new Timer();
	tt = new TestTimerTask();
//******اختر احدى الطرق التالية بنفس المفاهيم السابقة  ********//
	tm.schedule(tt,5000);	
	tm.schedule(tt,5000, 3000);	
	tm.scheduleAtFixedRate(tt,5000, 3000);	
	tm.schedule(tt, new Date());	
	tm.schedule(tt, new Date(), 3000);	
	tm.scheduleAtFixedRate(tt, new Date(), 3000);	
  }


  public void startApp (){ display.setCurrent(fmMain);}
  public void destroyApp (boolean unconditional){ }
  public void pauseApp (){ }


  public void commandAction(Command c, Displayable d)
  {
	if (c == cmStop){ tm.cancel(); }
	else if (c == cmExit)
	{
	  destroyApp(false);
	  notifyDestroyed();
	}
  }

//*************************************************//  
  private class TestTimerTask extends TimerTask{
	public final void run()
	{هنا ضع السلوك المطلوب التحكم بتنفيذه زمنيا 
	  fmMain.append("هذا من فضل ربي ");
	}
  }
//***********************************************//
}

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#8

السلام عليكم ورحمة الله و بركاته

ماشاء الله بارك الله فيك nardien28 و الله يجازيكم موضوع في قمة الروعة

أنا مبتدئ في البرمجة

وعندي سؤال الله يجازيك اللي هو كيف يمكن عمل Timer إشارة مربعة بترديد 500Khz أي 2u ثانية

وكيف أخرجها من المنفذ المتوازي لأنى أريد ان أستخدمها كولد إشارة ل ADC

في إنتظار ردكم

تقبلوا منى فائق الإحترام و التقدير

ليس عيبا أن نرى أخطائنا ..............................عيبنا الأكبر أن نبقى نعاب

#9

مشكوووووووووووررر اخى

الله يجزيك كل خير

#10

السلام عليكم ورحمة الله وبركاته

الاخت ناردين جزاك الله خيرا وتستحقين دعوة في ظهر الغيب

الدرس رائع جدا ولقد استفدت منه

اتمنى ان تستمري في شرح مثل هذه الدروس البسيطة والمخفية عنا

وعندي سؤال هل ممكن تزويدنا بمعلومات اكثر عن Date class

والسلام عليكم

#11

جزاك الله خيراً

الحمد لله الذى هدانا لهذا وما كنا لنتهتدى لولا أن هدانا الله

#12

جزاكم الله كل خير

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

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