You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// ❌ MAUVAIS : Tout sur le thread UIfnhandle_export_button(ui:&mutUi,data:&AppData){if ui.button("Exporter").clicked(){// Cette opération bloque le thread UI pendant 5 secondeslet report = generate_large_report(data);// 3 secondessave_to_file(&report);// 2 secondes// Pendant ce temps : l'interface est gelée// L'utilisateur ne peut pas annuler// L'OS peut afficher "Application ne répond pas"}}
La règle d'or
Règle : Le thread UI ne doit JAMAIS bloquer plus de 16ms
(1 frame à 60 FPS)
Opérations > 16ms :
- Requêtes base de données
- Lecture/écriture fichiers
- Calculs lourds
- Requêtes réseau
Ces opérations doivent être déplacées sur des threads workers.
Architecture thread UI / Workers
┌─────────────────────────────────────────────────────┐
│ Thread UI │
│ - Rendu de l'interface (60 FPS) │
│ - Gestion des événements (clics, clavier) │
│ - Mise à jour de l'affichage │
│ - Envoi de commandes aux workers │
│ - Réception des résultats │
└─────────────────┬───────────────────────────────────┘
│ Channels (non-bloquants)
┌─────────────────▼───────────────────────────────────┐
│ Workers (Pool de threads) │
│ - Calculs lourds │
│ - I/O fichiers │
│ - Requêtes base de données │
│ - Requêtes réseau │
└─────────────────────────────────────────────────────┘
pubstructApp{worker_pool:WorkerPool,pending_tasks:Vec<TaskId>,results:HashMap<TaskId,TaskResult>,}implApp{pubfnhandle_heavy_operation(&mutself,data:&AppData){let task_id = TaskId::new();self.pending_tasks.push(task_id);let data_clone = data.clone();let task_id_clone = task_id;// Déléguer au workerself.worker_pool.execute(move || {let result = heavy_computation(&data_clone);// Envoyer le résultat via channelsend_result(task_id_clone, result);});// Le thread UI continue immédiatement// L'utilisateur peut toujours interagir}pubfnpoll_results(&mutself){// Vérifier les résultats disponibles (non-bloquant)whileletOk((task_id, result)) = try_receive_result(){self.pending_tasks.retain(|&id| id != task_id);self.results.insert(task_id, result);}}}
Résumé
Thread UI : Rendu et événements uniquement, < 16ms par frame