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

التنفيذ في الزمن الحقيقي Real Time و الزمن مقابل الذاكرة

بدأه عبد الرحمن أحمد في 9 مايو 2012 · 22 رد · 10,510 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

1-البداية :

لا شك أن الكثير منا سمع بمصطلح الزمن الحقيقي Real Time فمثلا في مجال التصاميم الثلاثية الأبعاد نسمع عن شيء اسمه ريندر في الزمن الحقيقي

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

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

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

فهذا المصطلح يعني أن نجعل الزمن بين لحظة إعطاء الأوامر للتنفيذ وبين الحصول على النتيجة يتناهى إلى الصفر وذلك لأن طبيعة الامر تتطلب أن يكون الزمن أصغريا وكلما اقترب إلى الانعدام أصبح مثالي أكثر ولكن أن يصبح معدوما تماما فهذا مستحيل طبعا ولكن جعله صغير جدا لدرجة أن لا يؤثر على النتيجة

وسنضرب مثالا :

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

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

لو تعلق الأمر باجتماع طاري وهام قد يقوم المسافر بحجز تذكرة طائرة لضبط دقة الوصول أكثر

الآن ماذا لو تعلق الأمر بحادث ما وتطلب إسعاف

هنا يجب أن يتم اتخاذ الإجراءات لتقليل زمن الوصول ما أمكن

فمثلا يتم اختيار سيارات سريعة وجديدة لتقليل احتمال التعطل

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

وهكذا لضمان وصول المصاب بأسرع وقت ممكن لأن في التأخر قد يؤدي إلى مضاعفات وربما وفاة

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

من هذا المنطلق تأتي دور البرامج التي تعمل في الزمن الحقيقي

فمثلا برامج التصميم ثلاثية الأبعاد المعدة لإنتاج أفلام ومشاهد عالية الدقة والوضوع وأقرب للواقعية تستغرق عملية الريندر ساعات وربما أيام على أحدث الأجهزة

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

برنامج يدير حركة طيران في كل أنحاء العالم يختلف عن برنامج تربط بين شركة وفرعها في مكان آخر

لأن الأول وعند عملية حجز لمسافر على متن طائرة لرحلة معينة يجب أن تعكس العملية مباشرة بحيث لو قام مكتب حجز في أي مكان آخر للحجز على نفس الرحلة أن يعلم أن المكان المتاح قد حجز للتو ولم يعد متوفرا

الآن لو كان هناك عملية معالجة صورة وحيدة قد تعملها على الفوتوشوب وتنتظر عدة ثواني أو دقائق لا مشكلة لأنه المهم الحصول على النتيجة

أما ماذا لو كانت المعالجة لصور قادمة من كاميرة مراقبة ويترتب عليها حدث مباشر مثل إنذار مثلا

فهذا يعني أنك محكوم بزمن تنفيذ محدد هو 1 مقسوم على عدد الأطر في الثانية

في الحالة المثالية وحتى لا تشعر العين البشرية برجفة الصورة يجب ان يكون التردد 24 إطار (صورة) في الثانية الواحدة

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

إذا لا بد أن يكون التنفيذ في الزمن الحقيقي أي لو فرضنا أننا نقبل بتردد 14 صورة فلا بد أن تنجز عمليات معالجة الصورة وتحليلها خلال زمن 0.07 ثانية أي 70 ملي ثانية

وإلا فالبرنامج يعتبر سيء

من هنا عندما تكون الخوارزميات والإجراءات هي لبرنامج يعمل في الزمن الحقيقي أن نضع في حسباننا الزمن أولا مهما كان ذلك على حساب التخزين والذواكر والعتاد الصلب .

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

والموضوع مطروح للجميع بالمشاركة فيه لكي تكبر الفائدة إلى أبعد مدى

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

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

وسأستخدم لغة السي شارب C# لأني أستخدمها حاليا

والله ولي التوفيق

يتبع ... 2

تم تعديل هذه المشاركة بواسطة المبرمج أبو أحمد في 9 مايو 2012 في 13:31

3

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#2

2- متابعة لما سبق :

إن أكثر ما يصادفك في عمليات المعالجة هو إجراء عمليات حسابية متكررة على مجموعة معطيات كثيرة

فمثلا لو أنك فقط ستقوم بعكس ألوان الصورة

فلديك التالي :

استقبال الصورة من الكاميرا وقراءة قيم المركبات اللونية (الأحمر ، الأخضر ، الأزرق ) RGB لكل عنصورة في الصورة Pixel

وعلى اعتبار أن قيمة كل مركبة تأخذ قيمة ضمن المجال 0-255 أي أن بايت واحد يكفيها وبالتالي فللعنصورة تحتاج إلى 3 بايتات

ولو فرضنا أن الكاميرا تعمل بدقة 640×480 بيكسل فهذا يعني أننا بحاجة لمصفوفة بايتات 640×480×3 = 921600 أي حوالي مليون بايت ولو كان فورمات الصورة هو 32 بت فسيصبح الحجم 1,228,800 أي زاد بمقدار الثلث

