Accueil > Forum > > > > Passage d'une structure en paramètre d'un thread
Passage d'une structure en paramètre d'un thread
lundi 29 octobre 2007 à 14:54:12 |
Passage d'une structure en paramètre d'un thread

ulukai44
|
Salut,
En fait, je démarre plusieurs thread qui vont éxécuter une fonction :
(la fonction reçoit en paramètre une structure)
struct partie { int var1; char var2[10] }
main { ... pthread_t tabThread[max]; struct partie tableau[max];
for (i=0; i<max; i++) { pthread_create(&tabThread[i], NULL, fonction, &tableau[i]); } ... }
Je souhaite passer l'adresse de la structure "tableau[i]" à chaque thread. Dans la fonction, mon problème est que je n'arrive pas à récupérer cette structure "tableau[i]" ?
void *fonction (void *p_data) { ... struct partie * t = (struct partie *) p_data; // problème ici surement
t.var1 = 3; ... }
dans la compilation j'ai l'erreur pour la fonction : "request for member var1 in something not a structure or union"
merci d'avance;)
mat
|
|
lundi 29 octobre 2007 à 15:06:23 |
Re : Passage d'une structure en paramètre d'un thread

DeAtHCrAsH
|
Réponse acceptée !
Tu définies un pointeur et tu accèes de la sorte t.var1 = 3 ???? Essaye plutot t->var1 = 3;
Shell
|
|
lundi 29 octobre 2007 à 15:08:36 |
Re : Passage d'une structure en paramètre d'un thread

DeAtHCrAsH
|
Réponse acceptée !
Autre remarque pendant que j'y pense, pourquoi ne passes tu pas directement le param de type partie, ca t'evite de faire un cast juste après. Puis pas besoin de créer une nouvelle valeur en local, tu peux directement de te servir de ton paramètre.
Shell
|
|
lundi 29 octobre 2007 à 16:31:52 |
Re : Passage d'une structure en paramètre d'un thread

ulukai44
|
ok merci, plus d'erreur maintenant;)
j'ai un autre problème :
pour chaque création de thread
; le i est modifié quand il y a plusieurs thread en même temps; et donc je ne peux plus accèder
(ou modifier)
dans ma fonction à
tableau[1].var1 (i est à 1) quand
par exemple
un deuxième thread est lancé (le i est passé à 2);
il y a t'il un moyen de conserver le i du 1er thread ? celui du second, etc?
mat
|
|
lundi 29 octobre 2007 à 17:21:08 |
Re : Passage d'une structure en paramètre d'un thread

DeAtHCrAsH
|
Réponse acceptée !
Oui il y a surement un moyen, a tio de voir lequel car je ne connais pas ton code. Je dirais de déclarer un tableau d'entier qui stock la valeur de i pour chaque thread lancé. Ainsi ton thread sera capable de retrouvé la valeur de i qui va bien.... A essayer :)
Shell
|
|
mercredi 31 octobre 2007 à 16:24:20 |
Re : Passage d'une structure en paramètre d'un thread

