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

مساعدة في برنامج جافا عن المسالك المتعددة

بدأه ريحانة الاقصى في 11 أكتوبر 2010 · 36 رد · 1,530 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

سبق وسالتكم عنو

وحصلت عى شرح منكم والحمد لله انجزت السؤال وبينفذ من غير اخطاء بس في ممشكلة بسيطة وهو انو الكود ما

بيوقف بعد الضغط على end

مع انو حاطط في الكود

if (e.getSource() ==b2)
    {
       done=false;

    	p.stop()
    	c.stop();

    }

و b2هو الز انهاء

ومش لازم لما نعمل انهاء للثريد يتوقف؟؟؟

l

تم تعديل هذه المشاركة بواسطة .S.T.A.L.K.E.R في 12 أكتوبر 2010 في 09:52 — السبب: add code tag

#2

ربما استخدمت الدالة

thread.stop()

وهي دالة Deprecated لكن لا مشكلة....

يبدو لي من اسم المتحول done أنه يجب أن يأخذ القيمة true ليتوقف ال thread ... شرط التحقق والحلقة while والقيمة البدائية لـ done هي التي تحدد إذا كان ال thread سيتوقف أم لا.

تم تعديل هذه المشاركة بواسطة JDurrah في 11 أكتوبر 2010 في 22:35

#3

هل بأمكانك ان تضعي الكود الخاص بالthread

لان كدا المفروض يشتغل

ولا تستخدمي stop

فقد نبهتك منها قبل ذلك

منتظرين كودك لمعرفه اين الخطأ

Software Developer
Mahmoudkelany.com


 

#4

هاي كود البرنامج كلو ممكن تشوفلي الاخطاء اللي فيه

هو ما بيطلع اخطاء برمجية بس وقت التشغيل ما بيعطي نتائج صحيحة خاصة وقت طباعة المصفوفة النهائية

البرنامج في المرفقات

تم تعديل هذه المشاركة بواسطة ريحانة الاقصى في 12 أكتوبر 2010 في 19:18

#5
ريحانة الاقصى كتب:

هاي كود البرنامج كلو ممكن تشوفلي الاخطاء اللي فيه

هو ما بيطلع اخطاء برمجية بس وقت التشغيل ما بيعطي نتائج صحيحة خاصة وقت طباعة المصفوفة النهائية

البرنامج في المرفقات

ممكن كمان تساعدني كيف انقل الاوامر المطبوعة من system .outالى frame

انا اسمعت انو بيلزمهم من خلال اشي اسمو panelبس للاسف هاد ما بعرفو

انا للان ما اخدت غير كورس جافا واحد والتاني لسا ما اخدتو

#6
ريحانة الاقصى كتب:

هاي كود البرنامج كلو ممكن تشوفلي الاخطاء اللي فيه

هو ما بيطلع اخطاء برمجية بس وقت التشغيل ما بيعطي نتائج صحيحة خاصة وقت طباعة المصفوفة النهائية

البرنامج في المرفقات

اختى الكريمه

البرنامج الخاص بكى

انتى تسمين متغيرات باسماء مثل s1 , s2 , s3 , s4 , t1 , t2 , .... وهكذا

لذلك فهو صعب فى الفهم

لذلك يجب عليكى بعد ذلك اتباع تسميه المتغيرات والدوال بطريقه ما اذا اعطيتى البرنامج لاحد يقدر على فهمه بدون الاستناد اليكى

ممكن تشرحى ما هو عمل هاتين الدالتين

لان شكى فيها انها هى التى تخرج النتائج غير صحيحه

public synchronized void put(int c) {
        while (count == array.length) {
            try {
                wait(10);
            } catch (InterruptedException e) {
            }
        }
        array[in] = c;
        System.out.println("produecer--array[ " + in + "]=" + array[in] + " ...");
        try {
            wait(1000);
        } catch (InterruptedException e) {
        }
        in = (in + 1) % array.length;
        count++;
        notify();
    }

    public synchronized void get() {
        while (count == 0) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        int c = array[out];
        System.out.println("consumer --array[ " + out + "]=" + 0 + " ...");
        try {
            wait(200);
        } catch (InterruptedException e) {
        }
        out = (out + 1) % array.length;
        try {
            wait(200);
        } catch (InterruptedException e) {
        }
        count--;
        notify();
    }
}

النتيجه التى تظهر لدى هى

post-217802-017399500 1286892743_thumb.p

