Passer paramètre par CreateThread [Résolu]

steroidstinker
Messages postés
3
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
7 juillet 2007
- 6 juil. 2007 à 11:56 - Dernière réponse :  steroidstinker
- 10 juil. 2018 à 14:06
Bonjour,
J'ai un petit problème avec un thread. J'utilise WinApi. En fait j'ai une fonction dans un fichier .cpp qui mène à une autre fonction dans un autre fichier .cpp. J'envoie un string en paramètre pour que la deuxième fonction puisse s'en servir. La deuxième fonction est créée avec un CreateThread.

Le problème c'est que je n'arrive pas à passer le string en paramètre, à cause du thread. Est-ce que quelqu'un pourrait m'aider ?

Merci ^^
Afficher la suite 

Votre réponse

8 réponses

NeuroCypher
Messages postés
29
Date d'inscription
vendredi 20 janvier 2006
Dernière intervention
24 octobre 2007
- 6 juil. 2007 à 13:38
0
Merci
HANDLE WINAPI CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  SIZE_T dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);

Comme tu a pu le lire si tu as cherche...
Le 4e parametre sert a "donner" un parametre...
Tu peux donc envoyer ton element via cette methode sans oublier les casts

---
NeuroCypher
Commenter la réponse de NeuroCypher
steroidstinker
Messages postés
3
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
7 juillet 2007
- 6 juil. 2007 à 14:07
0
Merci
Ben en me servant de WinApi j'avais vu ça.. Et j'ai longuement essayé, mais j'arrivais justement pas à m'en servir..
Commenter la réponse de steroidstinker
aztcaLISS
Messages postés
91
Date d'inscription
samedi 3 mai 2003
Dernière intervention
25 avril 2008
- 6 juil. 2007 à 16:48
0
Merci
Est-ce que tu passes l'addresse de la string?
lpParameter s'attend a recevoir une addresse.

azt
Commenter la réponse de aztcaLISS
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 6 juil. 2007 à 18:02
0
Merci
str = (char*) VirtualAlloc(....);
strcpy(str, CeQueTuVeuxIci);

et tu passes str à CreateThread(), désallouer en sortie de threadProc.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
steroidstinker
Messages postés
3
Date d'inscription
jeudi 22 septembre 2005
Dernière intervention
7 juillet 2007
- 7 juil. 2007 à 12:27
0
Merci
En fait je crois avoir mal expliqué le problème. Je vais mettre le code pour essayer d'être plus clair :

Dans la fonction main, y'a tout l'affichage du gui, et un thread qui s'occupe de travailler sur les messages :
_______________________________________________________________
int WinMain (HINSTANCE Instance, HINSTANCE InstancePrecedente,
              LPSTR LignesDeCommande, int ModeAffichage)
{
/***blabla***/

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)afficherBoite, 0, 0, 0);
}
________________________________________________________________

Le thread mène donc à la fonction afficherBoite, dans le même main.cpp :
________________________________________________________________
int afficherBoite(string affichierMSG)
{
SetWindowText(Texte[0], afficherMSG.c_str());
}
________________________________________________________________
Il ne fait qu'afficher le message.

Et dans un autre fichier Msg.cpp, y'a une fonction qui travaille sur le message à afficher. Donc, cette fonction envoie le string a afficher boite à chaque fois qu'un nouveau message est prêt.
Et je voudrais savoir comment bien passer la variable string. J'ai essayé plusieurs choses, mais pas reussi. =( Pas reussi non plus à passer la variable en 4eme paramètre.. Quelqu'un peut m'aider svplait ?

Merci
Commenter la réponse de steroidstinker
cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 9 juil. 2007 à 12:20
0
Merci
Salut,

Bon alors à ce que je comprend on passe les argument sous la forme d'un unique pointeur (Sur une structure quand on veut en passer plusieurs je suppose).

Les string, c'est des objets, et y a certainement plein de code implicite un peu de partout dedans tout ça, donc je vais suivre la suggestion du char *.

Tu commence par allouer un emplacement ou copier le contenu de ta chaîne :

// La chaîne que tu veux passer
string str = "Hello world";

// Allocation de la copie
char * copie;
copie = (char*) VirtualAlloc(str.size());

// Recopie de l'original dans la copie
strcpy(copie, str.c_str());

// Lancement du thread
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)afficherBoite, copie, 0, 0);

// Récupération dans afficherBoite
int afficherBoite(char * affichierMSG)
{
  SetWindowText(Texte[0], affichierMSG);
  VirtualFree(affichierMSG, 0, MEM_RELEASE);
}

C'est très probablement simplifiable, et on peut peut être éviter la copie (Passer directement le c_str()), mais là je n'ai pas pris de risque.
(Code non testé)
Commenter la réponse de cs_rt15
cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 9 juil. 2007 à 12:29
0
Merci
erratum,

str.size() ne compte pas le zéro terminal, puisqu'il peut d'ailleurs ne pas y en avoir.

Donc c'est

VirtualAlloc(str.size() + 1);

FAQ sur les string : Ils précisent que ce qui est renvoyé par c_str() n'est pas forcément une copie, donc il est à mon avis préférable d'en faire une comme je l'ai fait.
Commenter la réponse de cs_rt15
steroidstinker - 10 juil. 2018 à 14:06
0
Merci
Merci ! Je n'avais pas répondu à l'époque, je viens de retomber dessus, et je voulais te remercier pour ton temps (:
Commenter la réponse de steroidstinker

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.