Accueil > Forum > > > > Threads, fonction et mutex ?
Threads, fonction et mutex ?
mercredi 5 mai 2010 à 12:14:07 |
Threads, fonction et mutex ?

Adict
|
bonjour à tout le monde
dans mon projet de créer un tchat il faut que j'applique sur le client un thread qui exécute une autre fonction qui doit lire les messages.
Hors je doit mettre la fonction en dehors de "main" et la fonction pour lire les messages ne reconnais plus aucune variables ni même les sockets.
Comment puis-je faire ? utiliser les mutex ? de plus je ne sais pas trop comment mettre en place cela surtout que le thread gère une boucle infinie.
voila déjà se que j'ai fait pour le moment. (je vous ais mis seulement les parties qui posent problème car sinon c'est trop long)
Code C/C++ : void* message(void* data);
int main(int argc, char *argv[])
{
/*
..............Variables et socket................
*/
pthread_t thread;/* crée un thread */
pthread_create(&thread, NULL, message, NULL);/* Permet d'exécuter le fonction message en parallèle */
while (1)
{ /* début boucle wirthe */
system("CLS");
printf("\n%s : ", pseudo);
fgets(chaine, sizeof chaine, stdin);
clean(chaine);
snprintf(buffer, sizeof(buffer), "%s : %s \n", pseudo, chaine);
send(s, buffer, strlen(buffer), 0);
if ( strcmp( chaine, "exit" ) == 0 )
{
goto fin; /* je sais goto c'est pas bien mais c'est juste pour faire les testes en attendant :p */
}
} /* fin boucle writhe */
pthread_join(thread, NULL);
/*
.........fermeture socket..............
*/
return o;
}
void* message(void* data); /* Fonction de réception de message */
{
while(1) /* boucle de réception des messages */
{
memset(buffer, '\0', sizeof(buffer));
n = recv(s, buffer, sizeof(buffer) - 1, 0);
printf("%s\n",buffer);
}
} /* Finc de la fonction de réception des messages */
Merci.
________________________________________________________________
j'ai 16 ans et j'aime l'informatique, surtout les programmes 
|
|
mercredi 5 mai 2010 à 13:37:24 |
Re : Threads, fonction et mutex ?

fregolo52
|
tu dois passer la socket en paramètre de ton thread :
dans main :
Code C/C++ : SOCKET s;
// init sock
...
pthread_t thread;
pthread_create(&thread, NULL, message, (void *)&s);
dans ton thread :
Code C/C++ : void* message(void* data) {
SOCKET *s = (SOCKET *)data; // attention c'est un pointeur
....
}
|
|
mercredi 5 mai 2010 à 21:14:06 |
Re : Threads, fonction et mutex ?

Adict
|
Merci, ça marchais presque.
alors voila la fonction crée
Code C/C++ : void* message(void* data) /* Fonction de réception de message */
{
SOCKET *s = (SOCKET *)data;
char *buffer;
int *n;
while(1) /* boucle de réception des messages */
{
memset(buffer, '\0', sizeof(buffer));
n = recv(s, buffer, sizeof(buffer) - 1, 0);
printf("%s\n",buffer);
}
} /* Finc de la fonction de réception des messages */
erreur:
C:\Dev-Cpp\chatbox_real\Client\main.c In function `message':
337 C:\Dev-Cpp\chatbox_real\Client\main.c [Warning] passing arg 1 of `recv' makes integer from pointer without a cast
337 C:\Dev-Cpp\chatbox_real\Client\main.c [Warning] assignment makes pointer from integer without a cast
pour pouvoir faire SOCKET *s = (SOCKET *)data; il faut donc ajouter "&s" à la place de NULL dans le thread. Comment ajouter char *buffer; et
int *n; ?
malgré ces erreurs le client compile mais je ne voit pas la chaine que j'écris mais elle est bien envoyé au serveur. (je pense que c'est le faite que j'utilise des boucle infini non ? )
________________________________________________________________
j'ai 16 ans et j'aime l'informatique, surtout les programmes 
|
|
jeudi 6 mai 2010 à 08:25:46 |
Re : Threads, fonction et mutex ?

fregolo52
|
si tu veux passer plusieurs paramètres il va falloir les mettre dans une structure et passer cette structure au thread.
s est un pointeur, donc il ne faut pas oublier le '*' :
recv(*s, .....);
|
|
jeudi 6 mai 2010 à 17:59:11 |
Re : Threads, fonction et mutex ?

Adict
|
salut alors j'ai fait la structure:
Code C/C++ : struct MaStructure
{
SOCKET *s;
char *buffer;
int *n;
};
mais je n'ai pas réussie en l'ajouter dans les paramètre du thread  j'avais essayé de cette façon sans résulta.
Code C/C++ : pthread_create(&thread, NULL, message, (struct *)&MaStructure);
j'ai 16 ans et j'aime l'informatique, surtout les programmes 
|
|
vendredi 7 mai 2010 à 10:11:10 |
Re : Threads, fonction et mutex ?

