تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] بطئ تحديث كونترول اثناء استخدام linq
#1
السلام عليكم ورحمة الله وبركاته

عند استخدام اداة progressbar تصبح العملية بطيئة جداااااا
مثال
كود :
ListIDS = System.IO.File.ReadLines(openfile.FileName, Encoding.UTF8).Where(Function(x) Not String.IsNullOrEmpty(x)).Select(Function(n)
                                                                                                                                                                       ProgressBar2.Invoke(New Action(Sub() ProgressBar2.Increment(1)))
                                                                                                                                                                       Invoke(New Action(Sub() Label2.Text = (ProgressBar2.Value * 100 / ProgressBar2.Maximum).ToString("00.0000") & "%"))
                                                                                                                                                                       Return If(n.Contains(","), n.Split(",")(0), n)
                                                                                                                                                                   End Function)
في هذا المثال بعد مرور دقيقة كانت النسبة 3% تقريبا

وبدون استخدام اداة progressbar تصبح العملية سريعة جداااااا
مثال
كود :
ListIDS = System.IO.File.ReadLines(openfile.FileName, Encoding.UTF8).Where(Function(x) Not String.IsNullOrEmpty(x)).Select(Function(n)
                                                                                                                                                                       Return If(n.Contains(","), n.Split(",")(0), n)
                                                                                                                                                                   End Function)

في هذا المثال بعد مرور 39 ثانية فقط تقريبا كانت النسبة 100%

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

اشكركم جميعا واتمني اكون قدرت اوضح سؤالي لكم
الرد }}}
تم الشكر بواسطة:
#2
وعليكم السلام ورحمة الله وبركاته

للتجربة فقط : 



   

Total Elapsed Milliseconds : 00:00:03:1147093
3 ثواني و 1,147,093 جزئ من الثانية
لعدد 10,000 سطر نصي موجود في الملف



   

Total Elapsed Milliseconds : 00:00:30:4784998
30 ثانية و 4,784,998 جزئ من الثانية
لعدد 100,000 سطر نصي موجود في الملف



   





.zip   VB4ARAB Test.zip (الحجم : 763.41 ك ب / التحميلات : 19)
الرد }}}
تم الشكر بواسطة: الماجيك مسعد
#3
(11-10-22, 05:23 PM)عبدالله الدوسري كتب : وعليكم السلام ورحمة الله وبركاته

للتجربة فقط : 





Total Elapsed Milliseconds : 00:00:03:1147093
3 ثواني و 1,147,093 جزئ من الثانية
لعدد 10,000 سطر نصي موجود في الملف





Total Elapsed Milliseconds : 00:00:30:4784998
30 ثانية و 4,784,998 جزئ من الثانية
لعدد 100,000 سطر نصي موجود في الملف

ما شاء الله علي شرحك العظيم والتوضيح لكل شئ
ولكن اسف نسيت انوه ان تجربتي كانت علي 11 مليون سطر
حجم الملف 2 giga تقريبا وبه 11 مليون سطر اتمني توليد ملف به 11 مليون سطر والتجربة عليه هتلاقي الوضع مختلف
واكيد في حاجة سهينا عنها لان الفرق كبير وملحوظ جدااااااااا بدون شريط تمرير حوالي دقيقة وبشريط تمرير علي التجربة هيوصل ل ساعة او اكثر تقريبا
الرد }}}
تم الشكر بواسطة:
#4
اكيد 11,000,000 مليون مرة أنت تحدّث بيانات في الشاشة وهذة البيانات الفورم يحتاج يعيد رسمها للمستخدم,

أنت مجبر تظحي بشيء من الاثنين :
أما تختار السرعة وتضحي بعملية تحديث البيانات على الشاشة للمستخدم
إما تختار تحديث البيانات على الشاشة وتضحي بالسرعة

أولاً أنت اسأل نفسك سؤال ,
هل أنا فعلاً محتاج أحدث البيانات على الشاشة ( على سبيل المثال : جلب البيانات من قواعد البيانات , هل رأيت أحد يقوم بعمل ProgressBar لعملية جلب البيانات )
أم أكتفي بمؤشر يدل على جريان العملية فقط.
الأغلب إن لم يكن الكل يستخدم مؤشر متحرك لا يدل على حجم العملية ولا يدل على كمية البيانات , وإنما فقط يدل على أن العملية جارية فقط , وتحت الإجراء )
مثال :


جار العمل على تحليل البيانات
   


وعند إنتهاء العملية ييختفي المؤشر مثلاً.





إذا أردت تحديث الشاشة في نفس الوقت الذي تتم فيه العملية وبشكل سلس, أنت مجبر على تطبيق مبادء الــ Multithreading أو الــ Multitasking ( المهام المتعددة )
وهذا الموضوع للأمانة ليس بالسهل ومعقد وغير آمن إلا للمحترفين جداً ( وأنا أقصد الــ Multitasking التي تستهدف النافذة وجميع الكنترولات ) 
المبداء واضح لكن تطبيقة صعب جداً , حتى حل المشاكل في هذا النوع يعتبر كابوس
حتى أنا ضعيف في الــ Multitasking 


جرب هذا الكود : ( قمت بتجربة وإستطاع قراءة عدد 22,000,000 مليون سطر في أقل من 10 ثواني )
فكرة هذا الكود يقوم بتوجيه جميع الأنوية في وحدة المعالجة المركزية الـ CPU لتنفيذ الكود ( حسب المعالج في جهازك - إذا كان يمتلك الكثير من الأنوية سيتم الأمر بأسرع مما تتخيل )
هذا الكود يعتمد على الــ Multitasking 
إذا اردت السرعة القصوى لا تستدعي الأمر Invoke لأي كنترول موجدود على الشاشة لأن Invoke في النهاية يقوم بأمر الــ Thread الوحيد والمسؤول عن رسم جميع الكنترولات على الشاشة
كود :
   Sub Multitasking()
       Dim CancelToken As System.Threading.CancellationTokenSource = New System.Threading.CancellationTokenSource() 'The Token For Cancelling Task if needed

       Dim POptions As New System.Threading.Tasks.ParallelOptions  'Option Argument For Parallel.ForEach
       POptions.MaxDegreeOfParallelism = Environment.ProcessorCount 'max threads
       POptions.CancellationToken = CancelToken.Token 'Setting The Cancellation Token

       Parallel.ForEach(File.ReadAllLines("Filepath"), POptions, Sub(ReadedLine)

                                                                     'YOUR CODE,
                                                                     'FOR EXAMPLE:
                                                                     'Richtextbox1.Invoke(Sub()
                                                                     'Richtextbox1.Text &= ReadedLine
                                                                     'End Sub)

                                                                 End Sub)
   End Sub
الرد }}}
تم الشكر بواسطة: Taha Okla , Taha Okla , الماجيك مسعد
#5
(11-10-22, 11:01 PM)عبدالله الدوسري كتب : اكيد 11,000,000 مليون مرة أنت تحدّث بيانات في الشاشة وهذة البيانات الفورم يحتاج يعيد رسمها للمستخدم,

أنت مجبر تظحي بشيء من الاثنين :
أما تختار السرعة وتضحي بعملية تحديث البيانات على الشاشة للمستخدم
إما تختار تحديث البيانات على الشاشة وتضحي بالسرعة

أولاً أنت اسأل نفسك سؤال ,
هل أنا فعلاً محتاج أحدث البيانات على الشاشة ( على سبيل المثال : جلب البيانات من قواعد البيانات , هل رأيت أحد يقوم بعمل ProgressBar لعملية جلب البيانات )
أم أكتفي بمؤشر يدل على جريان العملية فقط.
الأغلب إن لم يكن الكل يستخدم مؤشر متحرك لا يدل على حجم العملية ولا يدل على كمية البيانات , وإنما فقط يدل على أن العملية جارية فقط , وتحت الإجراء )
مثال :


جار العمل على تحليل البيانات



وعند إنتهاء العملية ييختفي المؤشر مثلاً.





إذا أردت تحديث الشاشة في نفس الوقت الذي تتم فيه العملية وبشكل سلس, أنت مجبر على تطبيق مبادء الــ Multithreading أو الــ Multitasking ( المهام المتعددة )
وهذا الموضوع للأمانة ليس بالسهل ومعقد وغير آمن إلا للمحترفين جداً ( وأنا أقصد الــ Multitasking التي تستهدف النافذة وجميع الكنترولات ) 
المبداء واضح لكن تطبيقة صعب جداً , حتى حل المشاكل في هذا النوع يعتبر كابوس
حتى أنا ضعيف في الــ Multitasking 


جرب هذا الكود : ( قمت بتجربة وإستطاع قراءة عدد 22,000,000 مليون سطر في أقل من 10 ثواني )
فكرة هذا الكود يقوم بتوجيه جميع الأنوية في وحدة المعالجة المركزية الـ CPU لتنفيذ الكود ( حسب المعالج في جهازك - إذا كان يمتلك الكثير من الأنوية سيتم الأمر بأسرع مما تتخيل )
هذا الكود يعتمد على الــ Multitasking 
إذا اردت السرعة القصوى لا تستدعي الأمر Invoke لأي كنترول موجدود على الشاشة لأن Invoke في النهاية يقوم بأمر الــ Thread الوحيد والمسؤول عن رسم جميع الكنترولات على الشاشة
كود :
   Sub Multitasking()
       Dim CancelToken As System.Threading.CancellationTokenSource = New System.Threading.CancellationTokenSource() 'The Token For Cancelling Task if needed

       Dim POptions As New System.Threading.Tasks.ParallelOptions  'Option Argument For Parallel.ForEach
       POptions.MaxDegreeOfParallelism = Environment.ProcessorCount 'max threads
       POptions.CancellationToken = CancelToken.Token 'Setting The Cancellation Token

       Parallel.ForEach(File.ReadAllLines("Filepath"), POptions, Sub(ReadedLine)

                                                                     'YOUR CODE,
                                                                     'FOR EXAMPLE:
                                                                     'Richtextbox1.Invoke(Sub()
                                                                     'Richtextbox1.Text &= ReadedLine
                                                                     'End Sub)

                                                                 End Sub)
   End Sub

ما شاء الله عليك وعلي شرحك الاكثر من رائع كان شرحك وافي جدا للتوضيح
بالفعل اعمل علي ذلك ولكن احببت ان اجعل الامر اكثر احترافية لتحديد الوقت الحالي والمتبقي علي العمليات خصوصا علي الملفات او العمليات الكبيرة ولكن ربما لما يأتي وقتها بعد ساحاول مرة اخري بعد فترة من الزمن لانى لم اتعمق ايضا في العمليات المتعددة
عندي فضول اعرف لو مش هستخدم invoke اثناء الاستخدام طيب هستخدم ايه عشان الادوات متقفش في وضع التجميد لحد انهاء العملية
الاول كنت بستخدم Control.CheckForIllegalCrossThreadCalls = False ولكن بدأت مؤخرا عمل invoke تقريبا لكل اداة وبصراحة الامر رخم اكيد في طريقة افضل
الرد }}}
تم الشكر بواسطة:
#6
الــ Multithreading أو الــ Multitasking ( المهام المتعددة ) تعمل بشكل مستقل
thread مختلف عن الــ thread المسؤول على رسم واجهة المستخدم
أي أنا لن تؤثر على واجهة المستخدم
لكن إذا إستدعيت الأمر Invoke ما الذي يحدث
يقوم  الــ thread الذي يعمل بشكل مستقل أو الـ Task الذي يعمل بشكل مستقل
بإرسال رسالة إلى الــ thread المسؤول على رسم واجهة المستخدم بتنفيذ أمر معين بالنيابة عنه , لماذا لأنه غير مسموح له بالتواصل مع الكنترولات الموجودة في واجهة المستخدم.
هذة الرسالة يتم تمريرها بواسة الأمر Invoke.
هذا يعني أن الــ thread المسؤول على رسم واجهة المستخدم تم إقحامة بأعمال تأتي من الــ thread الآخر .
العملية تكون غير ملحوظة إذا كان العمل بسيط وفي فترات متباعة مثل 500 ملي ثانية أو أقل بقليل.
لكن إذا تم إقحام الــ thread المسؤول على رسم واجهة المستخدم بأعمال كثير وبسرعة ( مثل عمليات الــLoop ) والسرعة تكون بملايين الأجزاء من الثانية , هنا أكيد سيتجمد الــ thread المسؤول على رسم واجهة المستخدم, لأنه مشغول جداً بعمليات رسم الكنترولات على الشاشة, ناهيك عنه أنه لم يكمل عمل رسم كنترول واحد يأتي الأمر Invoke مرة أخرى رسالة تطلب إعادة رسم نفس الكنترول وهو في الأساس لم ينتهي من عملية الرسم.