وبالنسبه لقيم الـ s1 , s2 , s3 ,s4 هل ستتغير خلال البرنامج ام ستظل هكذا ؟؟؟

post-217802-088064000 1286892745_thumb.p

ريحانة الاقصى كتب:

ممكن كمان تساعدني كيف انقل الاوامر المطبوعة من system .outالى frame

انا اسمعت انو بيلزمهم من خلال اشي اسمو panelبس للاسف هاد ما بعرفو

انا للان ما اخدت غير كورس جافا واحد والتاني لسا ما اخدتو

هذه ليست المشكله

اهم شىء ان تظهر النتائج بشكل صحيح وبعد ذلك يتم وضعها داخل الـ frame

المرفقات
s1.pngs2.png

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 12 أكتوبر 2010 في 17:15

Software Developer
Mahmoudkelany.com


 

#7

المشكلة في منطق العمل Business Logic وليس في التعامل مع ال Threads.

#8

بالنسبة الى putهو الذي يستخدمه ال producer للتبديل الصفر الى واحد عندما يعمل

يقوم في البداية بفحص المصفوفة واذا كانت فارغة يبدل الاصفار الى واحد

اما اذا كانت ممتلة فانه يقوم ب الانتظار حتى يقوم الكونسيومير باستهلاكها

بالنسبة الى waitوضعتها لتبطيئ البرنامج ولكن لم تقوم باي شئ

اما ال get يقوم بفحص المصفوفة ويبدل الواحد باصفار

يمكن كل wait ما بتلزم بس لما اشيلهم ما بيوقف لما احط stop

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

بالنسبة للاسماء ان شاء الله بغيرهم ومنكم نستفيد

شكرا جزيلا

JDurrah كتب:

المشكلة في منطق العمل Business Logic وليس في التعامل مع ال Threads.

ما هذا ال Business Logic???????????

#9

من فضلك راجعى الدالتين put , get لانى لم افهم عملهم

فهذا ما قصده اخى JDurrah

من ان الـ put , get هى التى تأثر فى التعامل مع المستهلك والمنتج

وهذا ما يسمى بالـ Business Logic

راجعى حسابات هذه الدوال حسب ما تريدين

وملحوظه انا شايف انك كتابه 0 فى هذا السطر

يعنى دائما هتظهر النتيجه بصفر ؟

System.out.println("consumer --array[ " + out + "]=" + 0 + " ...");

انما بالنسبه لداله الـ wait

انتى لا تلاحظين انها تقف لانها تأخذ قيمه الوقت بالملى ثانيه

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

wait(1000);

بالنسبه للخربطه انا عدلت فيه اسماء المتغيرات وان كل class فى ملف

ان اردتى وضعت لك النسخه بعد التنظيم

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

ركزى دلوقتى فى الدوال put ,get وابدئى معها ولو من البدايه

ولكن بتركيز

وفققك الله :)

Software Developer
Mahmoudkelany.com


 

#10

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

انا عندي نفس سؤال الاخت وبطلع عندي نفس الناتج تقريبا بس المشكلة عندي اني ما بدي يطبع الناتج عن طريق system.out

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

وهذا هو الكود الذي كتبته في المرفقات ارجو فحصه واخباري اذا فيه اخطاء

تم تعديل هذه المشاركة بواسطة نسيم الصباح22 في 12 أكتوبر 2010 في 20:31

#11
Mahmoud Kelany كتب:

من فضلك راجعى الدالتين put , get لانى لم افهم عملهم

فهذا ما قصده اخى JDurrah

من ان الـ put , get هى التى تأثر فى التعامل مع المستهلك والمنتج

وهذا ما يسمى بالـ Business Logic

راجعى حسابات هذه الدوال حسب ما تريدين

وملحوظه انا شايف انك كتابه 0 فى هذا السطر

يعنى دائما هتظهر النتيجه بصفر ؟

System.out.println("consumer --array[ " + out + "]=" + 0 + " ...");

انما بالنسبه لداله الـ wait

انتى لا تلاحظين انها تقف لانها تأخذ قيمه الوقت بالملى ثانيه

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

wait(1000);

بالنسبه للخربطه انا عدلت فيه اسماء المتغيرات وان كل class فى ملف

ان اردتى وضعت لك النسخه بعد التنظيم

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

ركزى دلوقتى فى الدوال put ,get وابدئى معها ولو من البدايه

ولكن بتركيز

وفققك الله :)

مشكور كثير وشو من شان الكتابة ع الfram

ان شاء الله رح ازبط اللي قلتلي عليه بس كيف احط اللي موجود في systemعلى الفريم من خلال ال panel

