begin process at 2012 02 13 21:23:14
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > MULTI THREAD

MULTI THREAD


 Information sur la source

Note :
8,29 / 10 - par 7 personnes
8,29 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Initié Date de création :30/09/2002 Date de mise à jour :04/10/2002 08:04:02 Vu / téléchargé :18 739 / 2 197

Auteur : sephiro

Ecrire un message privé
Commentaire sur cette source (39)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Documentation de base pour utiliser les API multithread

'Creation d'un thread
CreateThread (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long

lpThreadAttributes: sécurité,  mettre 0
dwStackSize : taille de la pile, 0 => meme taille que la pile du thread parent
lpStartAddress: adresse de la fonction à lancer.
exemple:
soit une function Toto()
lpStartAddress=AddressOf Toto, AdressOf donne simplement l'adresse de cette fonction.

lpParameter: parametre de la function, il faut savoir que votre thread partage les variables du thread parent.
dwCreationFlags: Permet de controler le thread, il est possible de créé un thread sans pour cela l'executer,
si dwCreationFlags=&H4 il est créé mais en attente. Si =0 il est executer imediatement
lpThreadID: pointeur sur l'ID du thread

La fonction retourne l'Handle du thread créé, si Null erreur.

'Destruction d'un thread
TerminateThread  (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
hThread: handle du thread (donner au moment de la creation)
dwExitCode: mettre 0.


'Changer la prioritée d'un thread
SetThreadPriority (ByVal hThread As Long, ByVal nPriority As Long) As Long
Il est possible de rendre plus ou moins prioritaire votre thread, un thread d'affichage sera Low, un thread de communication sera hight, Low=-2, Normal =0, Hight =2
Au moment de la creation la priorité d'un thread = priorité thread Parent.


'Connaitre la prioritée d'un thread
Function GetThreadPriority (ByVal hThread As Long) As Long
Donne la prioritée du thread

'Execute le thread
ResumeThread (ByVal hThread As Long) As Long
Permet d'executer un thread, s'il a été créé avec un Flag =Attente, cette API permet de l'executer

'Stop un thread
SuspendThread (ByVal hThread As Long) As Long
Fonction inverse de la précedente

'Donne le handle du thread en cours
GetCurrentThread () As Long

'Donne l'ID du thread en cours
GetCurrentThreadId () As Long

Source

  • 'Exemple:
  • 'Déclaration des API
  • Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
  • Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
  • Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
  • Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long
  • Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
  • Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
  • Private Declare Function GetCurrentThread Lib "kernel32" () As Long
  • Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
  • public function Thread ()
  • dim mhandle as long
  • dim lpThreadID as long
  • 'Creation du thread
  • mHandle = CreateThread(ByVal 0&, ByVal 0&, AdressOf Toto, ByVal 0&, 0, lpThreadID)
  • 'Connaitre la prioritée du thead créé
  • Priority = GetThreadPriority(mhandle)
  • 'Mettre une prioritée plus importante
  • Call SetThreadPriority(mhandle, 2)
  • 'Fin du thread
  • Call TerminateThread(mhandle, ByVal 0&)
  • end function
  • function Toto()
  • 'Mettre le code que vous voulez
  • end function
'Exemple: 

'Déclaration des API
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long

Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long

Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long

Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long

Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long

Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long

Private Declare Function GetCurrentThread Lib "kernel32" () As Long

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long


public function Thread ()
 dim mhandle as long 
 dim lpThreadID as long

'Creation du thread
    	mHandle = CreateThread(ByVal 0&, ByVal 0&, AdressOf Toto, ByVal 0&, 0, lpThreadID)

'Connaitre la prioritée du thead créé
 	Priority = GetThreadPriority(mhandle)

'Mettre une prioritée plus importante
	Call SetThreadPriority(mhandle, 2)


'Fin du thread
    Call TerminateThread(mhandle, ByVal 0&)
end function

function Toto()
'Mettre le code que vous voulez
end function 


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip COMMUNICATION INTER-PROCESS COMMUNICATION

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) .NET DEPENDENCY VIEWER : ARBRE DES DÉPENDANCES D'UN ASSEMBLY... par ShareVB
Source avec Zip Source .NET (Dotnet) UTILITAIRE SKYDRIVE par MasterShadows
Source avec Zip ROTATION RAPIDE D'IMAGE par trex70
Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ... par Renfield
Source avec Zip Source avec une capture MOUSE SPEED AND WEIGHT : RETOUR DE FORCE VIRTUEL ! par ScSami

Commentaires et avis

Commentaire de sephiro le 30/09/2002 12:27:30

Attention c'est tres instable sous VB avec le Debugger, une fois compilé pas de probleme, ne pas oublier de détruire TOUS les threads que vous avez créé.
Il est bien sur possible de créé plusieurs thread avec la meme function
mHandle1 = CreateThread(0,  0, AdressOf Toto, 0, 0, lpThreadID1)
mHandle2 = CreateThread(0,  0, AdressOf Toto, 0, 0, lpThreadID2)
mHandle3 = CreateThread(0,  0, AdressOf Toto, 0, 0, lpThreadID3)

Commentaire de zmat le 30/09/2002 23:41:08

Bsoir,
Juste une petite kestion : c koi un thread ? :-/

Commentaire de max12 le 01/10/2002 01:43:25 administrateur CS

Tu devrais donner plus de détail du genre c'est quoi un thread, a quoi sa sert un thread, quel avantage sa donne etc.......

Commentaire de Crazyht le 01/10/2002 09:24:19 administrateur CS

Alors un Thread se comporte comme un executable. Je m'explique, c'est une partie de code qui se deroule paralellement au reste de lexecutable. Il a l'avantage de partager les variables globales avec le programme principal (Qui est en fait lui aussi un thread). Ca a l'avantage de ne pas bloquer le programme lors d'un traitement. A titre d'exemple le module de recherche sous Word est un thread. Nous pouvons aussi siter les logiciels FTP, qui effectuent plusieurs transferts en simultanés.L'interface est le programme et chaque transfert est effectué dans un thread.

Voila en gros
@++
Crazyht

Commentaire de Mix78 le 01/10/2002 09:30:28

Un thread est un processus asynchrone auquel votre processeur accorde du temps d'éxecution...
C'est un peu comme quand vous mettez un Doevents dans votre code, si de instructions sont en attente la machine virtuelle de VB les executera avant de revenir au code après le Doevents... Le thread permet qu'une ou plusieurs fonctions de votre projet soient éxécutée de manière concurente au reste du code.
En pratique quand vous entrez dans une fonction VB vous n'en sortirez pas tant que le code de la fonction ne sera pas éxécuté;  mais vous pouvez lancer une autre fonction (Thread) et resortir de la première fonction sans que le code de cette fonction appellée soit totalement executé... Le code de la fonction threadée continura sont execution de son coté...

Voilà ,j'éspère que cette explication n'est pas trop mal expliquée :-)

Commentaire de zmat le 01/10/2002 14:53:10

Si je comprend bien, les threads ça m'permet de faire du multitâche avec mon appli vb ... !? si c bien ça, ça'm donne une idée des avantages mais ...
Quels sont les inconvénients des threads et surtout qu'est ce que je risque en les utilisant ?

Merci pour les explications
En passant, s'rait cool de poster un zip là dessus

Commentaire de couriousous le 01/10/2002 18:34:54

Enfin! Vla le chti bou de code que je cherche depuis 6 mois!!! en + les explications sont cool! juste une chite question, j'ai lu quekpar que si on met un doevents dans la fonction threadée, le thread est détruit ( ou se stope ) c juste ou faux?

Commentaire de couriousous le 01/10/2002 18:39:07

juste comme ca on peut récupérer la variable que retourne la fonction? ex:

function toto() as integer

si on la démarre avec un thread, peut-on récupérer la variable retournée au aussi: c'est comment qu'on sait que le tread à finit son action?

Thanks!

Commentaire de sephiro le 01/10/2002 19:08:11

La function Toto ne retourne rien , elle peut recevoir de parametre pendant son lancement, voir createThread et pParameter.
Le thread peut accéder au variable du thread parent (celui qui l'a lancé) il peut donc retourner tous ce que l'on veux. Il est possible de faire discuter plusieurs thread entre eux, via des Named Pipes (Je prepare un truc la dessus), ainsi qu'un Zip d'exemple.
Le gros probleme avec les threads sont leurs instabilités da

Commentaire de sephiro le 01/10/2002 19:09:24

La function Toto ne retourne rien , elle peut recevoir de parametre pendant son lancement, voir createThread et pParameter.
Le thread peut accéder au variable du thread parent (celui qui l'a lancé) il peut donc retourner tous ce que l'on veux. Il est possible de faire discuter plusieurs thread entre eux, via des Named Pipes (Je prepare un truc la dessus), ainsi qu'un Zip d'exemple.
Le gros probleme avec les threads sont leurs instabilités dans le debugger de VB, de plus il est impératif d'analyser votre probleme avant de commancer à utiliser les threads car vous etes tres vite submergé !!!!

Commentaire de sephiro le 01/10/2002 19:13:08

Pour savoir si ton thread est toujours la tu peux utiliser une API qui va te lister les handles ou les ID.
De plus à la fin de ta function Toto, le thread se termine. Si tu veux qu'il reste il est obligatoire de faire une boucle pour l'empécher de sortir.

Commentaire de couriousous le 02/10/2002 21:39:09

ok compris! ( named pipe? comme sous linux dans le shell?)

Commentaire de jenlain le 28/10/2002 18:48:48

ca marche pas, ton truc

Commentaire de bdpatrice le 21/11/2002 16:54:42

mHandle = CreateThread(ByVal 0&, ByVal 0&, AdressOf Toto, ByVal 0&, 0, lpThreadID)

j'ai une erreur de compilation sur le parametre "Toto" il ne veux pas le prendre
AdressOf Toto

comment faudrait-il l'écrire?

Commentaire de TheDjinn le 02/12/2002 22:16:31

ya pas sephiro, jte kif trop ;)
sof ke la cuila jsuis pas sur ki me serve tout de suite, jai pas besoin de multithread dans mon 'shell'... ;)

