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