#12
ريحانة الاقصى كتب:

مشكور كثير وشو من شان الكتابة ع الfram

ان شاء الله رح ازبط اللي قلتلي عليه بس كيف احط اللي موجود في systemعلى الفريم من خلال ال panel

لا موضوع الكتابه على الـ frame دا ان شاء الله هتتحل

بس اهم حاجه تكون النتائج صحيحه

وبعدها ننتقل الى عرض النتيجه على الframe

Software Developer
Mahmoudkelany.com


 

#13

انا هلا زبطت البرنامج ع اساس معين لو بدي اغيرو بحيث انو

اعرف متغير اسمو inبيرمز لموقع التخزين ويكون مشترك بين الكونسيومير والبروديوسير وطبعا المصفوفة مشتركة ويكون عندي counterللعناصر

بحيث في البداية يكون ال counter=o

هلا داخل الميثود putاول اشي يفحص ال counterاذا كان يساوي عدد العناصر اذا انو المصفوفة ملانة ما بيقدر يضيف عليها اما اذا كانت counterلا يساوي صفر معناها انو يوجد عناصر فارغة في بداية العملية

بتكون in =0وهون بدو يبلش من اول موقع في المصفوفة array [0 ] ويغير قيمت الموقع الاول ل 1 وبعدها يزيد ال counter ويغير قيمة in ويرجع ل while loopاللي بتفحص انو الكونتير بساوي عدد العناصر هلا اذا خلص وقت الثرد او انو الcounterصار بيساوي عدد العناصر بدو يعمل Waite هدا الوقت بيروح للكونسيومير وهو الثرد الثاني طبعا in مشتركة بدو يبلش شغله من مكان ما خلص الاول يعني متلا اذا اخر عملية للبروديوسير كانت

producer__array[2]=1

وقتها بتكون قيمة in =2وال counter=2 وهون بيبلش الكونسيومير من in =2

بحيث يجعل array[in]=0

وينقص قيمة in والcounterبحيث يذهب للموقع السابق اللي كان البروديوسير حاطط فيه 1 ويخليها صفر وبرضو اذا فضيت المصفوفة او خلص وقتو يستانف البروديوسير من حيث انهى الكونسيومير

هذه العمليات توضح ما اقصده

producer__array[o]=1

producer__array[1]=1

producer__array[2]=1

فمثلا لو هنا انهى الكمبيوتر عمل البروديوسير سيكمل الكونسيومير ع النحو التالي

consumer__array[2]=0

consumer__array[1]=0

consumer__array[0]=0

ولو حاول الكونسيومير الاكمال فان شرط while سيوقفه وهو ان counter !=0

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

اذا ما قدرت اضبطه هكذا ساعود الى الالية الاولى وبعدها احولو ل فريم

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

  public synchronized void Put(int c) {


                while(count == array.length) 
                 {
                      try { wait( ); }
                      catch (InterruptedException e) { } 

                 }
                  count++; 
                 array[in] = c;

                 System.out.println("produecer--array[ "+in+"]=" + array[in] + " ...");

                 in = (in+ 1) % array.length; 



                 notify();
            }




 public synchronized void Get() {

                 while (count == 0) 
                 {
                      try { wait(); }

                      catch (InterruptedException e) { } 

                 } 

                 int c =array[in];


                  System.out.println("consumer --array[ "+in+"]=" + 0 + " ...");


             in= (in-1) % array.length;


                  count--;

                 notify(); 

            }}

تم تعديل هذه المشاركة بواسطة Eisa Ayed في 13 أكتوبر 2010 في 10:29 — السبب: code tag

#14

لماذا لا يتم التحكم (أي إدخال القيم) بوساطة المتحول count.............(فقط فكرة).

#15
JDurrah كتب:

لماذا لا يتم التحكم (أي إدخال القيم) بوساطة المتحول count.............(فقط فكرة).

ما فهمت كيف يعني؟؟

#16

أنا جربت التحكم بوساطة المتحول count فقط: لم استخدم المتحولين in وout ...


public synchronized void Put(int c){
while(count == array.length){
try{
wait();
}
catch(InterruptedException e){
}
}
array[count] = c;
System.out.println("produecer--array[ "+count+"]=" + array[count] + " ...");
count = (count+ 1) % array.length;
notify();
}
public synchronized void Get(){
while (count == 0){
try {
wait();
}catch (InterruptedException e) {
}
}
int c =array[count];
System.out.println("consumer --array[ "+count+"]=" + array[count] + "...");
count--;
notify();
}

جربي هذا وسيعطي نتيجة

تم تعديل هذه المشاركة بواسطة JDurrah في 13 أكتوبر 2010 في 16:09

#17

بالعكس هيك اتعقد الموضوع تماما

هلا انا اعتمدت حلي الاول...ودكتورنا قلي انو مقبول

ممكن تساعدني في اني احطو داخل fram

غلبتك كتير معي

#18

ممكن تضعى الكود كامل بعد تعديل الجزئيه الخاصه بالـ Put , Get

وتأكدى انه يعمل بشكل سليم باستخدام System.out

و توضيحي ماذا تردين فعله بالنسبه للـ frame

هل النتيجه النهائيه ام النتيجه الخاصه بكل تغير

Software Developer
Mahmoudkelany.com


 

#19
Mahmoud Kelany كتب:

ممكن تضعى الكود كامل بعد تعديل الجزئيه الخاصه بالـ Put , Get

وتأكدى انه يعمل بشكل سليم باستخدام System.out

و توضيحي ماذا تردين فعله بالنسبه للـ frame

هل النتيجه النهائيه ام النتيجه الخاصه بكل تغير

انا اريد ان اضع النتيجة الخاصة بكل تغير

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

وخلص ان شاء الله رح اعتمدها

بالمرفقات الاصدار الاخير من البرنامج (ع اساس بنكتشف بالذرة يعني)

انا عدلت كتير عليه

يمكن نصو كان اشياء ما بتلزم

تم تعديل هذه المشاركة بواسطة ريحانة الاقصى في 13 أكتوبر 2010 في 19:57

#20
ريحانة الاقصى كتب:

انا اريد ان اضع النتيجة الخاصة بكل تغير

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

وخلص ان شاء الله رح اعتمدها

بالمرفقات الاصدار الاخير من البرنامج (ع اساس بنكتشف بالذرة يعني)

انا عدلت كتير عليه

يمكن نصو كان اشياء ما بتلزم

سوالى الان كى اتعامل مع كيفيه وضع النتيجه داخل الـ Frame

اريد ان اعرف

هل الصفر الموجود داخل هذه الجمله يبقى هكذا فعلا ؟

ام انه خطأ

System.out.println("consumer --array[ " + out + "]=" + 0 + " ...");

Software Developer
Mahmoudkelany.com


 

#21
Mahmoud Kelany كتب:

سوالى الان كى اتعامل مع كيفيه وضع النتيجه داخل الـ Frame

اريد ان اعرف

هل الصفر الموجود داخل هذه الجمله يبقى هكذا فعلا ؟

ام انه خطأ

System.out.println("consumer --array[ " + out + "]=" + 0 + " ...");

لا هو هكذا

يقوم بوضع الصفر في وقت عمل الكونسيومير حيث يبدل العنصر الاول وهو الواحد الى صفر

#22

لا هاد صحيح

بيعطي المصفوفة قيمة 0 لما يكون الكونسيومير اللي بيشتغل

بس اذا بيعملك مشكلخ بتقدر تبدلو ب

int c =0;

array[count]=c;

System.out.println("consumer --array[ "+count+"]=" + array[count] + " ...");

#23

ما هو المطلوب إذاً؟.

#24
ريحانة الاقصى كتب:

لا هو هكذا

يقوم بوضع الصفر في وقت عمل الكونسيومير حيث يبدل العنصر الاول وهو الواحد الى صفر

تمام انا كنت بسأل بشوف هو كدا صح ولا

لكن انا لحد الان تواجهنى مشكله فاظهار الكود فى الـ textFields

وذلك لسوء تقسيم الكود

مش عارف بحاول

شكيت انى ماشى غلط

انا عملتها بالـ Jframe من اول وجديد ونقلت فيه الشغل وهى تعمل لكن انا اريد التعديل على كودك

Software Developer
Mahmoudkelany.com


 

#25
Mahmoud Kelany كتب:

تمام انا كنت بسأل بشوف هو كدا صح ولا

لكن انا لحد الان تواجهنى مشكله فاظهار الكود فى الـ textFields

وذلك لسوء تقسيم الكود

مش عارف بحاول

شكيت انى ماشى غلط

انا عملتها بالـ Jframe من اول وجديد ونقلت فيه الشغل وهى تعمل لكن انا اريد التعديل على كودك

اوكي عدل عليه

بس رجاءا حطلي كومنت مكان ما بتعدل

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…