Passage d'argument a un thread

cs_alex124 Messages postés 6 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 22 février 2006 - 22 févr. 2006 à 11:39
cs_alex124 Messages postés 6 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 22 février 2006 - 22 févr. 2006 à 14:05
Bonjour, j'ai un probleme lorsque je veux passer une chaine de caractere en argument a un thread, voici mon code :

DWORD WINAPI thcmd(LPVOID lpParam)
{
printf("\nlpParam = %s\n", (char*)lpParam);

return 0;
}

void CommandParser(char * buf)
{
DWORD ThreadId;

if(GetParameter(buf,3))
{
if (!strcmp(GetParameter(buf,3), "$cmd"))
{
if(GetParameter2(buf,2))
{
printf("\ncmd = %s\n", GetParameter2(buf,2));

CreateThread(NULL,NULL,thcmd,(LPVOID)GetParameter2(buf,2),NULL,&ThreadId);
}
}
}
}

Voici les prototypes des fonctions utilisées:
char *GetParameter(char *buf,int nr);
char *GetParameter2(char *buf,int nr);

La fonction CommandParser recupere l'argument écris apres $cmd et dois le transmettre au thread.
Exemple:
Si dans buf il y a:
$cmd "ceci est une commande de test"

Le resultat de GetParameter(buf,3) est: $cmd
Le resultat de GetParameter2(buf,2) est: ceci est une commande de test

Or lorsque j execute mon code, dans mon GetParameter2(buf,2) j'ai bien: ceci est une commande de test, mais dans mon lpParam j'ai autre chose (le printf m'indique que la valeur est: md)
Par contre lorsque je passe un entier a la place d'une chaine ça marche

Comment faire pour que cela marche avec les chaines ?

Merci d'avance

5 réponses

cs_alex124 Messages postés 6 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 22 février 2006
22 févr. 2006 à 11:45
Je voudrais rajouter que si je fait:

char * test = "c un test";
CreateThread(NULL,NULL,thcmd,(LPVOID)test,NULL,&ThreadId);

ma chaine est bien passée au lpParam

C'est a ne plus rien y comprendre :S lol
0
olbal Messages postés 20 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 29 septembre 2006
22 févr. 2006 à 12:19
Par exemple si buf pointe sur une variable locale de la fonction appelant CommandParser, la variable locale à de grande chance d'être détruite quand le thread va vouloir la lire... Si buf pointe sur une variable static, pas de problème si la variable n'est pas modifiée pendant que le thread l'utilise.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 févr. 2006 à 12:20
Faut voir d'où vient ce *buf, ne serait pas un buffer local à une fonction qui deviendrait illico invalide après sortie de cette fonction ?
A croire puisque fonctionne avec une constante.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cs_alex124 Messages postés 6 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 22 février 2006
22 févr. 2006 à 13:07
En fait mon prog se connecte a IRC et reçoit le texte dans buffer.
Voici le code apres la connexion au serveur:

while (1)
{
memset(buffer, '\0', 255); //on vide le buffer
recv(sock, buffer, sizeof(buffer), 0);

// on efface le \l\n
buffer[strlen(buffer)-2] = '\0';

// on affiche le texte
printf("%s\n",buffer);

// on execute les commandes
CommandParser(buffer);
}

buffer est une variable globale: char buffer[255];
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_alex124 Messages postés 6 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 22 février 2006
22 févr. 2006 à 14:05
Apparament j ai reussi a corriger le probleme, j'ai appeler le code pour recevoir le buffer directement dans la fonction commandparser et sa transmet la bonne chaine de caractere. Ca devait etre un probleme de variables globales/locales, merci a vous deux.
0
Rejoignez-nous