تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[سؤال] مشكله في backgroundworker
#1
السلام عليكم ورحمه الله وبركاته عندي زر وجواه اكواد كتير منها اكواد بحث وتحقق من المدخلات والخ  وعند الضغط علي هذا الزر يقوم بتهنيح أو يشل حركه البرنامج لحين الانتهاء من الأمر بداخله انا عاوز احل المشكله ده بأداه  backgroundworker لكن انا بحثت ودورت علي شروحات كتير علي يوتيوب وخلافه ولكن كلها علي الحلقات التكراريه ممكن مساعده لو سمحتم
الرد
تم الشكر بواسطة: سعود
#2
وعليك السلام ورحمة الله
اخوي عدم وضعك للكود او ارفاق مشروعك يجعل من غير  الممكن تحديد المشكلة 
لكن بشكل عام هذا يحدث لاسباب كثيرة ساذكر منها ما اعرفه وما يتبادر الي
فقد يكون السبب هو سوء تنظيم او تصميم الكود نفسه و استطيع اعطاء مثال بمشكلة حدثت معي تشابه مشكلتك
وهي اني كنت اعمل على برنامج لتلوين الكود كما يقوم فيجوال بيسك وبرامج تحرير الشفرات الاخرى به لكن كان برنامجي يستغرق وقتا 
طويلا جدا لتلوين عدد قليل من الاسطر بينما لاحظت ان البرامج الاخرى تقوم بتلوين الاف الاسطر في رمشة عين (لكن اتضح لي انها لاتقوم بذلك)
وهنا بدأت اراجع كودي واقارنه مع برامج مفتوحة الى ان عرفت ان السبب هو اني احاول تلوين كل الاسطر دفعة واحدة بينما تلك البرامج تقوم فقط  بتلوين الكود الذي يظهر للمستخدم في منطقة client rectangle اذن اتضح لي ان خطئي لم يكن برمجيا بل كان تصميميا 

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

للتاكد افتح الـTask Manager وانظر الى حالة المعالج والرامات والقراءة والكتابة على الهارددسك قبل وبعد تشغيل برنامجك

سبب اخر 
هل  تستخدم  DoEvents داخل BackgroundWorker.DoWork h او في داخل تايمر يعمل بالتزامن مع تنفيذ الكود في BackgroundWorker.DoWork
اذا كان برنامجك فيه الكثير من الاجراءات والعمليات فان DoEvents ستجعل برنامجك يقفز الى تنفيذ عمليات اخرى بينما المفروض ان يلتزم
بالعملية الحالية

ايضا هناك حالة برمجية او على الاصح خطا برمجي خفي يسمى حالة التسابق او شرط التسابق او الجمود
 Race conditions and deadlocks

وهذا مقتطف ترجمته بواسطة جوجل يشرخ ماهية الخطا حالة التسابق

"تحدث حالة السباق عندما يصل مؤشران إلى متغير مشترك في نفس الوقت. يقرأ مؤشر الترابط الأول المتغير ، ويقرأ مؤشر الترابط الثاني نفس القيمة من المتغير. ثم يقوم الخيط الأول والخيط الثاني بإجراء عملياتهما على القيمة ، ويتسابقان لمعرفة أي مؤشر ترابط يمكنه كتابة القيمة أخيرًا إلى المتغير المشترك. يتم الاحتفاظ بقيمة الخيط الذي يكتب آخر قيمته ، لأن الخيط يكتب فوق القيمة التي كتبها الخيط السابق."

وهنا شرح سبب خطا حالة الجمود 
"من الأعراض الشائعة لحالة الجمود أن البرنامج أو مجموعة مؤشرات الترابط تتوقف عن الاستجابة. يُعرف هذا أيضًا باسم تعليق. هناك ما لا يقل عن خيطين في انتظار متغير تم قفله بواسطة الخيط الآخر. لا تستمر الخيوط ، لأنه لن يقوم أي من الخيطين بتحرير المتغير الخاص به حتى يحصل على المتغير الآخر. يمكن تعليق البرنامج بأكمله إذا كان البرنامج ينتظر أحد هذين الموضوعين أو كليهما لإكمال التنفيذ."
وهنا بقية المعلومات
Race conditions and deadlocks

اخيرا هناك تقنية اسمها   Async Programming وبصراحة انا الى الان لا اعرف استخدامها لكن مما فهمت انها تقوم بمنع تهنيج البرنامج 
اثناء اجراء عمليات ضخمة 

واليك هذه المصادر عن التقنية
من موقع docs.microsoft
Async Programming
Async/Await - Best Practices in Asynchronous Programming

ولو بحثت في اليوتيوب  او جوجل عنها باستخدام كلمة البحث  vb.net Async Programming فقد تجد شرح بسيط لها وامثلة

بالتوفيق

الرد
#3
الاخ الكريم معاند الحظ كفى ووفى.
لو بالامكان  تصمم مثال جديد عشوائي اللذي يسبب التهنيق لنر كيف استخدامك للمسارات المتعددة.
لان لا توجد اي اشكال اذا عرفنا الطريقة.
مساء الخير
الرد
تم الشكر بواسطة: محمود صالح , معاند الحظ
#4
مهو المشكله البرنامج حوالي 200 ميجا والموقع مش هيرضي يحمله
الرد
تم الشكر بواسطة: معاند الحظ
#5
ضع الاداة على المشروعbackgroundworker


في حدث 
PHP كود :
Private Sub BackgroundWorker1_DoWork(sender As ObjectAs System.ComponentModel.DoWorkEventArgsHandles BackgroundWorker1.DoWork
ضع فيه الاكواد
    End Sub 


علشان تستدعي الحدث استخدم 
PHP كود :
BackgroundWorker1.RunWorkerAsync() 
صلى الله على نبينا محمد
اخيكم / محمود صالح
  قال الزهري رحمه الله  
 مــا عُـــبـِد الله بشئ أفضل من العلم 
الرد
تم الشكر بواسطة: سعود , معاند الحظ , حسن الجلب
#6
(15-01-22, 08:06 PM)حسن الجلب كتب : مهو المشكله البرنامج حوالي 200 ميجا والموقع مش هيرضي يحمله

يارب تكون حصلت الحل
لكني قصدت تعمل مثال جديد فيه اجراءات انت تريدها تعمل بكل سلاسة و بدون تهنيق واحنا باذن الله نعمل التعديل المناسب وانت بدورك تاخذ الفكرة لمشروعك الاساسي.
الرد
تم الشكر بواسطة: معاند الحظ , حسن الجلب
#7
با اخي ارفق المشروع ولو على موقع رفع خارجي مثل ميديا فاير او ارفق الكود فقط 
وملف قاعدة البيانات المستخدمه وان شاء الله تلقى الحل وتعرف سبب المشكلة ايش بالضبط

الرد
تم الشكر بواسطة: حسن الجلب , حسن الجلب
#8
 تابع هذا وستجد الحل بأمر الله ، حل نهائي لمشكلة تهنيج البرنامج



الرد
تم الشكر بواسطة: سعود , حسن الجلب



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم