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

DirectX Discussion :

Problème multithreading Directx


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut Problème multithreading Directx
    Bonsoir tout le monde,

    Alors j'ai un gros problème et je suis débutant donc j'ai du mal à le résoudre tout seul. Je suis entrain de créer une application où on peut voir plusieurs vidéos en même temps (jouant en parallèle).

    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
     
    for(x=0;x<nbVideos;x++)
    {
       v[x] = new Video("videos/video.avi", false);
       v[x].Owner = panel[x];
       v[x].Ending += new EventHandler(v_Ending);
       t[x] = new Thread(new ParameterizedThreadStart(play));
       t[x].Start((Object)v[x]);
    }
     
    void play(Object v)
    {
     
                ((Video)v).Play();
     
    }
     
    private void v_Ending(Object v, System.EventArgs e)
    {   
                try
                {
                    ((Video)v).Stop();
                    ((Video)v).Play();
                }
                catch { }
    }
    Pour cela j'utilise le multithreading comme vous pouvez le voir mais quand j'ai comparé les ressources avec et sans multithreading, il n'y a pas de différences. Savez vous pourquoi ? Si oui, une solution ?


    PS: je précise que je travaille sur Visual C# express 2008 et que j'utilise le module AudioVideoPlayback de Directx (j'ai Directx 11).

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    Citation Envoyé par hedisurfer Voir le message
    j'ai comparé les ressources avec et sans multithreading, il n'y a pas de différences. Savez vous pourquoi ? Si oui, une solution ?


    PS: je précise que je travaille sur Visual C# express 2008 et que j'utilise le module AudioVideoPlayback de Directx (j'ai Directx 11).

    qu'appelle tu comparer les ressources? à quoi t'attendais tu?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut
    En fait j'ai pas comparé les ressources mais plutôt la vitesse d'excécution on va dire (tu as raison c'est faux ce que j'ai dit). Normalement le multithreading il est pas censé accélérer le programme (en mettant en parallèle des tâches) ? J'ai entendu parler du parallélisme aussi, quelle est la différence ? Y'a-t-il quelque chose à changer dans mon code pour que le multithreading marche ?

  4. #4
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    quand tu lance ton programme, lance aussi le gestionnaire de taches (ctrl+shift+echap) et regarde dans performances si le pourcentage d'utilisation est au max et si dans chacun des graphs représentant un "coeur" tout est au max (ou augmente).

    si oui -> ton application utilise effectivement le multithreading

    si non -> il doit y avoir un problème dans ton lancement de nouveaux thread

    attention aussi, directx (< 11) n'est pas fait pour le multithreading, tout appel au device doit rester cantonné à un seul et unique thread.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut
    Bon,
    Pour le multithreading, tu nage un peu loin là ... Pour pouvoir lancer deux codes en parallèles, il te faut lancer autant de threads que de bouts de codes (dans ton ceas des videos);
    Aussi, gérer les taches lancées en parallèle n'est pas une tache aisée, il te faut prendre en considération le problème de la section critiques, bien maitriser les semaphores et tout ...
    Donc, essaye de pas trop te prendre la tête avec ça ^^

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut
    Citation Envoyé par stardeath Voir le message
    attention aussi, directx (< 11) n'est pas fait pour le multithreading, tout appel au device doit rester cantonné à un seul et unique thread.
    J'ai directx11 et donc normalement il gère le multithread.

    Pour pouvoir lancer deux codes en parallèles, il te faut lancer autant de threads que de bouts de codes (dans ton ceas des videos);
    Je ne sais pas si t'as bien vu, mais j'utilise: for(x=0;x<nbVideos;x++) et puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    t[x] = new Thread(new ParameterizedThreadStart(play));
    t[x].Start((Object)v[x]);
    donc je créé plusieurs threads après la méthode "play" est la même pour toutes les vidéos.

    il te faut prendre en considération le problème de la section critiques, bien maitriser les semaphores et tout ...
    Pas besoin ici car chaque vidéo a son thread et donc les vidéos ne sont pas partagées entre les Threads et en plus je les prends en paramètre grâce à des threads paramétrisés (pas de cross threading).

  7. #7
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    Citation Envoyé par hedisurfer Voir le message
    J'ai directx11 et donc normalement il gère le multithread.
    c'est pas le fait de l'avoir qui fait ou pas que ça utilise le multithread, c'est le fait de créer un device dx11 et d'utiliser les buffers de commandes et tous les mécanismes de dx11.

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Citation Envoyé par hedisurfer Voir le message
    Bonsoir tout le monde,

    Alors j'ai un gros problème et je suis débutant donc j'ai du mal à le résoudre tout seul. Je suis entrain de créer une application où on peut voir plusieurs vidéos en même temps (jouant en parallèle).

    ...

    Pour cela j'utilise le multithreading comme vous pouvez le voir mais quand j'ai comparé les ressources avec et sans multithreading, il n'y a pas de différences. Savez vous pourquoi ? Si oui, une solution ?


    PS: je précise que je travaille sur Visual C# express 2008 et que j'utilise le module AudioVideoPlayback de Directx (j'ai Directx 11).
    Tu ne vois pas de différences parce que la lecture d'une video est déjà un processus multithreadé...

    En fait, créer des threads comme tu le fais n'a aucun intérêt. Tout au plus, tu évites un blocage de l'interface graphique pendant le chargement et le lancement de la vidéo (selon le format vidéo utilisé, ce sera un blocage de quelques millisecondes à quelques secondes).

    J'aimerais que tu m'expliques ce qui te fais penser que ça va améliorer les performances d'utiliser des threads ?

    On utilise des threads pour effectuer plusieurs tâches en simultané. L'utilisation de thread ajoute des instructions au processeur (changement de contexte, etc...). Donc par définition, ajouter des instructions au processeur diminue les performances. Ou alors faut m'expliquer...


    En ce qui concerne le lancement de plusieurs vidéos en même temps :

    Lances une vidéo et regardes la charge du processeur. Imaginons, elle est de 20%.
    Lances une deuxième vidéo et regardes la charge du processeur. Tu verra qu'elle aura doublée et sera de 40%.

    Donc pour 5 vidéos, ton processeur sera à 100%.

    Je pense mais c'est à vérifier, l'API .net AudioVideoPlayback utilise l'accélération matérielle, lorsqu'elle est disponible.

    Avec cette API, une chose qui pourrait te permettre d'améliorer les performances, ce serait d'utiliser des codecs performants...

    PS : quel est le format des vidéos utilisé (.wmv, .mpeg, .avi...) ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut
    Bonjour,

    C'est des vidéos avi. mais de petite taille (3seconces) et de petite résolution (320x240). Est-ce que les codecs utilisent le cpu ? Dois-je installer sur mon ordi un codec performant pour avi ? J'ai déjà VLC (dernière version) alors normalement cela ne devrait pas poser de problèmes non ?

    J'utilise le multithreading pour paralléliser le calcul de chaque vidéo mais si tu me dis que chaque vidéo est sur un thread alors c'est bon (de toute façon même en le virant c'est toujours pareil). D'ailleurs y-a-t-il une différence entre parallélisation de tâches et mulithreading ?

    Je voulais savoir aussi si les events s'executent sur des threads à part ou pas ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut
    Pour votre question sur l'utilisation du CPU, elle augmente effectivement en rajoutant des vidéos (je l'avais confirmé dans les autres posts).

  11. #11
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Citation Envoyé par hedisurfer Voir le message

    J'utilise le multithreading pour paralléliser le calcul de chaque vidéo mais si tu me dis que chaque vidéo est sur un thread alors c'est bon (de toute façon même en le virant c'est toujours pareil). D'ailleurs y-a-t-il une différence entre parallélisation de tâches et mulithreading ?
    Oui, tu confonds multithreading et parallélisation. Voir mon message précédent.

    Pour résumé :

    parallélisation = multiprocesseur
    multithreading = plusieurs tâches en même temps.

    PS : mais on pourrait compliquer avec du multithreading parallélisé...

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut
    Bonjour,

    Normalement les bons codecs sont installés car j'arrive à lire les vidéos d'une façon fluide sur la plupart des lecteurs que j'ai. Mon processeur aussi n'est pas si vieux que ça (il date de 2006 et c'est un T2500). Existe-t-il une librairie pour tirer profit du GPU dans le cas où c'est un problème du CPU ?

  13. #13
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Combien de vidéos simultanées essaies-tu de lire ?

  14. #14
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 528
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 528
    Par défaut
    Citation Envoyé par moldavi Voir le message
    Bonjour.

    Tu ne vois pas de différences parce que la lecture d'une video est déjà un processus multithreadé...
    Absolument !
    J'appuie à 100% tes explications
    Il n'est pas pertinent de créer des threads pour lire des vidéos.
    Le résultat risque d'être nul et de trop solliciter le CPU

    Citation Envoyé par hedisurfer Voir le message
    J'utilise le multithreading pour paralléliser le calcul de chaque vidéo mais si tu me dis que chaque vidéo est sur un thread alors c'est bon (de toute façon même en le virant c'est toujours pareil). D'ailleurs y-a-t-il une différence entre parallélisation de tâches et mulithreading ?

    Je voulais savoir aussi si les events s'executent sur des threads à part ou pas ?
    Moldavi a parfaitement bien tout expliqué.
    En interne si tu lis une vidéo le sytème passe éventuellement par la création d'un ou de threads..
    tu écris vouloir utiliser le multithreading pour paralléliser les calculs mais le code déjà crée par la technologie pour lire la vidéo le fait à ta place..
    ( ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Microsoft.DirectX.AudioVideoPlayback;
    )

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut
    J'ai des amis qui m'ont dit que cela pouvait venir des panels qui se rafraîchissaient pas quand il le faut mais moi je me dis que vu que leur events sont dans d'autres threads alors il ne devrait pas y avoir de problèmes. Quel est la source des ralentissements alors ?

  16. #16
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Re.

    Merci Mat .M. Un peu de soutien ça fait toujours plaisir .

    hedisurfer. J'ai certainement touché le fond du problème, mais tu ne l'as pas vu, enfin c'est mon impression. Combien de vidéos simultanées lances-tu ?

    Si tu lances 20 vidéos, mais que ton processeur supporte 10 vidéos (100% de charge), c'est peine perdu. Cela devient un problème matériel avant de devenir un problème logiciel (sauf utilisation inadéquate des API).

    Mais je ne pense pas que ce soit un problème logiciel, parce que l'API AudioVideoPlayback est basée (à confirmer parce que ça évolue avec MediaFoundation) sur l'API DirectShow et tout ce qu'il y a de meilleur.

    Avant de parler de ralentissement, il faut éclaircir le point précédent...

    Ensuite, effectivement, .net ne sera pas aussi performant que du C++ natif. Mais pour avoir utiliser les deux versions (C++ natif/C++ .net/directshow), je ne pense pas que le .net soit très pénalisant (problème de rafraîchissement des panels, je ne pense pas).

    Citation Envoyé par hedisurfer Voir le message
    Bonjour,

    C'est des vidéos avi. mais de petite taille (3seconces) et de petite résolution (320x240). Est-ce que les codecs utilisent le cpu ?
    Oui. Pour mieux comprendre, je te conseilles la FAC DirectShow. Enfin .avi c'est un conteneur, ça m'avance, mais pas beaucoup. Le format de compression audio et vidéo "exact" de ce conteneur, permettrai de savoir si les fichiers .avi que tu utilises sont gourmands ou pas en temps processeur.

    Citation Envoyé par hedisurfer Voir le message
    J'ai déjà VLC (dernière version) alors normalement cela ne devrait pas poser de problèmes non ?
    Attention. Il y a quelques temps, VLC utilisait ses propres codecs au sein même de l'application VLC. Je sais que l'open source évolue très vite, mais les codecs VLC, s'ils ne sont pas DirectShow, n'entrent alors pas en ligne de compte.

    Citation Envoyé par hedisurfer Voir le message
    J'utilise le multithreading pour paralléliser le calcul de chaque vidéo mais si tu me dis que chaque vidéo est sur un thread alors c'est bon (de toute façon même en le virant c'est toujours pareil). D'ailleurs y-a-t-il une différence entre parallélisation de tâches et mulithreading ?
    Tu pourrais avoir un gain de performance à paralléliser un calcul "SI" ton ordinateur à un double ou quadruple coeur. Est-ce le cas ? (voir aussi à paralléliser sur une carte graphique multicoeur -> CUDA, etc...).

    (Il faudrait aussi recoder tous les codecs pour qu'ils tirent partie des multicoeurs.)

    Citation Envoyé par hedisurfer Voir le message
    Je voulais savoir aussi si les events s'executent sur des threads à part ou pas ?
    Les "events" au sens .Net, s'exécutent dans un thread à part, enfin je suis presque certain. C'est la condition sine qua None pour ne pas friser l'interface graphique.

Discussions similaires

  1. problème avec directx
    Par ShioAru dans le forum DirectX
    Réponses: 2
    Dernier message: 13/12/2009, 12h12
  2. problème multithread et Labels
    Par mstarsup5 dans le forum Qt
    Réponses: 1
    Dernier message: 26/12/2008, 01h05
  3. Problème compilation DirectX
    Par PP(Team) dans le forum DirectX
    Réponses: 2
    Dernier message: 21/11/2007, 22h36
  4. Problème installation directx
    Par gui big hit dans le forum Windows XP
    Réponses: 1
    Dernier message: 31/12/2006, 13h45
  5. problème avec directx 9 et visual C++ 6
    Par 180degrés dans le forum MFC
    Réponses: 2
    Dernier message: 28/09/2005, 09h43

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