لا يجب إستخدام الأمر Invoke في مثل هذة العمليات الثقيلة.
يتم إستخدامة فقط لأمور بسيطة يستطيع الــ thread المسؤول على رسم واجهة المستخدم التعامل معها .
الرد }}}
تم الشكر بواسطة: الماجيك مسعد , معاند الحظ
#7
أخي الماجيك مسعد أرسلت لك رسالة خاصة
الرد }}}
تم الشكر بواسطة:
#8
يا اخي قم بتحديث التقدم في البر وجرس بار في فواصل زمنية مدتها اطول من مدة الـInterval الذي تستخدمه للبروجر س بار في كودك
يعني اذ1ا كنت ضبطت خاصية الـInterval على القيمة الافتراضية وهي 100 ملي ثانية قم بتغييرها الى 1 ثانية وانظر اذا كان الفرق  في سرعة ومدة التنفيذ يرضيك

الرد }}}
تم الشكر بواسطة: الماجيك مسعد
#9
(20-10-22, 08:20 PM)معاند الحظ كتب : يا اخي قم بتحديث التقدم في البر وجرس بار في فواصل زمنية مدتها اطول من مدة الـInterval الذي تستخدمه للبروجر س بار في كودك
يعني اذ1ا كنت ضبطت خاصية الـInterval على القيمة الافتراضية وهي 100 ملي ثانية قم بتغييرها الى 1 ثانية وانظر اذا كان الفرق  في سرعة ومدة التنفيذ يرضيك

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

إن كان ولا بد يجعل قراءة وتنفيذ الداتا من خلال تايمر من خارج الحلقة 
وكما قلت كل مدة معين (ثانية مثلاً)  يقوم بقراءة البيانات ويضع نتيجتها في التكست بوكس أو البروجرس بار.
ولا يدخل ضمن الحلقة أي عنصر مرئي .. 
--
الفرق بالسرعة بين تنفيذ حلقة على متغير افتراضي مقارنة بأداة مرأية يتجاوز 100 ألف مرة
يعني يستطيع تنفيذ ع الاقل 100 الف عملية افتراضية مقابل كل عملية مرئية.
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}}
#10
(20-10-22, 08:20 PM)معاند الحظ كتب : يا اخي قم بتحديث التقدم في البر وجرس بار في فواصل زمنية مدتها اطول من مدة الـInterval الذي تستخدمه للبروجر س بار في كودك
يعني اذ1ا كنت ضبطت خاصية الـInterval على القيمة الافتراضية وهي 100 ملي ثانية قم بتغييرها الى 1 ثانية وانظر اذا كان الفرق  في سرعة ومدة التنفيذ يرضيك

لا يوجد انترفال فقط مزامنة مع عملية قراءة الملف وكنت عايز احسب النسبة الفعلية الحقيقية للملف عشان اقدر احسب الوقت المتبقي والمنقضي وحتي يعرف المستخدم اين هو الان لان التعامل كان مع ملفات كبيرة تصل ل 5 جيجا تقريبا وملايين من الاسطر داخل كل ملف
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  استخدام فونت جديد في البرنامج Emam emam 5 140 14-04-24, 01:29 PM
آخر رد: عبد العزيز البسكري
  ال linq سلام و محبه 0 88 24-03-24, 04:43 AM
آخر رد: سلام و محبه
  [VB.NET] تحديث بيانات فى كلاس من جدول سيكوال asdfar1977 6 253 26-02-24, 01:07 AM
آخر رد: asdfar1977
  مشكلة عدم اكتمال تنفيذ بسبب فصل الشبكة او التيار الكهربائي اثناء النتفيذ تناسيم 3 1,887 05-02-24, 10:04 PM
آخر رد: 01AHMED
  [VB.NET] أرغب فى استخدام هذا الكود بالتحديد على الإصدار 10 AmeenRashed 3 233 19-01-24, 12:42 PM
آخر رد: Taha Okla
Smile تطبيقي يعمل تمام على ويندوز 10 قبل تحديث الوندوز وبعد التحديث لا يعمل رمضان محمد 2 401 31-10-23, 01:50 PM
آخر رد: رمضان محمد
  [VB.NET] كيف اقوم بمنع المستخدم من استخدام الكيبورد وخصوصا مفتاح Print screen Ameenh 0 274 07-10-23, 10:45 PM
آخر رد: Ameenh
  [VB.NET] كود تحديث عدة أعمدة AboAlaa 2 337 21-08-23, 09:06 PM
آخر رد: AboAlaa
  [VB.NET] مشكلة في تحديث البيانات Necro 11 1,095 28-05-23, 02:06 AM
آخر رد: Jounior_P
  عندي مشكلة اثناء عرض البيانات الضخمة في قريد يسبب بطى اثناء عرضها RADOS 5 722 07-05-23, 12:29 AM
آخر رد: new_programer

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


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