![]() |
|
[VB.NET] بطئ تحديث كونترول اثناء استخدام linq - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183) +--- الموضوع : [VB.NET] بطئ تحديث كونترول اثناء استخدام linq (/showthread.php?tid=42793) |
بطئ تحديث كونترول اثناء استخدام linq - الماجيك مسعد - 10-10-22 السلام عليكم ورحمة الله وبركاته عند استخدام اداة progressbar تصبح العملية بطيئة جداااااا مثال كود : ListIDS = System.IO.File.ReadLines(openfile.FileName, Encoding.UTF8).Where(Function(x) Not String.IsNullOrEmpty(x)).Select(Function(n)وبدون استخدام اداة progressbar تصبح العملية سريعة جداااااا مثال كود : ListIDS = System.IO.File.ReadLines(openfile.FileName, Encoding.UTF8).Where(Function(x) Not String.IsNullOrEmpty(x)).Select(Function(n)في هذا المثال بعد مرور 39 ثانية فقط تقريبا كانت النسبة 100% ممكن تفسير عن السبب وايه الطريقة الانسب لاستخدام اداة progressbar مع العملية ولكن من غير ما تأثر علي السرعة او علي الاقل متبقاش بطيئة بالشكل ده اشكركم جميعا واتمني اكون قدرت اوضح سؤالي لكم RE: بطئ تحديث كونترول اثناء استخدام linq - عبدالله الدوسري - 11-10-22 وعليكم السلام ورحمة الله وبركاته للتجربة فقط : [attachment=28298] Total Elapsed Milliseconds : 00:00:03:1147093 3 ثواني و 1,147,093 جزئ من الثانية لعدد 10,000 سطر نصي موجود في الملف [attachment=28299] Total Elapsed Milliseconds : 00:00:30:4784998 30 ثانية و 4,784,998 جزئ من الثانية لعدد 100,000 سطر نصي موجود في الملف [attachment=28302] [attachment=28301] RE: بطئ تحديث كونترول اثناء استخدام linq - الماجيك مسعد - 11-10-22 (11-10-22, 05:23 PM)عبدالله الدوسري كتب : وعليكم السلام ورحمة الله وبركاته ما شاء الله علي شرحك العظيم والتوضيح لكل شئ ولكن اسف نسيت انوه ان تجربتي كانت علي 11 مليون سطر حجم الملف 2 giga تقريبا وبه 11 مليون سطر اتمني توليد ملف به 11 مليون سطر والتجربة عليه هتلاقي الوضع مختلف واكيد في حاجة سهينا عنها لان الفرق كبير وملحوظ جدااااااااا بدون شريط تمرير حوالي دقيقة وبشريط تمرير علي التجربة هيوصل ل ساعة او اكثر تقريبا RE: بطئ تحديث كونترول اثناء استخدام linq - عبدالله الدوسري - 11-10-22 اكيد 11,000,000 مليون مرة أنت تحدّث بيانات في الشاشة وهذة البيانات الفورم يحتاج يعيد رسمها للمستخدم, أنت مجبر تظحي بشيء من الاثنين : أما تختار السرعة وتضحي بعملية تحديث البيانات على الشاشة للمستخدم إما تختار تحديث البيانات على الشاشة وتضحي بالسرعة أولاً أنت اسأل نفسك سؤال , هل أنا فعلاً محتاج أحدث البيانات على الشاشة ( على سبيل المثال : جلب البيانات من قواعد البيانات , هل رأيت أحد يقوم بعمل ProgressBar لعملية جلب البيانات ) أم أكتفي بمؤشر يدل على جريان العملية فقط. الأغلب إن لم يكن الكل يستخدم مؤشر متحرك لا يدل على حجم العملية ولا يدل على كمية البيانات , وإنما فقط يدل على أن العملية جارية فقط , وتحت الإجراء ) مثال : جار العمل على تحليل البيانات [attachment=28303] وعند إنتهاء العملية ييختفي المؤشر مثلاً. إذا أردت تحديث الشاشة في نفس الوقت الذي تتم فيه العملية وبشكل سلس, أنت مجبر على تطبيق مبادء الــ Multithreading أو الــ Multitasking ( المهام المتعددة ) وهذا الموضوع للأمانة ليس بالسهل ومعقد وغير آمن إلا للمحترفين جداً ( وأنا أقصد الــ Multitasking التي تستهدف النافذة وجميع الكنترولات ) المبداء واضح لكن تطبيقة صعب جداً , حتى حل المشاكل في هذا النوع يعتبر كابوس حتى أنا ضعيف في الــ Multitasking جرب هذا الكود : ( قمت بتجربة وإستطاع قراءة عدد 22,000,000 مليون سطر في أقل من 10 ثواني ) فكرة هذا الكود يقوم بتوجيه جميع الأنوية في وحدة المعالجة المركزية الـ CPU لتنفيذ الكود ( حسب المعالج في جهازك - إذا كان يمتلك الكثير من الأنوية سيتم الأمر بأسرع مما تتخيل ) هذا الكود يعتمد على الــ Multitasking إذا اردت السرعة القصوى لا تستدعي الأمر Invoke لأي كنترول موجدود على الشاشة لأن Invoke في النهاية يقوم بأمر الــ Thread الوحيد والمسؤول عن رسم جميع الكنترولات على الشاشة كود : Sub Multitasking()RE: بطئ تحديث كونترول اثناء استخدام linq - الماجيك مسعد - 12-10-22 (11-10-22, 11:01 PM)عبدالله الدوسري كتب : اكيد 11,000,000 مليون مرة أنت تحدّث بيانات في الشاشة وهذة البيانات الفورم يحتاج يعيد رسمها للمستخدم, ما شاء الله عليك وعلي شرحك الاكثر من رائع كان شرحك وافي جدا للتوضيح بالفعل اعمل علي ذلك ولكن احببت ان اجعل الامر اكثر احترافية لتحديد الوقت الحالي والمتبقي علي العمليات خصوصا علي الملفات او العمليات الكبيرة ولكن ربما لما يأتي وقتها بعد ساحاول مرة اخري بعد فترة من الزمن لانى لم اتعمق ايضا في العمليات المتعددة عندي فضول اعرف لو مش هستخدم invoke اثناء الاستخدام طيب هستخدم ايه عشان الادوات متقفش في وضع التجميد لحد انهاء العملية الاول كنت بستخدم Control.CheckForIllegalCrossThreadCalls = False ولكن بدأت مؤخرا عمل invoke تقريبا لكل اداة وبصراحة الامر رخم اكيد في طريقة افضل RE: بطئ تحديث كونترول اثناء استخدام linq - عبدالله الدوسري - 12-10-22 الــ Multithreading أو الــ Multitasking ( المهام المتعددة ) تعمل بشكل مستقل thread مختلف عن الــ thread المسؤول على رسم واجهة المستخدم أي أنا لن تؤثر على واجهة المستخدم لكن إذا إستدعيت الأمر Invoke ما الذي يحدث يقوم الــ thread الذي يعمل بشكل مستقل أو الـ Task الذي يعمل بشكل مستقل بإرسال رسالة إلى الــ thread المسؤول على رسم واجهة المستخدم بتنفيذ أمر معين بالنيابة عنه , لماذا لأنه غير مسموح له بالتواصل مع الكنترولات الموجودة في واجهة المستخدم. هذة الرسالة يتم تمريرها بواسة الأمر Invoke. هذا يعني أن الــ thread المسؤول على رسم واجهة المستخدم تم إقحامة بأعمال تأتي من الــ thread الآخر . العملية تكون غير ملحوظة إذا كان العمل بسيط وفي فترات متباعة مثل 500 ملي ثانية أو أقل بقليل. لكن إذا تم إقحام الــ thread المسؤول على رسم واجهة المستخدم بأعمال كثير وبسرعة ( مثل عمليات الــLoop ) والسرعة تكون بملايين الأجزاء من الثانية , هنا أكيد سيتجمد الــ thread المسؤول على رسم واجهة المستخدم, لأنه مشغول جداً بعمليات رسم الكنترولات على الشاشة, ناهيك عنه أنه لم يكمل عمل رسم كنترول واحد يأتي الأمر Invoke مرة أخرى رسالة تطلب إعادة رسم نفس الكنترول وهو في الأساس لم ينتهي من عملية الرسم. لا يجب إستخدام الأمر Invoke في مثل هذة العمليات الثقيلة. يتم إستخدامة فقط لأمور بسيطة يستطيع الــ thread المسؤول على رسم واجهة المستخدم التعامل معها . RE: بطئ تحديث كونترول اثناء استخدام linq - عبدالله الدوسري - 19-10-22 أخي الماجيك مسعد أرسلت لك رسالة خاصة RE: بطئ تحديث كونترول اثناء استخدام linq - معاند الحظ - 20-10-22 يا اخي قم بتحديث التقدم في البر وجرس بار في فواصل زمنية مدتها اطول من مدة الـInterval الذي تستخدمه للبروجر س بار في كودك يعني اذ1ا كنت ضبطت خاصية الـInterval على القيمة الافتراضية وهي 100 ملي ثانية قم بتغييرها الى 1 ثانية وانظر اذا كان الفرق في سرعة ومدة التنفيذ يرضيك RE: بطئ تحديث كونترول اثناء استخدام linq - Taha Okla - 20-10-22 (20-10-22, 08:20 PM)معاند الحظ كتب : يا اخي قم بتحديث التقدم في البر وجرس بار في فواصل زمنية مدتها اطول من مدة الـInterval الذي تستخدمه للبروجر س بار في كودك مشكلته ليس بمدة تحديث البروجرس بار - بل هي استخدام أدوات مرئية مع كود يستلزم السرعة بالتالي سيكون مهما فعل نتيجة عمله هي البطئ -كما أوضح الأخ الدوسري- أفضل طريقة أن يعتمد على أداة (صورة متحركة توحي بتنفيذ العمل في نفس وقت تنفيذ الكود). فأي إدخال لتكست بوكس أو بورجرس بار ضمن حلقة دورانية تجعل الحلقة بسرعة الحلزونة مقارنة بسرعتها الطبيعة ولن يختلف الأمر مهما كانت سرعة كمبيوتره أو السيرفر الذي يعمل عليه .. إن كان ولا بد يجعل قراءة وتنفيذ الداتا من خلال تايمر من خارج الحلقة وكما قلت كل مدة معين (ثانية مثلاً) يقوم بقراءة البيانات ويضع نتيجتها في التكست بوكس أو البروجرس بار. ولا يدخل ضمن الحلقة أي عنصر مرئي .. -- الفرق بالسرعة بين تنفيذ حلقة على متغير افتراضي مقارنة بأداة مرأية يتجاوز 100 ألف مرة يعني يستطيع تنفيذ ع الاقل 100 الف عملية افتراضية مقابل كل عملية مرئية. RE: بطئ تحديث كونترول اثناء استخدام linq - الماجيك مسعد - 23-10-22 (20-10-22, 08:20 PM)معاند الحظ كتب : يا اخي قم بتحديث التقدم في البر وجرس بار في فواصل زمنية مدتها اطول من مدة الـInterval الذي تستخدمه للبروجر س بار في كودك لا يوجد انترفال فقط مزامنة مع عملية قراءة الملف وكنت عايز احسب النسبة الفعلية الحقيقية للملف عشان اقدر احسب الوقت المتبقي والمنقضي وحتي يعرف المستخدم اين هو الان لان التعامل كان مع ملفات كبيرة تصل ل 5 جيجا تقريبا وملايين من الاسطر داخل كل ملف |