وتخيل الآن العمليات المطلوبة :

حجز مصفوفة بهذا الحجم

نقل الداتا من الصورة إليها

إجراء حلقة / حلقات تقوم بالمرور على كل بايت من تلك المصفوفة وإجراء عملية العكس أي طرح القيمة الحالية من 255 ومن ثم إعادة تشكيل الصورة من المصفوفة ذات القيم المحدثة لإظهارها على نافذة جديدة كنتيجة تعكس العملية

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

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

كذلك الأمر عملية النسخ قد تتم بإجراء عداد يقوم بنقل القيم من المصفوفة الأصلية للصورة إلى المصفوفة الجديدة حتى لا تؤثر على الصورة الأصلية

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

الآن كل هذا جميل من الناحية النظرية ولكن من الناحية العملية سيء للغاية

في البرامج التي تعمل في الزمن الحقيقة أنت بحاجة لتوفير كل واحد ميكرو ثانية وليس ملي ثانية فحسب أي 0.000001 ثانية

لهذا فاختصار عملية جمع هي لصالحك ويتوجب عليك تجربة أي التعليمات أوفر فقد يكون استخدام تعليمة سويتش switch اسرع من تعليمة if

من هذا المنطلق سنحاول وضع كل معلومة أو نتيجة في هذا الإطار

يتبع ... 3

تم تعديل هذه المشاركة بواسطة المبرمج أبو أحمد في 9 مايو 2012 في 14:06

2

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#3

3 - متابعة للمشاركة #2

أود أن أذكر لا تستهين بالزمن مهما كان صغير فأنت بحاجة لكل نانو ثانية 0.000000001 لأن هذه التي لا تعجبك عندما تكون ضمن حلقات بالملايين ستتحول إلى ملي ثانية

وكمثال عملي عندما أردت أن أعكس الصورة فلا بد أن أحول قيم مركبات كل بيكسل إلى متمماتها أي أطرح كل قيمة مركبة لونية من القيمة العظمى 255

والبديهي :

R = 255 - R ;
G = 255 - G ;
B = 255 - B ;

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

R ^= 255;
G ^= 255;
B ^= 255;

طبعا الرمز ^ هو تعليمة Xor المنطقية وهي إذا طبقت بين قيمة ثنائية و واحد منطقي تقوم بعكسه

ولهذا ضربت محتوى المركبة بثمانية بتات كلها واحدات 11111111 والتي هي 255 بالعشري وبالتالي نتيجة العملية ستكون عكس بتات المتغير أي متممه

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

إذا ما أردت قوله أن تهتم لنوع التعليمات التي تستخدمها

للعلم هذا المثال من أجل توضيح الفكرة فقط وربما هناك طرق أسرع من هذه وتلك ولكن تحتاج إلى بحث وتجربة.

يتبع ... 4

تم تعديل هذه المشاركة بواسطة المبرمج أبو أحمد في 10 مايو 2012 في 15:34

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#4

4 - متابعة للمشاركة #3

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

وبالتالي لا شك أنه عندما نبرمج بلغة السي بلس بلس هو أفضل بكثير من البرمجة بلغة البيزيك ولا شك أن السبب معروف وهو قوة المترجم Compiler الذي ينتج شيفرة مصدرية أي بلغة الآلة أصغر بكثير مما تنتجه مترجمات أو مفسرات اللغات الأخرى

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

ولكن أنى لمبرمج أن يبني تطبيقات كبيرة ومعقدة وذات واجهات بلغة الآلة

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

ويأتي السؤال هنا هل كل ما فكر مطور ما بكتابة برنامج يتطلب سرعة عالية في التنفيذ أن يضطر التخلي عن لغته لتعلم لغة قوية

هو أكيد أن الجواب نعم ولكن في الغالب صعب ، ولهذا فلا مانع من أن ينتهج المبرمج نهج وسطي يعني على مبدأ لا يموت الذئب ولا يفنى الغنم

البشرى الجميلة هي أنه أصبحت الكثير من اللغات توفر هذا النهج ، كيف ؟

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

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

إذا طالما أن التطبيقات ستكون موجهة لنظام ويندوز فلما لا تكون اللغات المستخدمة هي من نفس العائلة

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

من هنا نجد أن مايكروسوفت أتاحت لكل لغاتها أن تستخدم الوظائف المضمنة في مكتباتها ذات المستوى الأقرب للعتاد والهارد وير

فأصبح بالإمكان أن تطلب وظائف للقيام بأمور متعلقة بالعتاد الصلب مباشرة من خلال مكتبات API والتي سمحت باستغلالها منذ الاصدارات الأولى لأبسط اللغات وهي الفيجوال بيزيك

إذا كخطوة رئيسية عند برمجة التطبيقات في الزمن الحقيقي من خلال لغات عالية المستوى هو كتابة الأجزاء المهمة من الشيفرة والتي تتعلق بالعمليات التكرارية والمعالجة والتخزين وغيرها من خلال استخدام وظائف مكتبات API والتي توفر كل شيء تقريبا وأحيانا توفر ملا توفره الأكواد العادية

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

