IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

Threads et named pipes


Sujet :

Threads & Processus C++

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Par défaut Threads et named pipes
    Bonjour à tous,

    Tout d'abord je développe mon projet sous Windows et donc à l'aide des fonctions CreateThread, WriteFile, CreateFile, etc

    Je souhaite lancer une commande DOS (à l'aide de system() donc) qui va lire sur une named pipe des données (cette action est "bloquante" pour le reste du programme) et s'exécute une fois toutes les données reçues.

    Si je lance la commande system() avant l'envoi des données sur la named pipe, rien ne se passera car le programme restera bloqué sur la ligne system().
    Si je lance la commande system() après l'envoi des données sur la named pipe, je reçois une erreur (GetLastError: 536: ERROR_PIPE_LISTENING - Waiting for a process to open the other end of the pipe).

    J'utilise donc un Thread pour lancer ma commande system, et avec le bon timing et la commande Sleep(), j'arrive à lancer les deux plus ou moins en même temps.
    De plus, le projet tournera sur d'autres machines que la mienne, avec différents OS, donc avec des temps d'exécution différents j'imagine.

    Vous l'aurez compris, la technique est plus que bancale, et j'aimerais savoir (pas trop trouvé sur le net), s'il est possible de lancer deux tâches simultanément, ou s'il est possible d'exécuter un Thread à un temps t précis.

    Si vous avez d'autres idées je suis aussi preneur!

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,
    Pour ce que tu veux faire, tu devrais utiliser des mutex ou des sémaphores.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    thread 1 :
    - libérer le mutex A/rendre un jeton A
    - prendre le mutex B/prendre un jeton B
    //ton_code1
     
    thread 2 :
    - libérer le mutex B/rendre un jeton B
    - prendre le mutex A/prendre un jeton A
    //ton_code2
    Ainsi, l'exécution de ton_code1 et de ton_code2 démarrera en même temps.

    Sinon d'après ton message d'erreur, j'ai l'impression que tu utilise mal ton pipe, pourrais-tu nous montrer ton code?

  3. #3
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Peut-être utiliser les outils récents du C++11 pour la gestion des threads.
    Voir par exemple l'ouvrage d'Anthony Williams C++ Concurrency in Action et différents sites sur la toile, comme :
    http://solarianprogrammer.com/2011/1...read-tutorial/

    http://www.baptiste-wicht.com/2012/0...start-threads/

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Par défaut
    Merci pour vos réponses je vais me renseigner sur les mutex et les sémaphores et regarder de plus près tes liens ptyxs.

    En attendant je peux vous mettre mon code pas de soucis.

    Voici le corps de ma fonction, où j'appelle différentes méthodes que j'ai créé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    pipe_name = "\\\\.\\pipe\\pgsqlrestore";
     
    // Socket creation and connection
    // Reads data on the Socket
    error_test = RecvFromSocket(restore_data);
    if(error_test != 0)
    {
    	printf("Error during the database restore\n");
    	return 12;
    }
     
    // Named Pipe creation
    pipe = CreateNamedPipe(
    	pipe_name, // name of the pipe
    	PIPE_ACCESS_DUPLEX, // Read/Write
    	PIPE_TYPE_BYTE, // send data as a byte stream
    	1, // only allow 1 instance of this pipe
    	0, // no outbound buffer
    	0, // no inbound buffer
    	0, // use default wait time
    	NULL // use default security attributes
    );
    if(pipe == NULL || pipe == INVALID_HANDLE_VALUE)
    {
    	printf("Failed to create the named pipe '%s'!\n", pipe_name);
    	CloseHandle(pipe);
    	return 6;
    }
     
    // Creation of the execute_string
    pgrestore_instance_string = (char*)malloc(27+strlen(ConSQL->repertory)+strlen(ConSQL->login)+strlen(ConSQL->instance)+strlen(pipe_name));
    if(pgrestore_instance_string == NULL)
    {
    	printf("Memory error!\n");
    	return 1;
    }
    sprintf(pgrestore_instance_string, "\"\"%spsql.exe\" -U %s -p %s -f \"%s\"\"", ConSQL->repertory, ConSQL->login, ConSQL->instance, pipe_name);
     
    // Execute the mysqlrestore using a thread
    thread = CreateThread(NULL, 0, Thread_PGSQLRestore, (LPVOID)pgrestore_instance_string, 0, NULL);
    if( thread == NULL )
    {
    	printf("Failed to launch the PGSQLRestore Thread!\n");
    	return 8;
    }
     
    Sleep(600); // Ici le timing en question dont je vous parlait
     
    // Write the restore_data on the named pipe
    result = WriteFile(
    	pipe, // handle to our generic write pipe
    	restore_data, // data to send
    	strlen(restore_data), // length of data to send (bytes)
    	&numBytesWritten, // will store actual amount of data sent
    	NULL // not using overlapped IO
    );
    if(!result)
    {
    	printf("Error while sending data to the named pipe: %d\n", GetLastError());
    	CloseHandle(pipe);
    	return 2;
    }
     
    CloseHandle(pipe);
    free(pgrestore_instance_string);
    Pour ne pas vous "flooder" de code, la méthode RecvFromSocket fonctionne très bien et récupère le texte envoyé sur un Socket (correspondant ici à mon dump PostgreSQL).
    La pgrestore_instance_string est bien construite et effectue une restauration du cluster PostgreSQL précisé en paramètre en lisant le dump sur la named pipe \\.\pipe\pgsqlrestore.
    Et enfin mon thread ne consiste qu'à lancer la commande system(pgrestore_instance_string).

    Voilà, si vous y voyez des failles ou si vous avez des conseils pour améliorer ça, je suis preneur
    En attendant, de la lecture m'attends!

Discussions similaires

  1. Named Pipes - event
    Par Brosske dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 09/11/2007, 11h26
  2. Named Pipes sur vista
    Par Tosh dans le forum C++
    Réponses: 1
    Dernier message: 18/07/2007, 21h28
  3. Create named pipe
    Par albanovisch dans le forum C++
    Réponses: 3
    Dernier message: 06/07/2007, 09h07
  4. Probleme de threads et de pipes
    Par Marc san dans le forum C
    Réponses: 7
    Dernier message: 22/02/2006, 21h32
  5. [THREAD] probleme de pipe
    Par mehdiyassin dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 01/07/2004, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo