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 :

Des thread, des thread ....


Sujet :

Threads & Processus C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut Des thread, des thread ....
    Salut !

    j'ai un petit probleme. Je souhaite lancer un thread par l'intermediaire de la fonction threadCreate et en parallele une fenetre avec l'api windows.

    J'aimerai que mon thread ne s'execute que lorsque j'appuie sur le boutton ouvrir. J'ai donc placé mon thread comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    case WM_CREATE: 
                hOuvrir=CreateWindow("BUTTON","Ouvrir",WS_CHILD | WS_VISIBLE,20,428,90,20,hwnd,0,0,0); 
     
    case WM_COMMAND: 
                if( (HWND)lParam == hOuvrir) 
                { 
                     HANDLE hThread;
    	hThread = CreateThread(NULL,0,threadGraph,NULL,0,NULL);
                 }

    Ce thread doit lire une video en ouvrant une fenetre directX. Le probleme c'est qu'il se lance avant la fenetre principale sans que je n'ai appuyé. De plus, il se lance correctement la premiere fois et par la suite, a chaque fois que j'appuie, la fenetre ne s'ouvre qu'une fraction de seconde...

    Ou est ce que je me suis planté ??

    Merci d'avance !

    [balises code rajoutées par Fiquet, merci d'y penser la prochaine fois]

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut
    Salut

    Je crois tout simplement que tu as oublie un "break;"
    Je te rappelle la syntaxe du switch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    switch (expression)
    {
      case val1:
         //ce que tu veux faire si expression == val1
         break;
      case val2:
         //ce que tu veux faire si expression == val2
         break;
      default:
         //ce que tu veux faire dans les autres cas
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    Ok merci beaucoup ! c t tout bete...

    Malheureusement, mon second probleme persiste. Lorsque je le lance la premiere fois, tout se passe bien mais qd je rappuie sur le bouton ouvrir, la fenetre dirextX qui doit lire ma vidéo s'ouvre une demi seconde et le thread se termine... C'est peut etre un probleme de réinitialisation... non?

    Merci encore de votre précieuse aide !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    Pour préciser mon probleme, le thread lance des fonctions présent dans des dll. Pour terminer la lecture de la video, il faut normalement appuyer sur q + ENTER. Je ne peux pas modifier ca.

    Le probleme peut il venir de la ? Quel est le processus qui enclencherait cette séquence ?

  5. #5
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    c'est pas ça!
    en fait, ta thread lance la vidéo et la thread se termine
    ca veut dire que la lecture de la vidéo lance une thread aussi, mais comme ta 1e thread se termine, elle tue celle de la vidéo aussi.
    tu n'as qu'à tester!!!

    a la fin de ta thread entre cela:
    while(1)
    Sleep(1000);
    Colère et Haine mènent à la Puissance

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    dsl mais je pige pas trop. Du moin, je comprends que mon thread doit surement en lancer d'autre mais je vois pas ce que ca resoud ce while et ce sleep.. Ou est ce qu'il faut que je les mettent?
    Dans le thread ou apres que ma thread soit terminé.?

    Est ce que le rajout de ceci permettra de relancer mon thread correctement??

    Merci de l'aide !

  7. #7
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    si thread1 lance thread2 et que thread1 se termine, alors thread1 tue thread2.
    c'est pourquoi ta fenetre DX se ferme cash!

    si tu met le petit code a la fin de la fonction de ta thread, alors thread1 ne se terminera jamais, et thread2 pourra s'executer jusqu'au bout.
    malheureusement, il te faudra trouver un moyen de tuer thread1.
    parce que:
    si thread1 lance thread2 et que thread2 se termine, alors point barre! ca veut dire que thread1 n'est pas tué pas thread2.

    donc si j'étais toi, au lieu de lancer thread2 a partir d'une thread (comme thread1), je la lancerai à partir d'une fonction (ou procédure)
    Colère et Haine mènent à la Puissance

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    Oui mais plusieurs problemes se posent alors... La premier, si mon thread1 ne se termine pas, je ne quitte pas mon switch de ma fenetre principale et je suis bloqué... Du moin, c'est ce que j'observe sinon, j'aurais utilisé les fonctions suspendThread.

    Deuxiemement, Je n'ai aucun pouvoir sur la creation du thread2 car c'est une fonction qui le lance et dont le code m'est caché car j'utilise un framework particulier.

    Ce que je pensais, c'étais qu'en lancant mon thread et en la detruisant a chaque fois, elle se reinitialiserai et je n'aurais pas de probleme... Alors que la, la fenetre directX s'ouvre mais pas plus d'une demi seconde...

  9. #9
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    tu as du mal a percevoir la difference entre une thread et une fonction non?

    si tu lance ta thread comme le fais ton prog, il va directement à l'instruction suivante. Ton thread est executer a coté, c'est ce qu'on appelle un détachement de processus.

    si tu avait lancer une fonction, en effet, il aurait attendu la fin de la fonction pour aller a l'instruction suivante.

    thread2 tu l'appelles indirectement avec la fonction qui le lance.
    as-tu tenté de l'appeler directement au lieu de passer par une thread?

    si on en revient a ma premiere idée de mettre un while(1) Sleep(1000); dans ta 1e thread, ça voudrait dire que ta thread ne finie jamais. c'est ce qu'on appelle un démon, mais comme il ne fait rien d'autre qu'attendre, c'est un démon particulier qu'on appelle zombie.

    mais si durant la vie de ton zombie, tu as appelé ta fonction qui permet l'affichage vidéo (cad que tu as déclenché la thread2) alors, elle s'executera jusqu'au bout sans probleme.

    si tu ne fais pas de thread1 un zombie, ta fenetre DX sera créée, mais comme c'est thread2 (masquée), thread1 continuera de s'éxécuter jusqu'au bout. et elle arrivera à la fin et mourra. En mourrant une thread tue toutes ses filles, donc elle tuera thread2 (= ta fenetre DX). Ce qui provoque bien son affichage pour même pas 1/2 secondes.

    si tu comprends toujours pas, demande moi un schéma. je ne me lasserai pas de t'expliquer de mieux en mieux
    Colère et Haine mènent à la Puissance

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    Ok c'est bon j'ai compris tes explications. Je te remerce encore de passer du tmp a m'expliquer.

    je suis d'accord avec toi pour l'utilisation d'un thread. Le probleme est qu'une fois que mon thread est lancé, mon prog ne fait plus grand chose tant qu'il est pas fini. Ma fenetre principale ne répond plus...

    La methode que tu m'a conseillé ne fonctionne pas et utliser directement la fonction sans passer par un thread n'arrange pas la chose non plus... Je pense que le probleme vient du framework que j'utilise. Lorsque je copie deux fois le code dans la fonction que je lance pour lire la video, le meme phenomene se produit... c'est bizarre.

    C'est vraiment sympa de m'aider.

  11. #11
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    si dans l'execution de thread2 (que tu ne peut pas voir a moins d'avoir les sources), il n'y a pas de sleep dans la boucle d'affichage, c'est normal que rien d'autre ne réponde.

    Le processeur execute le code de chaque thread, mais pour dire au processeur qu'il peut s'occuper des autres threads, on utilise un Sleep. Dans le cadre de microsoft, je ne suis pas certain que ce soit la bonne fonction, mais dans la plupart des autres langages, c'est bien un sleep qu'on utilise:
    - sleep(int sec) dans prog systeme en C sous linux
    - SDL_Delay(int millisec) pour l'API SDL
    - Thread.Sleep(int millisec) en Java

    et bien d'autres

    normalement si le framework a été conçu par une entreprise réputée (Sun, MS, ...), il est quasiment impossible qu'ils aient oublié le Sleep.
    Après, si c'est le petit frère de ton voisin qui la fait... il vaut mieux vérifié.
    Perso, j'écrirai moi-même ma fonction permettant la création d'une fenêtre DX et qui ferait le rendu de la vidéo.
    Bon courage
    Colère et Haine mènent à la Puissance

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    Ok merci pour les conseils !

    C'est pas le petit frere de mon voisin mais j'ai pas trop cofiance qd meme !lol

    Encore merci ! Je vais essayer de me sortir de ca ! Je te tiens au courant de mon avancement !

    A bientot

Discussions similaires

  1. Ensemble des réels, des complexes, des entiers naturels
    Par ANOVA dans le forum Mathématiques - Sciences
    Réponses: 5
    Dernier message: 08/10/2009, 12h58
  2. Réponses: 2
    Dernier message: 28/06/2007, 18h00
  3. Réponses: 19
    Dernier message: 20/12/2006, 10h15
  4. [MySQL] Utilisation des fonctions des récupérations des données
    Par Konrad Florczak dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/10/2006, 15h17
  5. Gestion des majuscules des miniscules des accent
    Par issam16 dans le forum Access
    Réponses: 2
    Dernier message: 13/07/2006, 14h21

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