Commentaire de TheDjinn le 10/12/2002 22:52:57

bdpatrice : met tout dans un module
met un 2e d a adDress (jcroit kon peut escuser sephiro pour ca kan mm ;) )

le multi thread ca tu en tout cas un grand merci a sephiro ;)

Commentaire de Ouneufe le 07/01/2003 12:56:26

Rhaaaaaa, enfin une demo de thread ciselée et complète. Ouh là, je me sens défaillir de bonheur. hop : 10/10

Commentaire de bdufay le 16/01/2003 11:43:56

Nickel!

Commentaire de venomp le 11/03/2003 09:32:43

Le prog fonctionne au poil..
Mais je n'arrive pas a l'adapter a un de mes prog existant..
Je suis Sur NT 4 sp6. Quand je modifie mon prog et que je le lance dans l'ADI tout fonctionne, mais quand je crée l'exe et que je l'execute, Dr watson fait des siennes.. comment résoudre le pbm.
Note: je me suis servi de la classe du projet.

Commentaire de gogomanu le 19/06/2003 16:17:19

Excellent merci beaucoup ! J'ai besoin de faire un client serveur dont le serveur exécute des ordres, mais sans thread si le traitement n'est pas terminé il ne reçoit pas les autres demandes ! tu parles d'un serveur !  donc threads ! merci !

Commentaire de heine le 23/06/2003 15:47:12

super interressant les threads, mais j'eprouve un soucis... j'ai un,e fonction liberant la mémoire vive:

Dim Mo as variant
Mo = 100
Mo = Mo * 1024 * 1024
call space (Mo)
  voila ceci va liberer 100Mo de Ram,  cependant je voulais fais une barre de progression, mais avant tout fodra utiliser ce syteme de threads qui m'a l'air cool, mais je voi pas koi faire... ;) kelkun pourait m'expliker ?

Commentaire de heine le 16/01/2004 16:22:43

Bon j'ai réussi à exploiter ceci, je comprend pas trop mal le pricipe de fonctionement, mais j'ai toujours un soucis, pour tuer les threads on doit tuer l'application... :/ je pense qu'il faudrait pouvoir TUER et non mettre en pause le thread par le biais de son handle... à voir si c'est faisable, je v matter ca...

Commentaire de captaincav le 04/02/2004 10:18:14

merci pour tout ca :) vraiment :)

mais j'ai un petit soucis toutefois :/

J'utilise cette fonction de la facon suivante :

Public Function ma_fonction()
    MsgBox ("pouette")
End Function

Public Function Thread()
    Dim mhandle As Long
    Dim lpThreadID As Long
    mhandle = CreateThread(ByVal 0&, ByVal 0&, AddressOf ma_fonction, ByVal 0&, 0, lpThreadID)

    Call TerminateThread(mhandle, ByVal 0&)
End Function

Public Sub Command1_Click()
   Call Thread
End Sub

Toutefois, en faisant ainsi, ma fonction n'est pas executé (pas de pouette qui s'affiche :/)!! J'ai l'impression que le Thread se termine directement apres. Comment faire pour remédier à cela ? Ou alors j'utilise tres mal tout ca ?

Merci :)

