From 7659bf2b4aba19351c8b92f84dbe1dca06cdf30d Mon Sep 17 00:00:00 2001
From: Paul Chevalier <paul.chevailer@student-cs.fr>
Date: Wed, 12 Mar 2025 15:05:47 +0100
Subject: [PATCH] addition du multithreading

---
 Objet/__pycache__/main.cpython-310.pyc       | Bin 2163 -> 2288 bytes
 Objet/__pycache__/menu.cpython-310.pyc       | Bin 4771 -> 4792 bytes
 Objet/__pycache__/trajectory.cpython-310.pyc | Bin 7023 -> 7023 bytes
 Objet/__pycache__/ui.cpython-310.pyc         | Bin 9848 -> 9996 bytes
 multithreading.py                            |  28 +++++++----
 test_chargement.py                           |  48 ++++++++++---------
 test_multithrading_logo.py                   |   6 +--
 7 files changed, 47 insertions(+), 35 deletions(-)

diff --git a/Objet/__pycache__/main.cpython-310.pyc b/Objet/__pycache__/main.cpython-310.pyc
index 5cc024724307d9d45be4574c2b3f472aaa136ee6..d0b4158647e682823c630cad49ac967424325081 100644
GIT binary patch
delta 873
zcmY*X-D(p-6rP#=o88Ukze!B3+9I|Q5riUM_!E&<uPS1%MsW#FsM+quvWa3PAs4OJ
zBEkDv@C8JD0<XOCKKKxVFW@<oQ0)xoJKvczXU;dX`=|K36ub-qkHC0h|J?ibAy}Dw
zg+P)HkyNsn3aUL5OnXC^+FQZ`Z^U-u2#4ZcGv<jaT+OZ6OMKyLZpXPK5P{}SoKFg(
zpgE6=NlBD6cjIzW5f#mEvbZXi?i1-r|CmVsh>2RaE_3@V-R;(7AoH-&=r+`uj6gv_
z7LSQ&O7@tvO52}*eP^^dRmQ`~E`@8*4jGXMF0yZ=pMWuC0Gg4NQA&oka-@-g^fnpO
zAy@8*ViwE;^TBdpG_#+w5eb2ZnD<qHoiQUVQ1t?ssq%|8Gb*IF`g@}ZiHfR(DQq@|
z1EMlCVAvRWRMCZ=s$!(&ECH(>L5r{qjQz_%<f;0i0aJ|=rk?<^RN5fqopi={Jr-Fb
z<5`uc=5RSWo1tbFT7bS<$w>MhV|5M>ffqP0`Me}!T9~IUEaJIP{dNNfcCKQDB=FAe
z&hB*Ey2jULR@&{z!!K{F2h?AO|7LIlz+}@Ob~0%LO;=CD8ip=F0c>CcaKdS>uGeNf
z43kc;ABJ!F>z>@anjCDVKJ0l8c51+<CHKGvCcqFS(VZ4eTM(UeytAO#a>jduP)mJ;
zRSdwS=@z)w^1P}EJiQDsv-+=+gTwUt^rJIwUcqJ5o8Cp(KxiXuP1pIQjf+4{xWIho
P=>L<`Jma@L$mQ5ytS+$?

delta 688
zcmYLHzi-n(6n@V?&yMZHX`GNkTd0IY#Dowm9q0xVAhio8q%0RIxpqNrI#f!OA*>yc
z|A8|LLSjLTEJ*B#nTdrRiM`^zO9YnQci(&8efQp-{5$>AiC@NX2=u+X{B|VY#9NCG
zlqgVGfLyI8(d3r2&FV;pR;zGJPkP9E?7}aF6oxxRP=+!z+$~yVBqPJUA}$k|815JC
zvLic&iy|$%vTHaN8}e@NA*euwuR(=NOJ<Y4Y8_kE;UrU$im5V~4D^)-$bbhXM#;xt
zUoC9c@9igxrwA~EoP=Y$dP@woMQG<vg9uYsd&+81+50fZsjtNhS)~XlLW&jzG~RP^
zjfs!>v`|OfkQL?7FfWMNI$qc8JgN3hj;Pkwiw;ZNY|d>{YC!FbHO;%m80ZaF%s4$_
z*^)*Wr^N8TLRp~u>jtO?|CqTssi0gMWU0J450AMsvwNV2&!(IC)rRkcV}~%**BYoU
zIM-Wz2))3z@>iC|GJ^$rXPvJGHE(z7($4GbP;dYv@wh&8@8FG37w#hrZqhGudY_>F
z>6Q4P{^AdMRX};df=3`gVAQYA{q1ZttTw4qjR=0YCuilW^XgvR67%dfm)TbBGu&d}
X!-n-|5qrCo3aGz}p}!YmgwEw(*EN}D

diff --git a/Objet/__pycache__/menu.cpython-310.pyc b/Objet/__pycache__/menu.cpython-310.pyc
index 995153ef28663e9975adb7abe4c3546fa8d2f720..83015087dea9d2d6546eccdd7ddb7b9648a3198e 100644
GIT binary patch
delta 261
zcmZ3ix<i#WpO=@50SIi^&Zo<7<c;CxV+Hb9fY=#`i=8HybDMM2ved9FU|+~Ec^!8%
zBgbST9u02a#LT=~%tfVnnyix(c+^a?fU1jv;6yNpWd|e{0&%ejkl<hhK_(z%VPyNq
z!py_Svw1TQ4-@0&$p`o{84D(B@fR}go;-(t1!KizR{?$gQjif~a~y!Ib(5O~`Wa77
z78VQ@tpv%qfe23!0kWp3XmYKfFC+Kl(}F&1w^(w4uA3|)q$64nk^}jus1r!sVooe5
TC~BS@D`d~^$i~RS$np;WI0QMX

delta 225
zcmdm?x>%JrpO=@50SH(>pG#-m$Q#4W#{%Smurm-BTTL$KHlMtWyP1)FvK5a8TW(@z
zo+iuWTpl&aAfS8^m<R^3?102VkQSlI8+n8o1vVe&;bCIjH2Df&CS(3&JN`n(U6VKP
zuV5^n94VmBUjots*5?3Zt(`nwpr7%?WOcz%(F%}^8;I}(5g=oW3MWq#^kw9ld|%Lq
pwI~ZHGTBf_N3;$k#R?)ifW$54#DapNrpZM@_UsO9j694i{{W*NG)Vve

diff --git a/Objet/__pycache__/trajectory.cpython-310.pyc b/Objet/__pycache__/trajectory.cpython-310.pyc
index 35ca0cd65d6446c011005698b7cdd58aba4f8d3a..4f22c7283a097c3f0f0c0ab9fec80bb9bac23711 100644
GIT binary patch
delta 20
acmaEF_TG#;pO=@50SHnU&u`>Tkp=)h!v$CX

delta 20
acmaEF_TG#;pO=@50SK1=JGYTLMH&D`fd-cV

diff --git a/Objet/__pycache__/ui.cpython-310.pyc b/Objet/__pycache__/ui.cpython-310.pyc
index 403d169a1c35e1a378410a8362e2153cfbedd86a..64e48af625d2e8ce57e84cb50d9d8a511d05fcf1 100644
GIT binary patch
delta 1880
zcmZ`(Nlz3(6z=L_nsJ8iK@H0w+l-=_Xk4N!BC@)RxE_p}n3z%&6i5#WLSv(-v<rxq
z#tqlRMAVol7k_|fy_tAbk9suG#6;hFRfvNFNq_aWuip2nrufl#xyfob&7cN<dyV(a
z>C0bPAH!A#xM}eD;7fFle-CeA?w~g49}FJy@#TEQ*+5^=3$|z%{GPvs^@YIJNA!en
zLcFw9x8HdtFB@P?gSA|(6>43HtHTB~zz{Eo>d#I(r>JKsRwiaW*o&7##z&RzN+|u|
z7-~a{%MDYNmbL05%+7XZ$XeK5)>?`imcA4*rA-BKR{&QEHIyXFRT{%Gkdj<U<Q>p(
z6-_yVSJBjA>BD^FtLgoGHLv8=YQ9y(?SKI*6}MV($@g3fN+*vlnOsfeVIa!}0o5?9
z1XxOtJoaR66>(pHXt{qt3h=_x2hk+JO{sb{k>A2SOO>W-Y$~#uG;xU6Q2i%pR;#A0
zQ&W-;&B*`TtDe{J209@(#A|`9+Zs$+qsR@4Og@mwPeBgx2I3Y1S2hSp0WhT$U@1Wp
zCp6hO#Osjj+Et)hHV8-oK$Ze5B`6iSo*M6h6OtlL)!0;AGil-wUqkgA_Fk)oTSu!q
zQ$3lrRL}vx&^45ph_9o#;{>L}*Hio|-{1xJ`(XZ!$bwNe5u4r**LG_7!GpxNquXz$
zz8y!0x7f^xVyUO$OMXVp8sGewDkipzH#P~D8yWA;D%RPUxSjKob&9Q#JaHg5!4l#_
zZn1G3{=xLb#H;KA5s4J#oB-EejIa=4J3yS-CxKLAbc55gfJ$#hnv6~?I4S!5*@ERY
zPQ&aKkBYKIPo62+CB%M~_aXBXvR#CJgaI)!XHQNanwS}5b_Lq~2m^xU@6I}hCb0(p
z$+YEn{lC@sR6(a;U)IHxdweU{lXW>|W?$hQ<1}W@h+l=hY(#Vy%{8uJ;5y7DOf=)V
zeFGymMP2bd<1Cs(;!AN${%thxAWR;mZlA}%CD9U%u~9J;ZJ4Ia!?G*lYqSW;GGevU
zlwH8GVR1MXO&bMMgrm_k-rm(F9_G%?ux-rZ71{~BhS^7tw6z}O`@5fGh%TP)BQOyc
zuVYW$3_FhL4umd*9s~#B7Q$VGdkFUt9w0nK*nohe#%I~v(5ADXL1<{wdK43v5QY(k
z5UwClQ#i;aaFXcvBFLW@TE`ID5f&ko0kpxFSSoz;N?GQ3`MjTuJrT?1*ZWInv9#ZR
E0AD1wQUCw|

delta 1769
zcmZ`(OH30{6rDHFQU+&AO`w3SZTV;#4GX0TNag20NF;8IF>&(}3>Yy}6|AG9;%7iq
z%=51pqb6!JM#9dxaiJ^Y(nQ_6RTE8EX!PFu9$K(8ne*O#_nv#tnat~0_jH#vV48*o
zzbD_`^*&uOX?+M<B@h<EQvgqfPyGmPWv*xRX(K+**T;?;u-C`+%sI#4EBkf(jc4+P
zVa7CAQ)*qM*44N=Y*+&{cnYdNIYpdKJxj4lG3%A^l{^KR0;*gMm0umd>SuBBFl4#8
z1r7cBII}IMSe8IjInq*;pp50{In7rQcR6sSJiiiRDPchw&*i$LtdYoDU|<t@E9TAQ
zH7H|nMX~bi<7;>$Z&9wAh`R@TH7ah4;!+G;it}<?`dxH<2FP+iKn)Bk0hSUZU-s<5
z%{2G{h?WBaQh*nfF$|W1@^RM?_oZjLie#$6rXriO92-1MgpV+6t#a9_Tv80fDE{lR
zji-6LdP8f8I}Ik&ircQZ>0uW?F$+rneNsN2OKu0UZkGdD4hTpA;8F^(l%N@xx!hLb
zHh^f^KOhAFR|>Fr+MRcB8<D%<`zO_~N~fkGo3k7nyo2g@LGw=KZXK;5bx%4ezXv|h
zj+}GX;Oi)HzzNJs7<@gQkMIqivAY2LZzQQjd=t^>f^luTh7VjrygR!6eD2+Gbe`&E
z#85ZEDagG=VXvfD<D2hM$xOTCmTnQMsGRc3;yO!;$KhuzBX(C-3A-Z0Z1K4w?mqy3
zBiU;4syr%^m9g+a2<>`=We7b0NoEfLsm?zLL3SyXKCJBaXRu&M9QT!rP*vAF%&eG<
zm5b3TQ?l!b{i5o9=}}}KLvRsJio1(;h8^5u<}tGyb8?}`j<QoTIr~gb=2&F#|5m<e
zp2M-|uCkH5J$^-ZmYvI+*}M3r|2Sq&hy}4D?4s~uHU3L@Ai$R}ahufb%Xo5C^u#Cp
z!?+z2-{XCe>$tsv@b6XX_GvsA71=~JyCo(Po%58P#j*?HXCek=k?OW^{%)T55|4`U
z>f*v%KoGG+qL2>^?h~ywkK7VFiB0w+96~sZa0KBR!cBzR2onf*5H=y8+~h)g8}7*u
zi6P-0p6x{#ML3TzhHwFa=E;|#X{Kgp@lbsxL$wiBFRs+4rry?0Gj?CRUee)Pv5*!1
F{sXSIpBexF

diff --git a/multithreading.py b/multithreading.py
index a9d20f6..5d2d61e 100644
--- a/multithreading.py
+++ b/multithreading.py
@@ -1,29 +1,39 @@
 import time
 import threading
 
-# Fonction simulant une tâche lourde (ex: traitement d'image, calculs intensifs)
-def tache_lourde():
+# Fonction qui effectue une partie du travail
+def tache_lourde(part_debut, part_fin, resultat, index):
     somme = 0
-    for _ in range(10**7):  # Boucle qui prend un certain temps
+    for i in range(part_debut, part_fin):
         somme += 1
-    return somme
+    resultat[index] = somme  # Stocker le résultat pour éviter la concurrence
+
+# Paramètres
+N = 10**7  # Taille du travail total
+THREADS = 4  # Nombre de threads à utiliser
 
 # Exécution sans multithreading
 start = time.time()
-for _ in range(4):  # Exécuter 4 tâches séquentiellement
-    tache_lourde()
+somme_total = sum(range(N))  # Exécution en une seule fois
 end = time.time()
 print(f"Temps sans multithreading: {end - start:.2f} secondes")
 
 # Exécution avec multithreading
 start = time.time()
 threads = []
-for _ in range(4):  # Lancer 4 threads en parallèle
-    thread = threading.Thread(target=tache_lourde)
+resultats = [0] * THREADS  # Stocker les résultats des threads
+portion = N // THREADS  # Taille de la charge par thread
+
+for i in range(THREADS):
+    debut = i * portion
+    fin = N if i == THREADS - 1 else (i + 1) * portion
+    thread = threading.Thread(target=tache_lourde, args=(debut, fin, resultats, i))
     threads.append(thread)
     thread.start()
 
 for thread in threads:
-    thread.join()  # Attendre que tous les threads finissent
+    thread.join()  # Attendre la fin de tous les threads
+
+somme_total_thread = sum(resultats)  # Fusionner les résultats
 end = time.time()
 print(f"Temps avec multithreading: {end - start:.2f} secondes")
diff --git a/test_chargement.py b/test_chargement.py
index a7ed873..c8908f8 100644
--- a/test_chargement.py
+++ b/test_chargement.py
@@ -1,9 +1,11 @@
 import time
+import threading
+import os
+import sys
 from tkinter import Tk, Label
 from PIL import Image, ImageTk  # Installer Pillow si nécessaire : pip install pillow
 
-# Lancer ton programme principal ici
-
+# --- Création du Splash Screen ---
 splash = Tk()
 splash.overrideredirect(True)  # Enlever la barre de titre
 
@@ -22,30 +24,30 @@ splash.geometry(f"{img_width}x{img_height}+{x_pos}+{y_pos}")
 # Afficher l'image
 label = Label(splash, image=photo)
 label.pack()
+splash.update()  # Mise à jour de l'affichage
 
-# Garder le splash pendant le chargement
-splash.update()
-
-# Pour éviter que le programme ne se ferme instantanément
-
-
-
-import os
-import sys 
+# --- Fonction pour charger le menu principal ---
+def charger_menu():
+    global splash
+    base_dir = os.path.dirname(os.path.abspath(__file__))
+    dossier_path = os.path.join(base_dir, 'Objet')
+    sys.path.append(dossier_path)
 
+    import menu  # Importer ici pour éviter les blocages
+    temps = time.time()
+    
+    a = menu.App()  # Chargement du menu
+    splash.destroy()  # Fermer le splash après le chargement
 
-# Fermer le splash et ouvrir le menu principal
-base_dir = os.path.dirname(os.path.abspath(__file__))
+    tmp = time.time()
+    print(f"Temps d'exécution : {-(temps - tmp):.6f} secondes")
 
-dossier_path = os.path.join(base_dir,'Objet')
-sys.path.append(dossier_path)
+    a.mainloop()  # Lancer l'application principale
+    a.destroy()
 
-import menu
-temps = time.time()
-a = menu.App()
-splash.destroy()  
-tmp = time.time()  
-a.mainloop()
+# --- Lancer le chargement en arrière-plan ---
+thread = threading.Thread(target=charger_menu)
+thread.start()
 
-tot = temps - tmp
-print(f"Temps d'exécution : {-tot:.6f} secondes")
\ No newline at end of file
+# --- Affichage du splash screen pendant le chargement ---
+splash.mainloop()
diff --git a/test_multithrading_logo.py b/test_multithrading_logo.py
index f027b14..57a1d5a 100644
--- a/test_multithrading_logo.py
+++ b/test_multithrading_logo.py
@@ -43,15 +43,15 @@ def load_main_program():
 
     base_dir = os.path.dirname(os.path.abspath(__file__))
 
-    dossier_path = os.path.join(base_dir,'Code_objets')
+    dossier_path = os.path.join(base_dir,'Objet')
     sys.path.append(dossier_path)
 
-    import Menu
+    import menu
 
 
 
     # Lancer le programme principal ici
-    a = Menu.App()
+    a = menu.App()
     a.mainloop()
 
 # Démarrer le splash screen dans un thread
-- 
GitLab