ulukai44
|
Merci ta réponse marche. En fait j'ai un autre problème dans mon code :
Je programme une application client / serveur en C (en utilisant les threads dans mon fichier serveur.c)
Je lance mon fichier serveur. Je lance un client ca fonctionne, il me demande si je veux continuer, je taper 1. Je lance un autre client, et pour ce dernier client ca fonctionne, je taper 1 aussi. Mais si je reviens à la fenêtre du premier client dans le terminal et que je retape 1 pour continuer encore ba il bloque.
J'ai passé qq heures sur le code; et j'vois pas pouquoi. si vous avez des solutions merci.
En fait le plus récent client lancé marche et les anciens ne marchent plus en même temps.
Ca vient peut être des threads
Voilà mon code :merci d'avance
/***************************************************************************
Nom du fichier : serveur.c
****************************************************************************/ / #include <stdlib.h> #include <stdio.h> #include <linux/types.h> /*pour les sockets*/ #include <sys/socket.h> #include <netdb.h> /*pour hostent,servent*/ #include <string.h> /*pour bcopy, ... */
#include <pthread.h> /*pour thread*/
#define MAXDATASIZE 256
int sd, /*descripteur de socket*/ nsd; /*[nouveau] descripteur de socket */
/*-------------------------------------------------*/ void *fonction (void *p_data) {
int rec; int continuer = 1; char bufrecv[MAXDATASIZE]; char bufsend[MAXDATASIZE];
while (continuer == 1) { strcpy(bufsend, "\n\nVoulez vous continuer taper 0 (non) / 1 (oui) ? ");
if (write(nsd, bufsend , sizeof(bufsend)) < 0) perror("write");
if ((rec= read(nsd, bufrecv, sizeof(bufrecv))) >0) { bufrecv[rec] = '\0'; sscanf(bufrecv, "%d", &continuer); }
}
/*fermeture du socket d'échange*/ close(nsd);
pthread_exit(NULL); return NULL;
} /*-------------------------------------------------*/
main(argc, argv) int argc; char **argv; {
int ladcour; /*longeur d'adresse courante d'un client*/
struct sockaddr_in adsock, /*structure d'adresse locale*/ adclcour; /*adresse client courant*/ struct hostent *hptr; /*les infos recuperee sur la machine hote*/ struct servent *sptr; /*les infos recuperee sur le service de la machine*/ char machine[MAXDATASIZE]; /*nom de la machine locale*/ char *prog; /*nom du programme*/
prog=argv[0]; /*recuperation du nom du programme*/ gethostname(machine, MAXDATASIZE); /*recuperation du nom de la machine*/
if ((hptr=gethostbyname(machine))==NULL) { perror(">> Machine inconnue"); exit(1); }
bcopy((char *)hptr->h_addr, (char *)&adsock.sin_addr, hptr->h_length); adsock.sin_family=hptr->h_addrtype; /*ou bien AF_INET*/ adsock.sin_addr.s_addr=INADDR_ANY; /*ou bien AF_INET*/
if ((sptr=getservbyname("irc", "tcp"))==NULL) { perror(">> Probleme de recuperation des infos sur le service"); exit(1); }
adsock.sin_port= htons(sptr->s_port);
if ((sd=socket(AF_INET,SOCK_STREAM, 0))<0) { perror(">> Probleme de creation du socket"); exit(1); }
int j = 1; if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &j, sizeof(j))<0) { printf("Can't set SO_REUSEADDR"); exit(1); }
if ((bind(sd,&adsock, sizeof(adsock)))<0) { perror(">> Probleme avec le binding"); exit(1); } printf("%d = Num-Port\n", ntohs(adsock.sin_port)); /*juste une trace*/ printf("Creation de la socket et attente d'une connexion...\n");
listen(sd,5);
pthread_t t; int code;
/*attente des connexions et traitement*/ while (1) {
srand (time (NULL));
ladcour=sizeof(adclcour); /*adclcour sera renseigne par accept via les infos du connect*/ /* nsd est une socket d'échange que l'on doit fermer dans la boucle while(1){}*/ if ((nsd = accept(sd, &adclcour, &ladcour))<0) { perror(">> Probleme sur l'accept"); exit(1); }
/*création des threads*/ code = pthread_create(&t, NULL, fonction, NULL); if (code < 0) perror("Creation du thread");
}
} /*du main*/
/************************************************************************
Nom du fichier : client.c
************************************************************************/ #include <stdlib.h> #include <stdio.h> #include <linux/types.h> /*pour les sockets*/ #include <sys/socket.h> #include <netdb.h> /*pour hostent,servent*/ #include <string.h> /*pour bcopy, ... */
#define MAXDATASIZE 256
int main(argc, argv) int argc; char **argv; { int sd, /* descripteur de socket */ lenght_buffer; /* longueur d'un buffer utilisé */ struct sockaddr_in adsock; /* structure d'adresse locale */ struct hostent *hptr; /* les infos recuperee sur la machine hote */ struct servent *sptr; /* les infos recuperee sur le service de la machine */
char buf[MAXDATASIZE]; char *prog; /* nom du programme */ char *host; /* nom de la machine distance */
prog = argv[0]; printf("\nCode client> %s\n", prog);
if (argc != 2) { perror(">> Il faut deux arguments au programme"); exit(1); }
host = argv[1]; printf("Code client --> machine = %s \n", host);
if ((hptr = gethostbyname(host)) == NULL) { perror(">> Pb pour la recup des infos du host"); exit(1); }
bcopy((char *)hptr->h_addr, (char *)&adsock.sin_addr, hptr->h_length); adsock.sin_family= AF_INET;
if ((sptr = getservbyname("irc", "tcp")) == NULL) { perror("Pb pour la recup des infos sur le service"); exit(1); } adsock.sin_port = htons(sptr->s_port);
printf("Code client--> numport = %d \n", ntohs(sptr->s_port));
if ((sd=socket(AF_INET,SOCK_STREAM, 0))<0) { perror(">> Probleme de creation du socket"); exit(1); }
if ((connect(sd, &adsock, sizeof(adsock)))<0) { perror(">> Pb de connection"); exit(1); }
char bufrecv[MAXDATASIZE]; char bufsend[MAXDATASIZE]; int rec;
int continuer = 1;
while(continuer == 1) {
if ((rec= read(sd, bufrecv, sizeof(bufrecv))) >0) { bufrecv[rec] = '\0'; printf("%s", bufrecv); }
scanf("%s", bufsend); if (write(sd, bufsend , sizeof(bufsend)) < 0) perror("write"); sscanf(bufsend,"%d",&continuer);
}
close(sd); exit(0);
} /*du main*/
|
|
vendredi 2 novembre 2007 à 13:20:27 |
Re : Passage d'une structure en paramètre d'un thread

ulukai44
|
Réponse acceptée !
personne ne peut m'aider pour mon problème  mat
|
|
Cette discussion est classée dans : fonction, thread, structure, partie, struct
Répondre à ce message
Sujets en rapport avec ce message
Thread paramètre [ par nicompx ]
Salut, Je démarre plusieurs thread qui exécute une fonction. Cette fonction reçoit en paramètre une structure. Si je passe l'adresse de la structure e
thread [ par elbok ]
salut pour tousj'ai besoin de créer un thread qui exécutera un fonction de prototype: void traitement (struct liste *l).je suis vraiment débutanant et
probleme structure et fonction [ par yanne1985 ]
salutj'ai lcode suivanttypedef struct{ int n; //......}essai;void miseZero(type **un_type){ (*un_type)->n=0;}int main(){ type *un_type;
Problème tableau structure [ par romauto750 ]
Bonjour à tous, J'ai un petit problème avec mon tableau de structure.
Arreter un thread [ par romauto750 ]
Bonjour à tous,J'aurai aimé savoir comment on faisait pour arrêter un thread. Je m'explique :J'ai une fonction qui appelle un thread, cependant le cod
Fonction de Thread sous win 98 [ par deck_bsd ]
Yop à tous,Dans un application qui devrait tourner sous win98 SE , j'ai besoin de créer un thread. Histoire d'être sur que cela fonctionne, j'ai été v
encore une histoire de threads... [ par jul39dole ]
Bonjour,J'ai quelques problèmes avec des threads, ou disons je ne sais pas quelle solution adoptée.Voilà le contexte :- j'ai un thread "Partie" qui ce
Erreur structure, redéfinition [ par unikaz ]
Bonjour à tous,Je me trouve (en tant que débutant) confronté à un problème que je n'arrive pas à résoudre (malgrès de longues recherches sur les forum
ecrire une structure dans un fichier [ par draluorg ]
Salut a tous,J'essai d'ecrire une structure dans un fichier mais apparement je dois mal m'y prendre...Voici mon code:#include typedef struct _MY_ST
Decompression JPEG [ par aziatedu13 ]
bonjour,Je cherche a faire une fonction de décompression en Jpeg to BMP.J'ai pris quelque exemple masi un problème me bloque.voici tout d'abord ma fon
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|