fregolo52
|
c'est pas beau ce que tu as fait !!!
un truc simple, mais y'a bcp mieux.
Code C/C++ : struct MaStructure
{
SOCKET s;
char buffer[mets ici un taille max];
int n;
};
Code C/C++ :
MaStructure datastruct;
datastruct.s = ...;
....
pthread_create(&thread, NULL, message, (struct *)&datastruct);
Code C/C++ : void* message(void* data) /* Fonction de réception de message */
{
MaStructure *pStruct = (SOCKET *)data;
while(1) /* boucle de réception des messages */
{
memset(pStruct->buffer, '\0', sizeof(pStruct->buffer)); // là j'ai un doute sur le sizeof
pStruct->n = recv(pStruct->s, pStruct->buffer, sizeof(pStruct->buffer) - 1, 0);
printf("%s\n",pStruct->buffer);
}
} /* Finc de la fonction de réception des messages */
|
|
vendredi 7 mai 2010 à 11:55:57 |
Re : Threads, fonction et mutex ?

Adict
|
ok mais j'ai 2 questions.
est-ce que je peut placer
Code C/C++ : MaStructure datastruct;
datastruct.s = ...;
n'importe où dans main ? ou ça a une place bien précise ?
et que dois-je mettre à la place des trois petit point ?
j'avais pensé à ça: datastruct.s = *((struct MaStructure*)data);
Mais je pense pas que ça fonctionnera
Merci de m'aider en tout cas :)
j'ai 16 ans et j'aime l'informatique, surtout les programmes 
|
|
vendredi 7 mai 2010 à 12:20:00 |
Re : Threads, fonction et mutex ?

fregolo52
|
bah tu dois placer la déclaration où tu veux mais bien sûre avant le while.
non, dans le main, dans datastruct.s tu mets s (le même s du send de la boucle while) :
datastruct.s = s;
mais en relisant ton 1er message, je ne vois pas l'intérêt de la structure.
ton main et ton thread message peuvent (et meme, doivent) gérer leur propre buffer. Vu que chacun fait son printf.
|
|
samedi 8 mai 2010 à 15:00:19 |
Re : Threads, fonction et mutex ?

Adict
|
ok donc je doit mettre ensuite par exemple
Code C/C++ : MaStructure datastruct;
datastruct.s = s;
datastruct.b = buffer;
datastruct.n = n;
pour gérer leur propre buffer donc sur le client on envoi la chaine + pseudo dans le buffer qui s'envoie au serveur
le serveur lit le buffer et le renvoi au client mais j'avais pensé faire comme ça: (sa compile mais je ne sais pas si ça marche car j'ai pas terminer les structures)
Serveur
Code C/C++ : while(1)
{
memset(buffer, '\0', sizeof(buffer));
n = recv(s_client, buffer, sizeof(buffer) - 1, 0);
printf("%s\n",buffer);
strcpy(buff, ("%s\n", buffer)); /*copi dans buff le buffer */
send(s_client, buff, (int)strlen(buff), 0); /*envoi le buff au client */
}
Client (sans les structures)
Code C/C++ : while(1) /* boucle de réception des messages */
{
memset(buff, '\0', sizeof(buff)); // là j'ai un doute sur le sizeof
n = recv(s, buff, sizeof(buff) - 1, 0);
printf("%s\n",buff);
}
j'ai 16 ans et j'aime l'informatique, surtout les programmes 
|
|
dimanche 9 mai 2010 à 15:23:12 |
Re : Threads, fonction et mutex ?

