Thread bloquant [Résolu]

cs_Rankin 52 Messages postés lundi 29 mars 2004Date d'inscription 27 avril 2010 Dernière intervention - 31 août 2009 à 11:43 - Dernière réponse : cs_Rankin 52 Messages postés lundi 29 mars 2004Date d'inscription 27 avril 2010 Dernière intervention
- 31 août 2009 à 17:39
Salut à tous,

Je suis en train de développer un petit programme qui utilise les tubes nommés. Ayant rencontré des soucis en voulant rendre les I/O non bloquantes, j'ai décidé d'exporter le code du serveur dans un thread.
Le problème, c'est que mon application est toujours bloquée sur le ConnectNamedPipe().

Je pourrais peut-être chercher de ce côté, mais comme j'ai déjà rencontré ce problème de thread bloquant sur un autre de mes programmes, j'aimerais autant savoir où est-ce que je commets une erreur.

Voici le code du thread :

DWORD thread()
{
HANDLE hPipe = CreateNamedPipe("\\\\.\\pipe\\monpipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 1, 256, 256, 0, NULL);
if (hPipe != INVALID_HANDLE_VALUE)
{
bool recv;
char * buffer = new char [256];
DWORD bytesRead;
while (true)
{
if (ConnectNamedPipe(hPipe, NULL))
{
recv = ReadFile (hPipe, buffer, 256, &bytesRead, NULL);

buffer[bytesRead] = '\0';
printf("Reçu : %s\n",buffer);

if (!recv || bytesRead == 0)
break;

FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
}
}
delete[] buffer;
CloseHandle(hPipe);
}
else
printf("Creation du pipe failed %ld",GetLastError());
}

et le main qui l'appelle :

int main()
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread(), 0, 0, 0);
while (true)
{
cout<<"Je suis dans la main boucle"<<endl;
Sleep(1000);
}
return 0;
}

Une fois le thread créé, le message du main ne s'affiche jamais... J'ai essayé de réduire la priorité du thread, mais même au minimum ça ne change rien (d'ailleurs le flag CREATE_SUSPENDED même sans resume ne sert à rien chez moi, le thread est quand même lancé...)

J'ai cherché des réponses un peu partout, mais j'ai l'impression que ce problème est très courant. Je ne peux quand même pas croire qu'il s'agisse uniquement d'une mauvaise gestion des threads sous Windows ?
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
cs_Chouchou182 252 Messages postés vendredi 13 juin 2003Date d'inscription 25 avril 2011 Dernière intervention - 31 août 2009 à 17:24
3
Merci
Salut,

Les parenthèses de thread() dans l'appel de CreateThread me font une drôle d'impression; que se passe-t-il si tu les enlèves ?

Si le code du thread était du bon type, il n'y aurait pas besoin du cast:

DWORD WINAPI thread(LPVOID lpParam) {...} d'après ce que je peux trouver sur MSDN.

C'est aussi bizarre qu'il n'y ait pas de return dans le code d'une fonction sensée renvoyer un DWORD...

Bonne prog,

Merci cs_Chouchou182 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de cs_Chouchou182
cs_Rankin 52 Messages postés lundi 29 mars 2004Date d'inscription 27 avril 2010 Dernière intervention - 31 août 2009 à 17:39
0
Merci
Merci pour ta réponse, j'ai corrigé ce que tu m'as dit (suppression des parenthèses, suppression du cast, définition du thread en DWORD WINAPI thread(LPVOID lpParam) et un petit return à la fin du code.

Et ça marche. Le pire, c'est que j'ai commencé à travailler de cette façon à partir du MSDN, que j'avais des erreurs, et à force de refaire je me suis éloigné du modèle qui marche... le "thread" était exécuté comme une simple fonction.

Merci en tout cas pour tes éclaircissements !
Commenter la réponse de cs_Rankin

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.