Commentaire de capoueidiablo le 09/07/2004 16:16:59

Salut à tous,
J'aimerais savoir s'il est possible d'envoyer plusieurs paramètre a la fonction Threadée ?

ex :
public Function Fonctionthread (Val1 as truc, Val2 as machin, ....)

dans ce cas à quoi doit etre égal "lpParameter" dans la fonction de création du Thread ?

Merci [:)]

Commentaire de occhipin le 30/07/2004 14:55:39

Moi aussi j'ai un problème avec AddressOf. Pourtant j'ai mis deux "d" à adresse. mais il accepte pas Toto après !
Donc voila si qqn sait pourquoi ca me met invalide use of propertie !!!!
Merci

Commentaire de occhipin le 30/07/2004 15:08:17

ah dsl le addressOf fonctionne (enfin ne cause plus d'erreur !) mais maintenant c'est CreateThread qui est function or sub not defined alors que je l'ai bien déclarer en haut j'ai aussi essayé de mettre les déclarations ds un module mais rien à faire toujours cette erreur "Function or Sub not defined" !!!

Commentaire de occhipin le 02/08/2004 10:47:10

Bon je vous jure c'est mon dernier message sur ce poste ! Mais il me reste un problème qui peut etre peut s'expliquer tout simplement !
En fait dans un module j'ai mis les déclarations createthread, terminatethread .... en mettant public à la place de private (c'est pour ca que ca mettait function undefined). Dans ce meme module g ma fonction toto. Mais à l'execution g une erreur de violation d'accès, en faisant un débug il est clair que c a cause du thread l'erreur est générée sur toto ! Donc voilou dsl pour tte ses questions mais il est vitale pour moi de trouver une solution à mon problème et donc de voir si je pe le résoudre par les threads !!! Merci

Commentaire de BruNews le 02/08/2004 11:41:18 administrateur CS

TerminateThread est une fonction d'URGENCE !!!
Ne doit jamais etre employe dans un code correct, un thread doit terminer proprement en retournant une valeur et liberer la memoire.
A la suite de TerminateThread il n'y a plus rien, stack initialisee non liberee, toute memoire allouee dans le thread idem (String vb est un bon exemple de memoire allouee dynamiquement et qui fuira a coup sur).
Les threads sont a employer dans un langage ou on peut les gerer, en VB absolument NON !!!

BruNews, Admin CS, MVP Visual C++

Commentaire de l0st3d le 22/10/2006 21:14:13

#1 t'a source. Merci beaucoup!

Commentaire de sephiro le 23/10/2006 08:18:15

Attention j'ai fais cette exemple juste pour prouver que du multi thread en VB 6 était possible, l'environnement de Debug est TRES instable. Utilise VB.net plus adapté

Commentaire de Flocreate le 17/03/2010 13:08:21

Bonjour,
J'ai utilisé un thread comme ci dessus pour annimer un sablier pendant des traitements excel en VB6 (automation).
En effet, lors de certains traitements, le temps mis peut être long (pls 10 aines de secondes). Or, quand un traitement est long a faire, il faut rassurer l'utilisateur en lui metant sous le nez quelque chose qui montre qu'une tâche est bien en cours.

J'ai donc mon Apli qui instancie Excel et effectue des traitements. et un nouveau thread qui fait :
Public Function FNC_THREAD_1()
On Error GoTo erreur
    '/!\ jamais de Doevents dans un thread hein ^^
    Do
        'faire tourner l'image
        Current_Img = (Current_Img Mod frmQuBES.IMG.ListImages.Count) + 1
        Set frmQuBES.I.Picture = frmQuBES.IMG.ListImages(Current_Img).Picture

        'faire une pause
        Sleep 250
    Loop While True   'faire a l'infini

erreur:
    Stop_Thread
End Function

avec
Private ThreadControl1 As clsThreading
    Private Current_Img As Integer

Public Sub Start_Thread()
    'Init variable
    Current_Img = 1
    Set frmQuBES.I.Picture = frmQuBES.IMG.ListImages(Current_Img).Picture
    
    Dim mThreadPriority As Long
        mThreadPriority = tpAboveNormal
        
    Dim mEnabled As Boolean
        mEnabled = True
    
    'Creation du thread
    Set ThreadControl1 = New clsThreading
        ThreadControl1.CreateNewThread AddressOf FNC_THREAD_1, mThreadPriority, mEnabled
End Sub
Public Sub Stop_Thread()
    ThreadControl1.TerminateCurrentThread
End Sub