Adict
|
Bon je crois que je suis un peu perdu
je récapitule.
j'ai fait le structure
Code C/C++ : struct recep
{
SOCKET *s; //je met des pointeurs car elles sont déjà dans main
int *n;
};
je ne vois franchement pas à quoi ces commandes sèvrent
Code C/C++ : MaStructure datastruct;
datastruct.s = ...;
....
voici le code:
Code C/C++ : #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <string.h>
#include <winsock2.h>
#include <pthread.h>
static void purger(void)
{
int c;
while ((c = getchar()) != '\n' && c != EOF)
{}
}
static void clean (char *chaine)
{
char *p = strchr(chaine, '\n');
if (p)
{
*p = 0;
}
else
{
purger();
}
}
/*------------------------------------------*/
static void purgera(void)
{
int d;
while ((d = getchar()) != '\n' && d != EOF)
{}
}
static void cleaner (char *pseudo)
{
char *q = strchr(pseudo, '\n');
if (q)
{
*q = 0;
}
else
{
purgera();
}
}
void* message(void* data);
int main(int argc, char *argv[])
{
char chaine[5000];
char pseudo[30];
/*
----------------------------------------------------
*/
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
fprintf(stderr, "La fonction WSAStartup a echoue.\n");
else
{
SOCKET s;
s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
fprintf(stderr, "La fonction socket a echoue.\n");
else
{
SOCKADDR_IN server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(5050);
memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
if (connect(s, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)
fprintf(stderr, "La fonction connect a echoue.\n");
else
{
char buffer[1024];
int n;
n = recv(s, buffer, sizeof(buffer) - 1, 0);
if (n != SOCKET_ERROR)
{
buffer[n] = '\0';
printf("%s", buffer);
/*-----------------------------------------------*/
struct recep
{
SOCKET *s;
int *n;
};
system("CLS");
printf("Choisissez un pseudo visible par les autre membres.\n\n");
printf("choix ? ");
fgets(pseudo, sizeof pseudo, stdin);
clean(pseudo);
printf("\n\nBienvenu %s\n", pseudo);
getch();
system("CLS");
/*-----------------------------------------------*/
pthread_t thread;/* crée un thread */
pthread_create(&thread, NULL, message, (void *)&datastruct);/* Permet d'exécuter le fonction message en parallèle, une erreur ici */
int compteur;
for (compteur = 0 ; compteur < 2 ; compteur++) //obligé d'employer une boucle ici car la copie du buffer ne marhcait pas
{
snprintf(buffer, sizeof(buffer), "user: %s, rejoint la conversation.", pseudo);
send(s, buffer, strlen(buffer), 0);
}
while (1)
{ /* début boucle wirthe */
printf("\n%s : ", pseudo);
fgets(chaine, sizeof chaine, stdin);
clean(chaine);
snprintf(buffer, sizeof(buffer), "%s : %s ", pseudo, chaine);
send(s, buffer, strlen(buffer), 0);
if ( strcmp( chaine, "exit" ) == 0 )
{
goto fin; /* je sais goto c'est pas bien mais c'est juste pour faire les testes en attendant :p */
}
} /* fin boucle writhe */
pthread_join(thread, NULL);
fin:
send(s, "Au revoir\n", (int)strlen("Au revoir\n"), 0);
}
shutdown(s, SD_SEND);
}
closesocket(s);
}
WSACleanup();
}
return 0;
}
void* message(void* data) /* Fonction de réception de message */
{
char buff[1024];
recep *pStruct = (SOCKET *)data;
while(1) /* boucle de réception des messages */
{
memset(buff, '\0', sizeof(buff));
pStruct->n = recv(pStruct->s, buff, sizeof(buff) - 1, 0);
printf("%s\n",buff);
}
} /* Finc de la fonction de réception des messages
les erreurs:
C:\Dev-Cpp\chatbox_real\Client\main.c In function `main':
275 C:\Dev-Cpp\chatbox_real\Client\main.c `datastruct' undeclared (first use in this function)
(Each undeclared identifier is reported only once for each function it appears in.)
C:\Dev-Cpp\chatbox_real\Client\main.c In function `message':
336 C:\Dev-Cpp\chatbox_real\Client\main.c `recep' undeclared (first use in this function)
336 C:\Dev-Cpp\chatbox_real\Client\main.c `pStruct' undeclared (first use in this function)
|
|
Cette discussion est classée dans : buffer, message, fonction, chaine, thread
Répondre à ce message
Sujets en rapport avec ce message
Rechercher une chaine de caractere [ par Johjo ]
Il n'y aurait pas une fonction qui me permette de retrouver une chaine de caractere dans une autreparce moi, je trouve rien du tout :(Si quelqu'un pou
Réception de message à partir de la fonction Recvfrom [ par Roulet ]
remplacer un bout de chaine d'une chaine par un autre bout de chaine [ par loicus ]
En pratique, j'aimerais bien avoir un truc genre :chaine4=replace("a remplacer",chaine1,"c'a y, c'ets remplacé");Mais je ne sais pas quelle fonction u
PROBLEME pour retourner un char* a partir d'un fichier [ par kobee12 ]
Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang
PROBLEME pour retourner un char* apres recuperation d'une chaine(sscanf) d'un fichier [ par kobee12 ]
Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang
Problème de code en c++ (fonction itoa) [ par mimyne ]
voila g le code suivant:void Resultat_Clicked(Object* pSender, EventArgs* pArgs){ int operation = 5; char* chaine[2]; if (pSender == Btnres) { { ito
exécuter une fonction en arrière plan [ par sena ]
Bonjour,kelk'un aurait - il un exemple simple d'exécution d'une fonction en arrière plan !Car la solution 1 ne fonctionne évidemment pas, car la fonct
timer dans des threads [ par z3bul0n ]
Comment faire pour gérer un SetTimer créé dans un thread sans utiliser de fonction : j'aimerai recevoir le WM_TIMER à chaque fois qu'il y en a un dans
explode [ par thebigbang ]
bonjour à tous,Je cherche une fonction C++ qui permettrait de créer des tableaux de chaine à partir d'une autre chaine que l'on aurait découpée en fon
explode [ par thebigbang ]
bonjour à tous,Je cherche une fonction C++ qui permettrait de créer des tableaux de chaine à partir d'une autre chaine que l'on aurait découpée en 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
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
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
|