ولكن اصطدمت بزمن ضائع من هنا بدأت رحلة البحث عن الطرق البديلة التي تؤدي نفس الغرض ولكن بزمن أقل بكثير

حتى توصلت إلى تعليمة CopyMemory التابعة للمكتبة Kernal.dll فكانت سريعة للغاية وبعد المزيد من البحث توصلت لتعليمة أسرع منها وهي تعليمة memcpy التابعة للمكتبة msvcrt.dll وكانت النتيجة أن السرعة كانت بعشرة أضعاف وأكثر من الخيار الأول

أي أنه لو كانت عمليات نقل البيانات تستغرق 10 ملي ثانية أصحبت الآن تستغرق 1 ملي ثانية أي أنه أصبح لديك مجال لتسع عمليات مشابهة ولو كنت لست بحاجة إليها فلاشك أنها ستلزمك في باقي العمليات.

إذا خصص بعض الوقت للبحث والتجارب في الطرق الأنجع لخوارزميتك والأكواد الأفضل لتكسب بعدها زمنا أنت بحاجة لكل جزء منه.

يتبع .. 5

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#5

5- متابعة المشاركة 4#

بما أن المهم في تطبيقات الزمن الحقيقي هو الزمن إلا أنه وحتى نكون دقيقين في الوصف ليس كل البرنامج بحاجة لأن يكون زمن تنفيذ شيفرته هو المقصود وإنما هناك مقاطع من الشيفرة هي المعنية والتي تكون مسؤولة عن معالجة البيانات كمثال في برنامجنا المتابعة عن طريق الكاميرا

الجزء المهم من البرنامج هو الحدث الذي يقدح عند كل إطار أو فريم صورة جديد قادم من الكاميرا

أما حدث Load للبرنامج والتهيئات الأولية وأحداث طارئة مثل النقر على زر ما لإيقاف الكامير أو بدأ التسجيل أو الانتقال بين الكاميرات كل هؤلاء ليسوا بذات الأهمية من حيث الزمن

وذلك لأنه ينبغي على الحدث أن ينهي ما بداخله من أكواد قبل ورورد الفريم التالي ولو افترضنا أننا ضبطنا تردد الكاميرا على 24 فريم في الثانية فهذا يعني أنه لدينا فقط 0.04 ثانية أي 40 ملي ثانية لكي ننجز الهوارزميات والإجراءات التي داخل حدث الفريم

من هذا المنطلق ما أريد أن أقوله أنه في هذا البلوك أي جسم الحدث يجب إخراج كل ما هو ليس ضروري وغير مرتبط بالصورة الجديدة

كحجز المصفوفات والثوابت والمتحولات والتهيئات الأولية

صحيح أنه من الأصول أن لا نصرح عن المتحول إلى حيث نستخدمه حتى لا يشغل الذاكرة بدون فائدة ولكن في حالتنا أصبح هناك أولويات وهو الزمن

لذلك لتحجز الذاكرة من أول البرنامج إلى آخره أفضل من إضاعة وقت للتصريح في كل مرة يقدح فيها الحدث

كمثال :

طالما أني أعرف قياس الصورة مسبقا إذا فحجم المصفوفات اللازمة معروفة وثابتة فلنقم بحجزها من البداية ولتبقى محجوزة

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

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

وبالتجربة كان زمن تنفيذ حلقة تمر على كل العناصر لضع فيها قيمة افتراضية أكبر من زمن إنشاء مصفوفة بتعليمة new

إلا أنه يوجد تعليمة أسرع من هذه وتلك وهي منهج Clear التابع للصنف Array بحيث تمرر له المصفوفة وطولها فيقوم بتهيئة العناصر إلى القيم الافتراضية.

نفس الأمر ينطبق على المتحولات والكائنات

إذا نحاول أن نصدر تعليمات new خارج حدث المعالجة ونضعه في بداية تشغيل البرنامج

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

يتبع .. 6

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#6

موضوع جميل و مهم و مفيد, و صياغتك له أكثر من رائعة و افكارك مرتبة.

تحياتى لك.

1
#7
فادى_بلس_بلس كتب:

موضوع جميل و مهم و مفيد, و صياغتك له أكثر من رائعة و افكارك مرتبة.

تحياتى لك.

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

أكرمك الله أخي

هذا من لطفك وذوقك

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

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

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

كما أرحب بأي استفسار أو نقاش لكي نصقل الأفكار ونتعلم جميعا من بعضنا

وحياك الله

تم تعديل هذه المشاركة بواسطة المبرمج أبو أحمد في 14 مايو 2012 في 23:26

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#8
المبرمج أبو أحمد كتب:

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

أكرمك الله أخي

هذا من لطفك وذوقك

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

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

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

كما أرحب بأي استفسار أو نقاش لكي نصقل الأفكار ونتعلم جميعا من بعضنا

وحياك الله

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

برنامج الrealtime خطير جدا لأن أى برنامج أخر اذا توقف فببساطة يمكن اغلاقة و اعادة فتحة دون أضرار كبيرة, لكن برنامج الrealtime غير مقبول توقفه تحت اى ظروف.

استفدت للغاية من موضوعك و منتظر الباقى. و صدقنى لا تهتم بعدد الردود فى المنتدى, فهناك عدد كبير يقرأ المواضيع من خارج المنتدى و ليسوا اعضاء فيه.

تحياتى لك.

1
#9
فادى_بلس_بلس كتب:

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

برنامج الrealtime خطير جدا لأن أى برنامج أخر اذا توقف فببساطة يمكن اغلاقة و اعادة فتحة دون أضرار كبيرة, لكن برنامج الrealtime غير مقبول توقفه تحت اى ظروف.

استفدت للغاية من موضوعك و منتظر الباقى. و صدقنى لا تهتم بعدد الردود فى المنتدى, فهناك عدد كبير يقرأ المواضيع من خارج المنتدى و ليسوا اعضاء فيه.

تحياتى لك.

طيب أخي هل بالإمكان لم يكن لدي كمانع أن تذكر لنا أمثلة عن البرامج التي عملتها وما هي الصعوبات التي واجهتك

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

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

ودمت بخير

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#10
المبرمج أبو أحمد كتب:

طيب أخي هل بالإمكان لم يكن لدي كمانع أن تذكر لنا أمثلة عن البرامج التي عملتها وما هي الصعوبات التي واجهتك

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

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

ودمت بخير

البرنامج يستخدم فى الخدمات البترولية حيث يقوم بقراءة البيانات من جهاز DAQ.

الجهاز موصول بناقل تسلسلى, و يقوم البرنامج بقراءة المعلومات منه ثم معالجتها و اجراء بعض الحسابات الهندسية عليها, و تقديمها بشكل بيانات و رسوميات بيانية على شاشة الحاسوب, و تسجيل البيانات ثانية بثانية فى قاعدة بيانات.

كانت مشكلتى الوحيدة فى السرعة (برنامجى كان يحتاج الى احتساب كل ثانية أو ثانيتين على الاكثر ) ان قراءة معلومات عن ملفات قاعدة البيانات (مثل حجم الملفات, أخر تسجيل للبيانات, حجم الذاكرة, حجم المساحة الخالية فى الهارد) كان يأخذ وقتا نسبيا, لذا قمت بعملها بطريقة متوازية حيث يحتوى البرنامج على خطين 2 Threads االاول لاستقبال البيانات و اجراء العمليات الحسابية, و الثانى لجمع المعلومات ( هو الوظيفة الاقل اهمية).

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

طبعا يمكن الاعتماد على البرمجة المتوازية فى حالة واحدة فقط, و هى عدم وجود تسلسل للعمليات الحسابية, أى ان حساب القيمة الثانية لا يعتمد على القيمة الاولى, و أن يكون احدى العمليات (مثلا احتساب القيمة الاولى) يعتمد على جهاز يجب انتظار انتهائه من العمل لذا لا داعى لتعطيل العملية الحسابية التى تليها.

تسريب الذاكرة مشكلة أخرى قابلتها كثيرا.

يعتقد البعض ان تسريب الذاكرة يمكن تجنبه بهذه الطريقة فقط!

char *ss;
ss=(char*)malloc(1001);

.
.
.
.
.

free(ss);

مادامت قد قمت بتحرير الذاكرة فلن يحدث تسريب.

لكن فى البرامج الكبيرة, قد لا تلاحظ أبدا من اين يأتى التسريب,

فقد تقوم بالخروج فى حالة الخطأ و تنسى تحرير الذاكرة فى شرط الخروج,

قد يحدث ظاهرة ما يعرف بmemroy fragmentatio و التى مع وقت قد تتسبب بتسرب كبير للذاكرة (و هى مشكلة واجهتها).

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

طبعا تسرب الذاكرة غير مقبول تماما و لو بقدر بسيط فى برامج الrealtime.

تم تعديل هذه المشاركة بواسطة فادى_بلس_بلس في 15 مايو 2012 في 00:33

#11

الـ Real-Time Applications يتم كتابتها لتعمل على أنظمة تشغيل بخصائص معينه، هذه الأنظمة تسمي بـ Real-Time Operating Systems و تختلف عن الأنظمه المعتاده فى العديد من الأمور - إقراء عنها فى Wikipedia.

معالجة الصور للـ RTA لها العديد من الأساليب، نفس الكلام يعتمد على معالجة الفيديو و معالجة الصوت، تجد العديد من الـ algorithms لهذه العمليات موجوده بكثره داخل كتب ضغط البيانات و معالجة الصور.

تطبيقات RTA لا تتم ابدا ابدا بلغة تعتمد على VM و لا حتى بواحد من المليون من البرنامج لإن مثل هذه اللغات أبطء كثيرا من اللغات الـ native.