le problème est le suivant :
en mode d'éxécution sous VBE tout se passe comme voule.Excel tourne et mon sablier tourne aussi.
en revanche, lorsque je génère l'executable (pas de probleme de compilation) et que je l'execute la ca ne marche plus. Le thread principal tourne normalement mais le thread d'annimation (thread ajouté) génère une popup "Violation d'accès en écriture...blablabla"
Et bien sur l'annimation ne marche pas.

pour information, la fenetre frmQuBES est en ShowModal 1

si une personne a une idée d'ou ca peut venir ...

Commentaire de Renfield le 17/03/2010 13:17:36 administrateur CS

Qu'est-ce qui prend si longtemps ?
UNE opération Excel, ou l'enchainement de commandes de pilotage de Excel ?

parceuq esi tu colles des DoEvents dans ton code, ton thread peut très bien etre remplacé par un Timer qui mettra a jour ton animation...

Commentaire de Flocreate le 17/03/2010 13:55:44

en effet renfield, c'est bien avec un timer et des DoEvents que je le fait d'abitude.
mais la pas possible.
mais concidère que l'application travaille sur un fichier excel servant de "base de donnée" (c franchement moche mais je n'ai pas le choix, c'est une base qui existe depuis bien longtemps)

--> 40K lignes à traiter. les traitements mêmes pris séparément prennent plus de temps que voulu (en plus ce ne sont pas des bêtes de courses les machines qu'ont les utilisateurs ...)

et il n'y a pas que les actions excel. il y a aussi la copie en local du fichier (ca peut prendre du temps vu que le fichier est sur un reseau ...) etc

c'est pourquoi la solution du multithread pour l'animation me semblait pas mal ^^

Commentaire de Renfield le 17/03/2010 14:04:49 administrateur CS

si c'est juste pour une animation...
lance un exe a part qui affiche l'animation...

en communiquant avec lui, tu pourras lui faire afficher un message t'indiquant l'avancement, etc.

une fois ton traitement finit, te suffira de le killer.

c'est le plus simple et surtout le plus propre en VB6

Commentaire de Flocreate le 17/03/2010 16:04:01

bien recu ^^
encore que je trouvais ma solution vraiment classe ^^
(ps comment tu communique entre 2 app ?)

Commentaire de Renfield le 17/03/2010 16:32:43 administrateur CS

tu as n moyens a disposition...
mailslot, pipe, socket, messages, etc.

[mode pub on]
ou via cette petite source :

http://www.vbfrance.com/codes/COMMUNICATION-INTER-PROCESS-PARTAGE-MEMOIRE_39615.aspx

Commentaire de Flocreate le 18/03/2010 10:03:54

a en fait je suis bête ^^
si je peux pas piloter la fenetre de puis un thread secondair, je n'ai qu'a mettre Excel en thread secondaire et laisser la gestion de la fenetre dans le thread principal...
ca marche tt de suite mieux ...

je me suis entêté dans la mesure ou il est dificile de lancer l'animation dans un autre EXE. l'annimation est intégré dans le "disign" de l'appli...

Raison trouvée : VB6 Standard EXE travail avec un(des) threads cloisonnés qui interdisent l'emploie de variables globales.
J'ai également vu dans un tuto que il faudrait compiler en "P-CODE" je ne sais pas ce que c mais ca ne m'a rien changé du tout...

Commentaire de Flocreate le 30/03/2010 11:21:43

Petite question toujours en rapport avec le multithread.
J'ai mon programme dans un thread(cloisonné) "thA". Ce programme possède une fenetre sur laquelle il y a une imagebox "ImgB"
J'ai pu constaté que entre threads je ne peut pas utiliser de variables globales (ou presque).
Est-ce que en récupérant le DC de l'ImgB je pourrais le modifier depuis un Thread cloisonné thB sans avoir de conflict de droit d'accès ?

Commentaire de Philippe734 le 01/05/2010 16:07:53

L'usage du multithreading est certes déconseillé et souvent instable dans vb6 mais pas impossible. Cependant, l'usage de cette méthode, qui repose sur l'api CreateThread est obsolète aujourd'hui. Je vous recommande d'utiliser la méthode reposant sur l'api SHCreateThread dont voici un exemple ci-dessous. Allez dans ses commentaires, car j'explique comment faire réduire les risques de crash sous vb6 sp6.
Voir la source :
http://www.vbfrance.com/codes/SIMPLE-PROGRAMME-MULTI-THREAD_5590.aspx

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,014 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales