لمحة جافاوية 39: نصيحة

السلام عليكم

كيف حالكم يا شباب؟
لكل إنسان هالة خاصة به aura
هناك أناس هالتهم تذكرني بمجمع النفايات
(لو لي الحق في قتل بعضهم لبدأت بواحد هنا)
هناك آخرون هالتهم مثل النسمة
بمجرد لقاءك به أو بها تحس وكأنكم معزوفة جميلة
تعزف ألحاناً من جمالها يطرب لها كل سامع
على العموم يختلف تفاعل الهالات مع بعضها البعض
فمن تراه أنتا لا يطاق قد يراه الآخرون أكثر من رائع
وهذا ما اصطلح على تسميته كيمياء الأرواح أو كاريزما
بالمناسبة موضوع الهالة هذا
يقال أنه حقيقي فعلاً
أقصد أن كل إنسان يحاط بنوع من الطاقة
لا أستغرب لو سمعت بأن بعض العلماء
حاول استحلاب الإنسان لاستخراج هذه الطاقة
من ضمن ما أتذكر حول هلع العلماء بالموارد الجديدة للطاقة
قصة كنت قرأتها عن عالم دجال اسمه جان كيلي
هذا العالم ادعى أنه اكتشف طاقة جديدة وسماها بالأثيرية
وهي على حد قوله طاقة تعتمد على الماء
وكان يقول أن جالوناً واحداً من الماء قادر على أن يسير باخرة من نيويورك إلى ليفربول
اتضح عند موته أنه كل تجاربه لم تكن إلا محض خدعة
وظل العالم حوالي 20 سنة في حلم الطاقة الأثيرية
لماذا أحكي لكم كل هذا؟؟؟
كم مرة يجب أن أقول أن السادية شيء محبب لدي
أوووووووووووف كما تعانون من النسيان
[الغبي يظن كل الناس مثله نسيت أن أقول لكم أني عبده]
لا عليكم أنا أعرف أن الناس ليسوا دائماً عباقرة مثلي
[غبي آخر يظن نفسه عبقري لا تتعبوني ما ستجدونه بين الأقواس المربعة مني أنا عبده]
لهذا سأدخل في الموضوع مباشرة
لمحة اليوم عبارة عن مجرد نصيحة
[احتفظ بنصائحك الغبية لنفسك]
هذه النصيحة ليست مني
وإنما من العزيزة صن
النصيحة تقول
عند التعامل مع الحزمة swing
احرص على أن لا يكون في الخيط الرئيسي main thread
أو في أي خيوط أخرى
وإنما في الخيط Event Dispatch Thread
وتركز الأخت صن على وجوب العمل بهذه النصيحة
بصراحة لحد الآن لم أصادف أية مشاكل مع أني لا أعمل بهذه النصيحة
لكن مادام الأخت صن تقول يجب فالموضوع مهم جداً
وعندما سألت الأخت صن عن السبب
أجابت بأن حزمة swing ليست محمية ضد الخيوط thread-unsafe
وهذا يعني أن قيام أكثر من خيط بالرسم عليها سيسبب مشاكل تزامنية synchronization أو التوقف إلى الأبد DeadLock
وأن الخيط Event Dispatch Thread
هو الخيط المسؤول عن تحديث المكونات التابعة لحزمة swing
ماذا يفترض بي أن أقوم به لكي أجعل إطاراتي تعمل في EDT
هذا سهل جداً
كل ما عليك أن تضع الشيفرة التي كنت تضعها في الدالة الرئيسية main في شيفرة أخرى وتضعهما جميعاً في الرئيسية
بدأت أكبر في السن
[بدأت تثبت أنك أكثر الناس غباءاً]
هاهاهاهاها
معكم حق لنوضح الموضوع أكثر بالشيفرة التالية
هذه الشيفرة نفسها استخدمناها في التلميحة السابقة بدون أن نضع في الحسبان EDT

package version1;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;


public class NewJFrame extends javax.swing.JFrame {
	private JButton jButton1;

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				NewJFrame inst = new NewJFrame();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
				inst.setDefaultCloseOperation(EXIT_ON_CLOSE);
			}
		});
	}
	
	public NewJFrame() {
		super();
		initGUI();
		 Thread th=new Thread(new Runnable(){
         	public void run(){
         		int i=-90;
         		while ( true )
                 {
         			final int k=i;
    				SwingUtilities.invokeLater(new Runnable() {
    					public void run() {
    	                     setRemaningTime ( k ) ;
    					}
    				});
                     try
                     {
                         Thread.sleep ( 1000 ) ;
                     }
                     catch ( InterruptedException ex )
                     {
                         ex.printStackTrace () ;
                     }
                     if((i+10)%getWidth()!=0||i+10!=getWidth())
                    	 i =(i+10);
                     else
                    	 i=-90;
                 }
         		//here do waht you do when time finish
         		//before student finish sol.
         	}
			private void setRemaningTime(int i) {
				jButton1.setBounds(i, 0, 90, 31);
				repaint();
			}
         });
		 th.start();
	}
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				jButton1 = new JButton();
				getContentPane().add(jButton1);
				jButton1.setText("jButton1");
				jButton1.setBounds(-60, 0, 60, 21);
			}
			pack();
			setSize(400, 300);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

لاحظوا الأماكن التي تمت فيها إضافة EDT
1- الدالة الرئيسية
2- الخيط الخاص بتحريك المكون jButton1
نلاحظ أنا قصرنا اهتمامنا في الخيط على الدالة setRemaningTime
والتي تقوم بتغيير إحداثيات المكون وإعادة رسمه

في النهاية أحب أن أشكر الأخ وجدي وسيم الذي نبهني لهذه القضية
كل التحية له
[بعد أن قضينا وقتاً سيئاً مع هذا المقرف وتفاهته الغبية
لولا أنه جاء بواسطة قوية جداً من ناحية المدام ما رأيتم
حماقته تكتب هنا لكن حكم القوي على الضعيف]
[أترككم في رعاية الله على أمل أن ألقاكم وقد مات هذا الحيوان وأراحنا]
المراجع:
1-مقالة بعنوان Swing multi-threading issues

http://www.swingwiki.org/other:swing_threading

2-رد الأخ وجدي على سؤال في الفريق العربي للبرمجة

http://www.arabteam2000-forum.com/index.php?showtopic=173332&view=findpost&p=878030

تحياتي

Tags: , , , , , , , , ,

6 Responses to “لمحة جافاوية 39: نصيحة”

  1. abuoof قال:

    السلام عليكم
    أخي أنا مفهمتش حاجة
    ياريت لو تعرف حاجة مختصرة وسريعة وياريت عربي لأن وقتي ضيق تكون في الthreadعلشان أفهم انت بتقول إيه
    متقوليش علي كتب أنجليزي لأن عندي كتير بس مفيش وقت في الدراسة لقرائتها
    معلش أن تقلت عليك
    دمتم في رعاية الله

  2. admin قال:

    ببساطة عندما تضع أي شيفرة تتعلق بالحزمة swing
    لا تضعها إلا بين الجمل التالية

    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    
    			}
    		});
    
    

    أين استخدم هذه الجمل بالضبط؟
    في الدالة الرئيسية main لأن أي شيء موجود في هذه الدالة ينفذ في الخيط الرئيسي
    إذا احتجت إلى عمل خيط جديد على الأغلب سيكون في دوال الأحداث Events

    في المثال الذي طرحته ستجد أني استخدمت المقطع السابق في موضعين
    وهما الموضعين المرادين بالضبط
    مرة أخرى أقول أن هذه الجمل تقوم بتنفيذ ما بداخلها في الخيط EDT
    وهو الخيط المسؤول عن الرسم في حزمة swing

    إذا لم تتضح لك سأحاول مرة أخرى

    تحياتي

  3. Wajdy Essam قال:

    جميل جداً أخي علاء ،،
    شرح ممتاز كعادتك ،،

    -أين هو زر الشكر هنا- :lol:

    دمت بخير ،

  4. admin قال:

    السلام عليكم

    نورت المدونة أخ وجدي
    أعتقد أني أنا المدين لك بالشكر :P

    تحياتي

  5. شاطر شاطر قال:

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

  6. admin قال:

    شكراً لك أخ شاطر شاطر على كلامك الجميل
    لكني أسألك أن تخبرني أين موضع السخف في كلامي
    على أية حال لو لديك أية أسئلة تفضل

    للتنبيه فقط: لا يوجد شيء يسمى خزعبلات علمية
    كل شيء يدخل العلم هو شيء خاضع للتجربة والتحقق
    بالتالي لا يوجد خزعبلات علمية
    إما خزعبلات أو علم

    شكراً مرة أخرى
    تحياتي

Leave a Reply