كتابة البرنامج بلغة الأله - على إفتراض ان احدا سيفعلها - لن يجعله سريع و برنامج مكتوب جيدا بلغة السي او سي++ افضل من نفس البرنامج مكتوب بشكل سئ بلغة الأله الأسمبلي.

عند كتابة برنامج RT فإنه فى العديد من الأحيان كتابة اجزاء ليست بالبسيطه بإستخدام لغة الأسمبلي و ايضا اجراء optimizations عاليه جدا عليه فأنت لا تتوقع ان تقوم بكتابة برنامج ليستقبل صور من القمر الصناعي لرصد منطقه معينه بلغة الـ #C!!

اقتباس
فقد تقوم بالخروج فى حالة الخطأ و تنسى تحرير الذاكرة فى شرط الخروج,

قد يحدث ظاهرة ما يعرف بmemroy fragmentatio و التى مع وقت قد تتسبب بتسرب كبير للذاكرة (و هى مشكلة واجهتها).

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

طبعا تسرب الذاكرة غير مقبول تماما و لو بقدر بسيط فى برامج الrealtime.

لهذا لا يتم حجز الذاكره بشكل يدوي داخل البرنامج و انما يتم استخدام Memory Pool بالإضافه لـ GC ليتعامل مع هذه الأمور.

بالنسبه للكود الخاص بالصوره فتوجد طريقه اسرع من المذكوره فبدلا من استخدام XOR إستخدم NOT "~".

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة Μωάμεθ αλάά في 15 مايو 2012 في 01:31

1

مدونتي: C++ Tips and Tricks

#12
اقتباس
الـ Real-Time Applications يتم كتابتها لتعمل على أنظمة تشغيل بخصائص معينه، هذه الأنظمة تسمي بـ Real-Time Operating Systems و تختلف عن الأنظمه المعتاده فى العديد من الأمور - إقراء عنها فى Wikipedia.

انت خلطت بين شيئين مختلفين تماما,

ما تتحدث عنه هو نظم تشغيل الReal-time, و هى انظمة تشغيل محدودة يعمل فيها البرنامج فى share محدد من الcpu و بالتالى يمكننا ان نعرف سرعة التنفيذ بمعلومية سرعة المعالج.

أنظمة الrealtime ليست واقعية فى عالم أنظمة التشغيل الحديثة, مثل ويندوز فهو virtual و ليس realtime لأننا نحتاج الى مميزات كثيرة لا يمكن اجرائها فى نظم تشغيل real-time. و مثلا لا يمكنك أبدا ان تعرف كم الوقت الذى سوف تنفذ فيه تعليمة معينة لأن هناك عوامل أخرى متداخلة(الكيرنل و ادارته للذاكرة, و غير ذلك), فقد تستهلك التعليمات وقتا مختلفا فى كل مرة.

ما يقصده الأستاذ أبو أحمد شىء أخر هو نوع من البرامج تسمى بالreal time أو تسمى أحيانا Online و ليست بالضرورة أن تعمل على نظم real-time, و هى البرامج التى تقوم بمعالجة بيانات متتالية تأتى من جهاز معين (كاميرا, جهاز) فى وقت محدد, و عليه ان ينجز العمليات بوقت محدد لاستقبال البيانات التالية و معالجتها(و الا ضاع دفق البيانات الصحيح).

عمل هذه البرامج على نظام realtime ليس امرا واقعيا, لأن معظمها أنظمة غير موجودة على الارض أو تعمل على أجهزة ضعيفة.(أكثرهم شهرة windows mobile).

لا تخلط بين هذا و ذاك.

#13
Μωάμεθ αλάά كتب:

الـ Real-Time Applications يتم كتابتها لتعمل على أنظمة تشغيل بخصائص معينه، هذه الأنظمة تسمي بـ Real-Time Operating Systems و تختلف عن الأنظمه المعتاده فى العديد من الأمور - إقراء عنها فى Wikipedia.

معالجة الصور للـ RTA لها العديد من الأساليب، نفس الكلام يعتمد على معالجة الفيديو و معالجة الصوت، تجد العديد من الـ algorithms لهذه العمليات موجوده بكثره داخل كتب ضغط البيانات و معالجة الصور.

تطبيقات RTA لا تتم ابدا ابدا بلغة تعتمد على VM و لا حتى بواحد من المليون من البرنامج لإن مثل هذه اللغات أبطء كثيرا من اللغات الـ native.

كتابة البرنامج بلغة الأله - على إفتراض ان احدا سيفعلها - لن يجعله سريع و برنامج مكتوب جيدا بلغة السي او سي++ افضل من نفس البرنامج مكتوب بشكل سئ بلغة الأله الأسمبلي.

عند كتابة برنامج RT فإنه فى العديد من الأحيان كتابة اجزاء ليست بالبسيطه بإستخدام لغة الأسمبلي و ايضا اجراء optimizations عاليه جدا عليه فأنت لا تتوقع ان تقوم بكتابة برنامج ليستقبل صور من القمر الصناعي لرصد منطقه معينه بلغة الـ #C!!

لهذا لا يتم حجز الذاكره بشكل يدوي داخل البرنامج و انما يتم استخدام Memory Pool بالإضافه لـ GC ليتعامل مع هذه الأمور.

بالنسبه للكود الخاص بالصوره فتوجد طريقه اسرع من المذكوره فبدلا من استخدام XOR إستخدم NOT "~".

و الله ولي التوفيق

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

جزاك الله خيرا أخي محمد على الإثراء

و سرّني مرورك الكريم

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

والحقيقة ما قال الاخ فادي هو ما أعنيه بالضبط

ولهذا ضربت المثال

فهل تظن أنه إذا طلب مني زبون عمل برنامج تحكم من خلال متابعة كاميرة مراقبة أن أستخدم حاسب عادي وتطبيق سي شارب أم أذهب إلا وكالة ناسا لتصنع لي كمبيوتر ذري خاص بالمطلوب smile.gif

نعم الكلمة أخذتها على الاصطلاح وليس على المعنى الحقيقي الذي كتبته أنت

ثم إني أشكرك للإضافة بخصوص تعليمة Not وصراحة لإني عندما كتب المشاركة أردت قرنها بمثال فذهبت للبرنامج وقمت بتجربة Xor وبالقياس ظهرت أسرع فوضعتها في المشاركة ولم أكمل عملية البحث عن الأسرع

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

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

فيما يخص تعليقك على مسألة الذاكرة ذكرت مصطلح

اقتباس
لهذا لا يتم حجز الذاكره بشكل يدوي داخل البرنامج و انما يتم استخدام Memory Pool بالإضافه لـ GC ليتعامل مع هذه الأمور.

فهل بالإمكان أن تعطينا نبذة عنهما لعلنا نستفيد

وأشكرك مرة أخرى لمرورك الطيب

تم تعديل هذه المشاركة بواسطة المبرمج أبو أحمد في 15 مايو 2012 في 02:39

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#14

راجع هذه المشاركه.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#15
Μωάμεθ αλάά كتب:

راجع هذه المشاركه.

و الله ولي التوفيق

أحسنت ، بارك الله بك.

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#16
فادى_بلس_بلس كتب:

البرنامج يستخدم فى الخدمات البترولية حيث يقوم بقراءة البيانات من جهاز DAQ.

الجهاز موصول بناقل تسلسلى, و يقوم البرنامج بقراءة المعلومات منه ثم معالجتها و اجراء بعض الحسابات الهندسية عليها, و تقديمها بشكل بيانات و رسوميات بيانية على شاشة الحاسوب, و تسجيل البيانات ثانية بثانية فى قاعدة بيانات.

كانت مشكلتى الوحيدة فى السرعة (برنامجى كان يحتاج الى احتساب كل ثانية أو ثانيتين على الاكثر ) ان قراءة معلومات عن ملفات قاعدة البيانات (مثل حجم الملفات, أخر تسجيل للبيانات, حجم الذاكرة, حجم المساحة الخالية فى الهارد) كان يأخذ وقتا نسبيا, لذا قمت بعملها بطريقة متوازية حيث يحتوى البرنامج على خطين 2 Threads االاول لاستقبال البيانات و اجراء العمليات الحسابية, و الثانى لجمع المعلومات ( هو الوظيفة الاقل اهمية).

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

طبعا يمكن الاعتماد على البرمجة المتوازية فى حالة واحدة فقط, و هى عدم وجود تسلسل للعمليات الحسابية, أى ان حساب القيمة الثانية لا يعتمد على القيمة الاولى, و أن يكون احدى العمليات (مثلا احتساب القيمة الاولى) يعتمد على جهاز يجب انتظار انتهائه من العمل لذا لا داعى لتعطيل العملية الحسابية التى تليها.

تسريب الذاكرة مشكلة أخرى قابلتها كثيرا.

يعتقد البعض ان تسريب الذاكرة يمكن تجنبه بهذه الطريقة فقط!

char *ss;
ss=(char*)malloc(1001);

.
.
.
.
.

free(ss);

مادامت قد قمت بتحرير الذاكرة فلن يحدث تسريب.

لكن فى البرامج الكبيرة, قد لا تلاحظ أبدا من اين يأتى التسريب,

فقد تقوم بالخروج فى حالة الخطأ و تنسى تحرير الذاكرة فى شرط الخروج,

قد يحدث ظاهرة ما يعرف بmemroy fragmentatio و التى مع وقت قد تتسبب بتسرب كبير للذاكرة (و هى مشكلة واجهتها).

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

طبعا تسرب الذاكرة غير مقبول تماما و لو بقدر بسيط فى برامج الrealtime.

بوركت أخي على الاستجابة

ومسألة تعدد الثريد Multi Threads سأتحدث عنها بإذن الله وكيف يمكن توظيفها في هذا السياق.

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

ستسألني كيف اكتشف ذالك.

عادة يوجد صنف StopWatch الذي يخدم في قياس أزمنة التنفيذ بدقة وعلى مستوة التكة Tick والتي تقابل إن صح التعبير البنض التزامني الداخلي.

إلا أنها غلبتني نوعا ما

لذا قمت ببرمجة صنف ستاتيكي خاص بي يرث من الصنف StopWatch وهو ستاتيكي إلا أن ما بداخله ديناميكي وقد جعلت له منهج إعادة بدء مع تمير اسم له ومن ثم استدعي منهج الإيقاف مع تمرير نفس الاسم ليعلم أي ستوب وتش داخلي سيتم إقافه

وفي نهاية الإجراء النهائي جعلت خاصية للصنف أسميته Report يحضر تقرير بكل الأزمنة للأكواد المختلفة وأظهرها على عنصر ليبل بشكل جدول عموده الأول اسم الستوب وتش والذي يعبر عن جزء الكود كمثال حلقة أو تعليمة أو استدعاء وبجانبه الزمن المنقضي

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

ومن خلال هذه العملية اكتشفت أن هناك ثغرة تستنزف الموارد لأني اكتشفت أن الزمن الكلي لحدث المعالجة يزداد شيئا فشيئا وإن كان بمقدار ضئيل جدا إلا أنه بعد زمن سيصبح كبيرا ويؤدي إلى جمود البرنامج أو النظام

وبنفس الصنف الذي أسميته pTimeReport يمكنني أن أعرف بدقة أين الجزء المستنزف لأدخل إلى داخله للوصول لسبب ومحاولة معالجته

ولكن لان هناك ما هو أهم لم أقم بهذه الخطوة وجعلتها للآخر.

وكمثال على استخدام هذا الصنف قمت بعد ذك الأخ محمد لمعلومة Not بالتأكد بشكل عملي حيث استدعيت مناهج لكل من Xor و Not وظهر لي فرق الزمن

الأرقام على اليمين هي التردد Frequency وهي مقلوب الزمن ويعبر عن كم مرة أستطيع تنفيذ هذا الجزء في الثانية الواحدة

post-261046-013325800 1337076088_thumb.j

بارك الله فيك مرة أخرى

المرفقات
TimeReport.jpg

تم تعديل هذه المشاركة بواسطة المبرمج أبو أحمد في 15 مايو 2012 في 13:01

1 −1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#17

كما توقعت كانت هناك تعليمة هي التي تستنزف الذاكرة GetDC وعندما حاولت استعمال تعليمة ReleaseDC لتحريرها كانت تتوقف الصورة ثم جعلتها قبل تعليمة GetDC لتحرر آخر هاندل قبل الحصول على الجديد وبالفعل حلت المشكلة وبقي زمن التنفيذ ثابتا

والحمد لله

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#18
اقتباس
لهذا لا يتم حجز الذاكره بشكل يدوي داخل البرنامج و انما يتم استخدام Memory Pool بالإضافه لـ GC ليتعامل مع هذه الأمور.

بالنسبه للكود الخاص بالصوره فتوجد طريقه اسرع من المذكوره فبدلا من استخدام XOR إستخدم NOT "~".

اضافة الى ما تفضلت به,

يمكنك تجنب الfragmentation بطرق اخرى أيضا غير الmemory pool, أو طريقة الfixed allocation حيث تقوم بحجز الذاكرة كلها عند بدء البرنامج و تحريرها عند خروجه,

الحل الاول :

استخدام الstack فى المتغيرات صغيرة الحجم.

الحل الثانى :

تجميع المؤشرات صغيرة الحجم فى array واحدة.

مع العلم ان هذه المشكلة تكاد تختفى مع windows vista و windows 7 حيث يقوم بشكل افتراضى بتشغيل ميزة Low Fragmentation Heap.

فى ويندوز xp يمكن تشغيلها أيضا لكن من داخل برنامجك.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366750(v=vs.85).aspx

#19
اقتباس

الحل الاول :

استخدام الstack فى المتغيرات صغيرة الحجم.

بشكل افتراضي إذا قام المترجم بالإبقاء على المتغيرات - الموجوده بالدوال - سيتم حجزها من الـ Stack.

اقتباس

الحل الثانى :

تجميع المؤشرات صغيرة الحجم فى array واحدة.

هذه ليست بفكره جيده على الإطلاق حيث ستقلل من كفائة الكود الناتج.

ميزة الـ Memory Pool مع الـ GC هو ان عملية الـ defragment للذاكره تكون داخليه حيث انت لا تستخدم المؤشر بشكل مباشره و انما تستخدم Handle و الذى يتم تحريك الذاكره التى يشير لها عندما لا تكون قيد الإستخدام و عملية التحرير تعيد الذاكره للـ GC و ليس لنظام التشغيل و عندما تتعدى نسبة الذاكره الفارغه حد معين يتم تقلصيها و ارجاع الباقي للنظام.

فى الأغلب يتم انشاء الـ Memory Pool ألخاصه بالـ GC داخل private heap حيث يقوم هو بإدارته داخليا.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#20

بارك الله بالشباب وهذا النقاش الاكثر من رائع وتحية عطرة لكاتب الموضوع صراحة موضوع روعة وفقك الله أخي

صراحة انا الموضوع شدني واحببته وقد قمت بقراءة المضوع كاملا والردود والتمعن بها وكم أسفت لشيء مهم وهو أنني أجيد فقط لغة الجافا وهي تعتمد على الـ VM واعتقادي ان الزمن الحقيقي غير مجدي بلغة كلغة الجافا

فما هو رأي الاخوة بهذه النقطة؟؟

وشكرا

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#21
vector_ever كتب:

بارك الله بالشباب وهذا النقاش الاكثر من رائع وتحية عطرة لكاتب الموضوع صراحة موضوع روعة وفقك الله أخي

صراحة انا الموضوع شدني واحببته وقد قمت بقراءة المضوع كاملا والردود والتمعن بها وكم أسفت لشيء مهم وهو أنني أجيد فقط لغة الجافا وهي تعتمد على الـ VM واعتقادي ان الزمن الحقيقي غير مجدي بلغة كلغة الجافا

فما هو رأي الاخوة بهذه النقطة؟؟

وشكرا

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

حياك الله أخي الكريم ومرورك زاد الموضوع ثراءً

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

ولكن سأحاول الاستئناف طالما أن هناك من الإخوة مازال مهتما أمثالك

أولا أخي كلامك يكون صحيحا إذا كنا نقصد الناحية التي أشار إليها الأخ محمدفي المشاركة #11

ولكن أوضحنا الأمر أن الذي نقصده مختلف والتركيز على الناحية التقنية وألية التنفيذ بغض النظر عن الآلة أو اللغة أو المنصة حتى لو كان جهاز قديم

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

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

يبقى تركيزنا على اختيار الطرق والخوارزميات التي تقلل زمن التنفيذ لنحصل على أفضل أداء ونقترب من الزمن الحقيقي

وحتى كلمة الزمن الحقيقي هي نسبية وليست مطلقة

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

وكن المسألة تتبع الهدف

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

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#22
أبو أحمد المبرمج كتب:

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

حياك الله أخي الكريم ومرورك زاد الموضوع ثراءً

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

ولكن سأحاول الاستئناف طالما أن هناك من الإخوة مازال مهتما أمثالك

أولا أخي كلامك يكون صحيحا إذا كنا نقصد الناحية التي أشار إليها الأخ محمدفي المشاركة #11

ولكن أوضحنا الأمر أن الذي نقصده مختلف والتركيز على الناحية التقنية وألية التنفيذ بغض النظر عن الآلة أو اللغة أو المنصة حتى لو كان جهاز قديم

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

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

يبقى تركيزنا على اختيار الطرق والخوارزميات التي تقلل زمن التنفيذ لنحصل على أفضل أداء ونقترب من الزمن الحقيقي

وحتى كلمة الزمن الحقيقي هي نسبية وليست مطلقة

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

وكن المسألة تتبع الهدف

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

حياك الله أخي الكريم

وشكرا مرة اخرى على مجهودك لكن صراحة لم تصلني الاجابة التي ابحث عنها

لان سؤالي ليس عن نوع الجهاز الذي سأكتب الكود منه انما بلغة البرمجة نفسها بغض النظر عن نوع الجهاز او نوع نظام التشغيل

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

لأنه باختصار يوجد مشروع عن برمجة المعالجات متعددة النوى وهو له علاقة بالزمن الحقيقي

وشكرا

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#23

السلام عليكم

ربما لأنه ليس لدي فهم عميق للغة الجافا لم أستطع إعطاء الإجابة الكافية فيما يتعلق بها

ولكن أرى أن الطريقة المثلى لبرمجة برنامج يتم تنفيذ إجراءات منه بأسرع ما يمكن أن يتم باللغة التي تكون في المستوى الأقرب (الأدنى) للآلة التي ستعمل عليها

فمثلا لو أردنا أن نعمل على أجهزة بي سي بنظام ويندوز فيفضل أن تكون الأكواد التي ستمثل التنفيذ في الزمن الحقيقي بلغة الآلة أو لغة يمكنها التعامل مع المكونات الصلبة لتلك الآلة وفي مثالنا لغة أسمبلي أو سي بلس بلس

وليس شرطا أن يكون كل البرنامج به وإنما على الأقل الجزء المتكرر الذي يهمنا أن ينهي دورته بأسرع زمن ممكن

وأتوقع أنه في لغة الجافا لا بد من طريقة أو مكتبات بالإمكان استخدامها للتعامل مع الهارد وير بشكل فعال

فهناك بعض اللغات مع أنها عالية المستوى مثل الفيجوال بيسك تتيح لك التعامل بشكل أقرب مع الهاردوير من خلال فنكشنات API

وكذلك لغة السي بي بي تتيح لك استخدام أكواد أسمبلي

فالمسألة تحتاج إلى بحث

والأهم من كل هذا النقطة التي أثارها الأخ محمد هو أن تتمكن من الوصول إلى الخوارزمية الأسرع للتنفيذ فكود متقن بلغة عادية خير من كود سيء بلغة قوية

2

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

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

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

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

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

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