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 ?