12-10-22, 02:28 PM
(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 تقريبا لكل اداة وبصراحة الامر رخم اكيد في طريقة افضل

