المقدمة

المرة اللي فاتت اتكلمنا عن Platform Channels وليه هي مهمة، لكن في سؤال مهم لازم نسأله:

هل ممكن Platform Channels تبوّظ الأداء أو تخلي التطبيق يهنّج؟

الإجابة: آه، لكن مش لأنها فيها مشكلة في حد ذاتها… السبب دايمًا بيكون في طريقة استخدامها.

في الجزء ده هنعرف يعني إيه Threads وIsolates في Flutter

و يا تري إيه علاقة Dart Event Loop بالموضوع خلونا نشوف✨

📌هنتكلم النهاردة عن : 

  • يعني إيه Threads
  • أنواع ال Threads
  • ال Isolates
  • ال Life Cycle isolate
  • أهمية ال Isolate
  • متى نستخدم ال Isolates
  • ال Dart Event Loop
  • أنواع ال Queues
  • الخاتمة

Threads In Flutter

يعني إيه Thread أصلاً ؟

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

طب ما هي أنواع الـ Threads ؟

عندنا نوعين:

  • Main Thread
  • Background Thread 

عندنا في Flutter:

💡
Main Thread = UI Thread

وده المسؤول عن:

  • رسم الواجهة 
  • التعامل مع ضغطات المستخدم 
  • تشغيل lifecycle methods

و دا عامل زي جزء الوعي في مخ الانسان اللي هو انت مركز ف ايه ؟ شايف ايه ؟ بتتفاعل مع ايه ؟

ف كدا أما دماغك بتنضغط تركيزك بيقل ف برضو أي شغل تقيل علي ال Main Thread  بيخلي التطبيق يهنّج و الـ UI يحصله Freeze 

Dart Single Thread 🤔

عندنا دارت شغالة single thread 

 طب ازاي هقدر اعمل كذا حاجة ابعت ريكويست HTTP و اضغط علي زرار من غير ما التطبيق يقف ؟ 

هنستخدم: 

  • Future
  • Stream
  • async / await

طب برضو كدا بستخدم thread واحد ازاي هقدر اعمل اكتر من thread علشان اعمل عليه العمليات التقيلة ؟


Isolates In Flutter

هنا بقي عندنا ال Isolates الـ Isolate هو نسخة مستقلة من التنفيذ داخل Dart.

زي مخك ما بيعوز يركز في حاجة بيدخل في حالة Deep Work يبعد عن اي مشتتات و يركز في حاجة واحدة يخلصها .

هنا ال Isolate بياخد كوبي من الداتا اللي ف Main Isolate و بيكون ليه :

  • Memory خاص بيه
  • Event Loop خاص بيه
  • Stack و Heap خاصين بيه
💡
ملحوظة : هنا ال Thread مش هو ال Isolate لإنهم مش بيشتركوا ف نفس الذاكرة لكن في لغات تانية ال Threads بتشارك نفس الذاكرة

ف كدا نقدر نشغل اكتر من Isolate ف نفس الوقت و ميحصلش freeze ف ال UI و دا بنعمله ف العمليات التقيله عندنا 


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

📬 Message Passing

مفيش مشاركة Memory

ال isolates بتبعت و تستقبل رسايل من غير ما تحتاج تشير الميموري بتاعتها 


عندنا برضو نوعين من ال Isolate : 

Main Isolate → مسؤول عن UI

Work Isolate → بيشيل الشغل التقيل

ال Main Isolate ممكن يبعت شغل تقيل لـ Isolate تاني (Work Isolate) ويرجع يستقبل النتيجة بعد ما تخلص


طرق تشغيل Isolate في Flutter

1️⃣ الطريقة السهلة: compute()

Flutter موفر helper جاهز:

  • بيشغل Isolate في الخلفية
  • بيرجع النتيجة مباشرة

دا مناسب للعمليات البسيطة و  أسهل استخدام


2️⃣ Isolate.run 

دي طريقة أحدث من Dart 

  • بتشغل function في isolate
  • بترجع النتيجة مباشرة (زي Future)

 سهلة جدًا و مفيهاش تعقيد messaging

متى استخدمها؟

  • لما يكون عندك function واحدة تقيلة
  • وعايز نتيجة وخلاص هي مناسبة لعملية واحدة بس

3️⃣ Isolate.spawn 

دي الطريقة الـ low-level 

  • بتنشئ Isolate جديد
  • لازم تتعامل مع:
    • SendPort
    • ReceivePort 

دي methods علشان الisolates تتكلم بينها و بين بعضها 

فيها تحكم كامل و تقدر تعمل تواصل مستمر بين isolates

بس معقدة و محتاجة إدارة manual

متى تستخدمها؟

  • tasks طويلة أو مستمرة و عايزة isolate يفضل شغال 
  • اقدر اعمل كذا isolate في نفس المجموعة
  • streaming data
  • background processing complex 

ودا ملخص بسيط ليهم

Isolate Lifecycle

  1. اما بعمل رن لل Main Isolate بيعمل Listen لل events   يشتغل على UI بيستني ضغطة علي الشاشة او ريكويست راجع 
  2. يبعت مهمة تقيلة لـ Work Isolate
  3. الـ Work Isolate ينفذ المهمة
  4. يرجع النتيجة 
  5. UI يتحدث
  6. بعدها ال Isolate بيشوف فيه مهام تانية و لا لا لو مفيش بيعمل exit لازم يقفل بعد ما كل الاحداث تخلص 

كمان ممكن نشغل كذا isolate في نفس الوقت بس له ليميت برضو علي حسب مساحة الميموري heap 

لاني اما بعمل isolate جديد dart بتعمل stack , heap , eventloop جديد لل isolate دا بس

 ليه الـ Isolates مهمة؟

لأنها بتحسن ال Performance و بتمنع:

  • UI Freeze 
  • Lag 
  • App Crash 

متى نستخدم Isolates؟

نستخدمها في:

  • Parsing JSON كبير جدًا
  • ضغط الصور / الصوت / الفيديو
  • تحويل ملفات media
  • عمليات بحث أو فلترة ضخمة
  • عمليات I/O مع قواعد البيانات
  • عدد كبير من network requests

عندنا هنا مثال Work Isolate – لما انقل المهمة الثقيلة للخلفية

هنا المهمة الثقيلة شغالة على Main Isolate نفسه، واللي مسؤول عن الـ UI.

لو كان عندنا واجهة مستخدم شغالة، ممكن التطبيق يهنج أو يحس المستخدم بتأخير (Freeze).

دلوقتي المهمة الثقيلة شغالة على Work Isolate مستقل عن Main Isolate.

ده بيخلي الـ UI سلس وما يهنجش، وبيوفر تجربة مستخدم أفضل.

Event Loop Model

كنا بنقول علشان منوقفش الـ UI، بنستخدم حاجات زي Future / async / await…والحاجات دي مبنية على فكرة مهمة اسمها:

Event Loop Model

طيب يعني إيه Event Loop؟ 🤔

ببساطة، هو النظام اللي بينظّم تنفيذ كل المهام جوه Dart.

عندنا في مخنا نفس النظام : المخ بيستقبل الحركة ، اللمس و غيره و يقرر هيعمل ايه و يبعت الرد ننفذه.

دا نفسه في loop هنا ، هنشوف بيشتغل إزاي، أي كود بنكتبه بيتحوّل لـ Event (حدث)،سواء كان:

  • tap
  • scroll
  • network
  • UI update

كل الـ Events دي بتتحط في Queues (قوائم انتظار)والـ Event Loop هو اللي يمسكها وينفذها واحدة واحدة.

  عندنا نوعين من الـ Queues:

  • Microtask Queueدي اللي فيها المهام السريعة واللي ليها أولوية أعلىزي: بعض عمليات الـ Future then ,Catch , future microtask , scheduler microtask 
  • Event Queueدي فيها باقي المهام العاديةزي: اللمس، الـ scroll، الـ network requests… إلخ

أي حاجة فيها future , future delayed , timer 

بيتنفذ بعد ما مهام ال micro task بتخلص 


كيف نُرتب المهام داخل ال Event Loop ؟

الـ Event Loop كل مرة بيشتغل: الأول يبص على الـ Microtask Queueلو فيها حاجة → ينفذها كلها لو فاضية → يبدأ ينفذ من الـ Event Queue

بعد كل Event بنشوف فيه حاحة ال microtask الاول و لا لا 


خلونا نشوف مثال بسيط 

هنا  الناتج هيكون :

A

D

C

B

 لأن عندنا 

  • A و D → بيتنفذوا فورًا (synchronous)
  • C → في Microtask Queue (أولوية أعلى)
  • B → في Event Queue

📌 التنفيذ بيتم بالترتيب:

1️⃣ الكود العادي يتنفذ → A ثم D2️⃣ الـ Microtask → C3️⃣ الـ Event Queue → B

📌 النظام كله بقي شغال بطريقة اسمها:FIFO (First In, First Out)يعني: اللي يدخل الأول… يتنفذ الأول


💡 كمان مهم تعرف:

الـ Queues دي موجودة جوه Dart Runtime هي جزء من Event Loop Mechanism وDart run time  اللي بيحدد كل Task تروح لأنهي Queue

أما مين يشتغل ومتى؟ده دور OS Scheduler (نظام التشغيل)

لو عندي تاسكات Sychnronous مش بتدخل ال queue دي بتتنفذ علطول 


الخاتمة

ووصلنا لنهاية رحلتنا مع Threads، Isolates، وEvent Loop في Flutter! 

دلوقتي، مش بس فهمت إزاي الـ Dart بيتعامل مع المهام، لكن كمان عندك المفتاح عشان تحافظ على سلاسة التطبيق، تمنع الـ UI Freeze، وتستغل قوة Isolates في العمليات الثقيلة.


المصادر والموارد

تقدر تشوف presentation بسيطة ك تلخيص من هنا : 

https://drive.google.com/file/d/1HVHDQVAyS6IhfeC70AnhmVMIyitFZAs7/view?usp=sharing

تقدر تشوف ملخص فيديو من هنا : 

https://youtu.be/FNI8FSNJJOM

يمكن اللي بنتعلمه هنا مش بس عن Flutter لكن كمان عن نفسنا إزاي بنفكر، نركز، ونتعامل مع الضغط.

وبكده نكون خلصنا تاني حكاية في عالم الـ Channels… استنوا الجزء الأخير في حكاية جديدة مع Method Channel 🔮

💌 Happy Coding & Smooth Apps