الجامعات العربية

حل مشكلة المزامنة

حل مشكلة المزامنة , حل مشكلة المزامنة
حل مشكلة المزامنة , حل مشكلة المزامنة
حل مشكلة المزامنة , حل مشكلة المزامنة
حل مشكلة المزامنة , حل مشكلة المزامنة
حل مشكلة المزامنة , حل مشكلة المزامنة
المناهج السعودية

مفهوم مشكلة المزامنة

عند برمجة تطبيق كبير فإنك حتماً ستحتاج إلى تنفيذ عدة أوامر في وقت واحد, أي ستحتاج إلى إستخدام Threads.
فمثلاً قد تجعل برنامجك يتعامل مع قاعدة بيانات و يتصل بالنت في نفس الوقت. هنا طبعاً ستضطر إلى تنفيذ كل عملية منهم ضمن Thread مختلف حتى تتمكن من تشغيلهم في نفس الوقت.

معلومة تقنية

تشغيل عدة Threads في نفس الوقت قد يتنج عنه مشكلة التضارب Conflict ) و التي تحدث عند وجود إثنين Threads يتنفذون في نفس الوقت و وصلوا إلى مرحلة أصبح فيها كل Thread منهم بحاجة إلى إستخدام شيء يستخدمه الـ Thread الآخر.
فعلياً, مشكلة التضارب تحدث في حال لم نجعل الـ Threads يعملون بشكل متزامن Synchronized إذا كانوا سيستخدمون بعض المصادر المشتركة أثناء عملهم.
جميع الأشياء المتوفرة في الـ Swing و التي يمكن إضافتها في النافذة لا تتنفذ بشكل متزامن الأمر الذي قد يؤدي إلى تعليق البرنامج في حال إستخدام Threadsيستخدمون مصادر مشتركة.

الطريقة الأولى لحل مشكلة المزامنة

الخطوات التي عليك فعلها في حال كنت لا تريد وراثة الكلاس JFrame:

  1. إفعل import للكلاس SwingUtilities.
  2. قم ببناء دالة نوعها privatestaticvoid و أعطها أي إسم تريد, ثم ضع فيها كل الكود الذي يجب أن تكتبه لبناء النافذة.
  3. في الدالة main() قم بإستدعاء الدالة invokeLater() و مرر لها كائن من الإنترفيس Runnable و إفعل Override للدالة run() و إجعلها فقط تستدعي الدالة التي تبني النافذة.
  1. import javax.swing.SwingUtilities;
  2.  
  3. publicclass Main {
  4.  
  5. privatestaticvoidcreateAndShowGUI(){
  6. // هنا نضع كود إنشاء النافذة و محتوياتها
  7. }
  8.  
  9. publicstaticvoidmain(String[] args){
  10. SwingUtilities.invokeLater(newRunnable(){
  11. @Override
  12. publicvoidrun(){
  13. // هنا نقوم فقط بإستدعاء الدالة التي تنشئ النافذة
  14. createAndShowGUI();
  15. }
  16. });
  17. }
  18. }

المثال التالي يعلمك طريقة تجهيز محتوى الـ Frame ليعمل بشكل متزامن.

مثال

Main.java

  1. import javax.swing.JFrame;
  2. import javax.swing.JButton;
  3. import java.awt.FlowLayout;
  4. import javax.swing.SwingUtilities;
  5.  
  6. publicclass Main {
  7.  
  8. // هنا نضع كود إنشاء النافذة و محتوياتها
  9. privatestaticvoidcreateAndShowGUI(){
  10. JFrame f = newJFrame()// أي قمنا بإنشاء نافذة JFrame هنا أنشأنا كائن من الكلاس
  11. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)// هنا جعلنا زر الخروج من النافذة يغلق البرنامج
  12. f.setSize(300200)// هنا قمنا بتحديد حجم النافذة. عرضها 300 و طولها 200
  13. f.setLayout(newFlowLayout())// لترتيب الأشياء التي نضيفها بداخلها FlowLayout هنا جعلنا النافذة تستخدم الـ
  14.  
  15. // Buttons هنا قمنا بتعريف إثنين
  16. JButton b1 = newJButton(“Button 1”);
  17. JButton b2 = newJButton(“Button 2”);
  18.  
  19. // في النافذة Buttons هنا قمنا بإضافة الـ
  20. f.add(b1);
  21. f.add(b2);
  22.  
  23. // هنا جعلنا النافذة مرئية
  24. f.setVisible(true);
  25. }
  26.  
  27. publicstaticvoidmain(String[] args){
  28. SwingUtilities.invokeLater(newRunnable(){
  29. @Override
  30. publicvoidrun(){
  31. // هنا نقوم فقط بإستدعاء الدالة التي تنشئ النافذة
  32. createAndShowGUI();
  33. }
  34. });
  35. }
  36.  
  37. }

ستظهر لك النافذة التالية عند التشغيل.

طريقة جعل محتوى ال JFrame متزامن في جافا

الطريقة الثانية لحل مشكلة المزامنة

الخطوات التي عليك فعلها في حال كنت تريد وراثة الكلاس JFrame:

  1. إفعل import للكلاس SwingUtilities.
  2. قم بوارثة الكلاس JFrame.
  3. قم ببناء دالة نوعها privatevoid و أعطها أي إسم تريد, ثم ضع فيها كل الكود الذي يجب أن تكتبه لبناء النافذة.
  4. إجعل الكونستركتور يستدعي الدالة التي تقوم ببناء النافذة.
  5. في الدالة main() قم بإستدعاء الدالة invokeLater() و مرر لها كائن من الإنترفيس Runnable و إفعل Override للدالة run(), ثم قم بإنشاء كائن من الكلاس, و عندها سيقوم الكونستركتور بإستدعاء الدالة التي تبني النافذة.
  1. import javax.swing.JFrame;
  2. import javax.swing.SwingUtilities;
  3.  
  4. publicclass Main extends JFrame {
  5.  
  6. publicMain(){
  7. createAndShowGUI();
  8. }
  9.  
  10. privatevoidcreateAndShowGUI(){
  11. // هنا نضع كود إنشاء النافذة و محتوياتها
  12. }
  13.  
  14. publicstaticvoidmain(String[] args){
  15. SwingUtilities.invokeLater(newRunnable(){
  16. @Override
  17. publicvoidrun(){
  18. // هنا نقوم فقط بإستدعاء الدالة التي تنشئ النافذة
  19. newMain();
  20. }
  21. });
  22. }
  23. }

المثال التالي يعلمك طريقة تجهيز محتوى الـ Frame ليعمل بشكل متزامن.

مثال

Main.java

  1. import javax.swing.JFrame;
  2. import javax.swing.JButton;
  3. import java.awt.FlowLayout;
  4. import javax.swing.SwingUtilities;
  5.  
  6. // و بالتالي أصبح إنشاء كائن منه يمثل إنشاء نافذة JFrame يرث من الكلاس Main هنا جعلنا الكلاس
  7. publicclass Main extends JFrame {
  8.  
  9. // فقط createAndShowGUI() سيقوم الكونستركتور بإستدعاء الدالة Main عند إنشاء كائن من الكلاس
  10. publicMain(){
  11. createAndShowGUI();
  12. }
  13.  
  14. // هنا نضع كود إنشاء النافذة و محتوياتها
  15. privatevoidcreateAndShowGUI(){
  16. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)// هنا جعلنا زر الخروج من النافذة يغلق البرنامج
  17. setSize(300200)// هنا قمنا بتحديد حجم النافذة. عرضها 300 و طولها 200
  18. setLayout(newFlowLayout())// لترتيب الأشياء التي نضيفها بداخلها FlowLayout هنا جعلنا النافذة تستخدم الـ
  19.  
  20. // Buttons هنا قمنا بتعريف إثنين
  21. JButton b1 = newJButton(“Button 1”);
  22. JButton b2 = newJButton(“Button 2”);
  23.  
  24. // في النافذة Buttons هنا قمنا بإضافة الـ
  25. add(b1);
  26. add(b2);
  27.  
  28. // هنا جعلنا النافذة مرئية
  29. setVisible(true);
  30. }
  31.  
  32. publicstaticvoidmain(String[] args){
  33. SwingUtilities.invokeLater(newRunnable(){
  34. @Override
  35. publicvoidrun(){
  36. // createAndShowGUI() هنا سيقوم الكونستركتور بإستدعاء الدالة .Main هنا نقوم فقط بإنشاء كائن من الكلاس
  37. newMain();
  38. }
  39. });
  40. }
  41.  
  42. }

ستظهر لك النافذة التالية عند التشغيل.

طريقة جعل محتوى ال JFrame متزامن في جافا

ملاحظة

إذا كنت تستخدم الـ GUI Builder الموجود في برنامج الـ Net Beans لبناء واجهة المستخدم, ستلاحظ أنه يراعي مشكلة المزامنة إذا إضطلعت على الأوامر التي يكتبها عنك كلما أضفت شيئاً جديداً.
كما أنه يقوم بتسمية الدالة التي يضع فيها كود إنشاء النافذة initComponents().

إذاً إلى هنا, أنت تعلمت كيف تبني واجهة مستخدم بواسطة الـ Swing و تعرفت على مختلف الأشياء التي يمكن إضافتها في الواجهة.
في الدرس التالي ستتعلم كيف تقوم ببناء برامج و ألعاب بسيطة بواسطة الـ Swing حتى تعرف كيف تستفيد من كل ما تعلمته سابقاً في البرامج التي قد تبنيها مستقبلاً.المصدر: حل مشكلة المزامنة – المناهج السعودية

مقالات ذات صلة

اترك رد

زر الذهاب إلى الأعلى

أنت تستخدم إضافة Adblock

برجاء دعمنا عن طريق تعطيل إضافة Adblock