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

MATLAB Discussion :

Multi-threading avec mex-file [MEX]


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Multi-threading avec mex-file
    Bonjour tout le monde,

    Cela fait maintenant un petit moment que j'essaie de créer un fichier mex-file qui utilise le multi-threading mais en vain.

    En fait j'arrive à lancer un thread supplémentaire comme dans le premier exemple de ce lien : http://www.mathworks.fr/support/solu.../data/1-V3B5T/

    Mais lorsque je veux suivre la même procédure pour exécuter non pas un mais deux thread (par exemple pour incrémenter deux compteurs au lieu d'un seul) cela ne fonctionne pas (soit le second thread lance retourne n'importe quoi soit matlab se fige ).

    Si quelqu'un sait comment remédier à ce problème, je suis preneur.

    Je vous remercie d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Je ne connais pas bien cette API, donc la réponse suivante est à prendre avec précaution

    Code C : 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
    #include "mex.h"
    #include <windows.h>
    #include <stdio.h>
    #include <process.h>
     
    unsigned Counter1, Counter2; 
     
    unsigned __stdcall count1( void* pArguments )
    {
        while ( Counter1 < 500000 )
            Counter1++;
     
        _endthreadex( 0 );
        return 0;
    } 
     
    unsigned __stdcall count2( void* pArguments )
    {
        while ( Counter2 < 1000000 )
            Counter2++;
     
        _endthreadex( 0 );
        return 0;
    } 
     
    void mexFunction( int nlhs, mxArray *plhs[], 
    		  int nrhs, const mxArray*prhs[] )
     
    { 
        HANDLE hThread[2];
        unsigned threadID1, threadID2;
     
        hThread[0] = (HANDLE)_beginthreadex( NULL, 0, &count1, NULL, 0, &threadID1 );
        hThread[1] = (HANDLE)_beginthreadex( NULL, 0, &count2, NULL, 0, &threadID2 );
     
        WaitForMultipleObjects(2, hThread, TRUE, INFINITE );
     
        printf( "Counter1 should be 500000; it is-> %d\n", Counter1 );
        printf( "Counter2 should be 1000000; it is-> %d\n", Counter2 );
     
        CloseHandle( hThread[0] );
        CloseHandle( hThread[1] );
     
        return;
    }
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci Dut pour ta réponse si rapide.

    C'est ce que j'ai fait, la compilation se passe sans embûche mais lorsque je lance le programme, Matlab se fige. Je ne suis pas devant mon ordinateur donc je ne peux pas t'envoyer le code que j'ai rédigé mais je te le ferai parvenir dans la soirée.

    Encore merci

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Citation Envoyé par yoann1989 Voir le message
    C'est ce que j'ai fait, la compilation se passe sans embûche mais lorsque je lance le programme, Matlab se fige.
    Tu parles de ton code ou du mien ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    je n'ai pas testé ton code mais il est quasiment identique au mien mis à part la récupération de deux chaines de caractères en entrée permettant de mettre une condition dans le remplissage des compteurs.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Voilà la fonction que j'ai codée, elle se rapproche grandement de ce que tu as fait :

    Code C : 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
    66
    67
    68
    69
    70
    71
    72
     
    #include "mex.h"
    #include <windows.h>
    #include <stdio.h>
    #include <process.h>
    #include <string.h>
     
    unsigned Counter = 0;
    unsigned Counter_1 = 0;
     
    unsigned __stdcall SecondThreadFunc( void* pArguments )
    {
        if( strcmp( (char*)pArguments,"Init" ) )
            Counter = 12;
        else
        {
            while ( Counter < 1000000 )
            Counter++;
        }
     
        _endthreadex(0);
        return 0;
    }
     
    unsigned __stdcall ThirdThreadFunc( void* pArguments )
    {
        if( strcmp( (char*)pArguments,"Init" ) )
            Counter_1 = 12;
        else
        {
            while ( Counter < 1000000 )
            Counter_1++;
        }
     
        _endthreadex(0);
        return 0;
    }
     
    void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
    {
        HANDLE hThreads[2];
        unsigned threadID[2];
        char *cmd;
        char *cmd1;
     
        //On vérifie que l'argument soit une chaîne de caractères
        if( nrhs != 2 )
            mexErrMsgTxt( "Two input required" );
        if( !mxArrayToString( prhs[0] ) )
            mexErrMsgTxt( "Input must be a string" );
     
        //On récupère la chaîne de caractères
        cmd = mxArrayToString( prhs[0] );
        cmd1 = mxArrayToString( prhs[1] );
     
        printf( "Creating second thread...\n" );
     
        //Create the second thread.
        //Create the third thread.
        hThreads[0] = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, cmd, 0, &threadID[0] );
        hThreads[1] = (HANDLE)_beginthreadex( NULL, 0, &ThirdThreadFunc, cmd1, 0, &threadID[1] );
     
        WaitForMultipleObjects(2,hThreads,TRUE,INFINITE);
        printf( "Counters should be 1000000; first is -> %d\n", Counter );
        printf( "Counters should be 1000000; first is -> %d\n", Counter_1 );
     
        CloseHandle( hThreads[0] );
        CloseHandle( hThreads[1] );
     
        mxFree(cmd);
        mxFree(cmd1);
    }

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une petite erreur d'étourderie ligne 31 :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( Counter_1 < 1000000 )

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Ouch, j'ai relu le code 5000 fois et je ne l'ai pas vu... Mille merci, cela ne peut venir que de là... Encore merci... Je suis vraiment un boulet

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/06/2011, 07h14
  2. [AC-2003] Multi-Threading avec une bibiothèque externe
    Par Lorito dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/05/2010, 11h23
  3. Multi-threading avec Graphics
    Par sayag dans le forum C#
    Réponses: 4
    Dernier message: 15/06/2007, 10h28
  4. Réponses: 1
    Dernier message: 17/11/2006, 23h21
  5. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01

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