Thread et mémoire dynamique.

Signaler
Messages postés
7
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
12 mai 2004
-
Messages postés
7
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
12 mai 2004
-
Salut, j'essaye de réaliser une thread travaillant sur une struct placé en mémoire dynamique (un pointeur sur la struct est passé en paramètre à la thread).
La struct contient un int et une string.
Le problème, c'est que je me prend une erreur windows concernant l'imposiblité d'écrire à l'adresse *****.
Par contre, si ma struct ne contient qu'un int , tout fonctionne.
Si kelkun pouvais m'expliquer avec un exemple simple et clair comment implémenter tout cela (mise en mémoire dynamique de la struct et utilisation dans la thread)....
Merci mais alors merci d'avance à la personne qui pourra me répondre (j'ais essayé plein de trucs mais sans résultats)...

7 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
ca ne changer rien que tu mette une string dans ta struct ou pas. Est-ce que tu pourrais dire à quelle instruction apparait ce message?
Messages postés
7
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
12 mai 2004

Oui quand je mets une string dans la struct cela fonctionne, c'est kan je mets la struct avec la string en mémoire dynamique que plus rien ne fonctionne et que je recois l'erreur citée au cours de l'exécution ...
Je ne suis pas en mesure de donner l'instruction exacte, c'est pour ca que je demande un exemple ....
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
bon bah voila un exemple alors:

#include <windows.h>

typedef struct tagTHREADSTRUCT
{
int n;
    LPTSTR s;
} THREADSTRUCT, *LPTHREADSTRUCT;

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
LPTHREADSTRUCT ts = (LPTHREADSTRUCT)lpParameter;
MessageBox(0, ts->s, ts->s, 0);
delete ts;
return 0;
}

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
LPTHREADSTRUCT ts = new THREADSTRUCT;

ts->s = "bonjour";
ts->n = 0;

DWORD dwThreadId;
HANDLE hThread = CreateThread(0, 0, ThreadProc, ts, 0, &dwThreadId);
Sleep(1000); // laisse le temps au thread de s'éxécuter
}
Messages postés
7
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
12 mai 2004

Alors là merci ^^, j'ais pas l'habitude d'utiliser :
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

mais j'ais compris pour le mécanisme de la thread, enfin je crois bien ^^...
Je pose la question à tout hasard, il faut que je puisse appeller ma thread dans une fonction appartenant à une classe, le but étant que la thread effectue un traitement de routine pendant que le programme continue... Le truc c'est que après la sortie de la fonction je ne sais pas comment faire pour arreter de facon propre la thread avant l'arret du prog principal, la thread bouclant en infini tous les X temps...
Voila si kelkun a un exemple a proposer dans le (beau) style ci-dessus ^^ ...
Merci pour l'aide apportée.
Messages postés
7
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
12 mai 2004

arrgg un autre souci, c'est si je fais :
string txt = "bonjour";
ts->s = txt;

au lieu de :

ts->s = "bonjour";
J'obtiens des erreurs et je dois faire des trucs tres moches avec : TCHAR, et encore ca marche pas tout à fait à l'exécution...

Si j'essaye de faire ca , c'est parce qu'il faut que ma classe propose la fonction suivante (j'en ais parlé juste au dessus) : surveille (int numero, /fréquence des vérifs/, int identifiant de BD, string on, string off) voila pour l'apercu de la chose, et c'est dans la fonction que je lance la thread vu que la fonction ne doit pas bloquer le cours d'excution du programme, et bien sur faut que je passe tout les paramètres de la fonction a la thread pour qu'elle puisse travailler dessus ...
Voila si kelkun voit une solution à ce problème qui me pose de gros souci .... Merci d'avance.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
essaie ts->s = txt.c_str(); ou mieux mets s comme string zu lieu de LPCTSTR
Messages postés
7
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
12 mai 2004

Par souci avec :
MessageBox(0, ts->s, ts->s, 0);
J'ais mis ts->s = txt.c_str(); pour faire fonctionner l'exemple... me reste a résoudre mon problème cité plus haut, j'ais vu que je pourrais faire des trucs sympa avec des évènements mais bon ...
Si kelkun sait comment faire pour résoudre le problème que j'ais cité plus haut .... qu'il hésite pas ^^ .