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

MFC Discussion :

demande infos threads


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut demande infos threads
    Bonjour,

    j'ai parcouru le forum, google et MSDN mais je ne trouve pas/ ne comprend pas, la gestion de plusieurs threads.

    notamment l'utilsation et l'exploitation des valeurs retournées par WaitForMultipleObjects.

    dans mon prog exemple j'ai ce code :

    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
     
     
    DWORD WINAPI NotificationProc( LPVOID lpParameter )
    {
        HRESULT hr;
        HWND    hDlg = (HWND) lpParameter;
        MSG     msg;
        DWORD   dwResult;
        BOOL    bDone = FALSE;
        BOOL    bLooped;
     
        while( !bDone ) 
        { 
            dwResult = MsgWaitForMultipleObjects( 1, &g_hNotificationEvent[0], 
                                                  FALSE, INFINITE, QS_ALLEVENTS );
            switch( dwResult )
            {
                case WAIT_OBJECT_0 + 0:
                    // g_hNotificationEvent is signaled
     
                    // This means that DirectSound just finished playing 
                    // a piece of the buffer, so we need to fill the circular 
                    // buffer with new sound from the wav file
                    bLooped = ( IsDlgButtonChecked( hDlg, IDC_LOOP_CHECK ) == BST_CHECKED );
                    if( FAILED( hr = g_pStreamingSound[0]->HandleWaveStreamNotification( bLooped ) ) )
                    {
                        DXTRACE_ERR_MSGBOX( TEXT("HandleWaveStreamNotification"), hr );
                        MessageBox( hDlg, "Error handling DirectSound notifications."
                                   "Sample will now exit.", "DirectSound Sample", 
                                   MB_OK | MB_ICONERROR );
                        bDone = TRUE;
                    }
     
                    break;
     
                case WAIT_OBJECT_0 + 1:
                    // Messages are available
                    while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) 
                    { 
                        if( msg.message == WM_QUIT )
                            bDone = TRUE;
                    }
                    break;
            }
        }
     
        return 0;
    }
    J'ai cru comprendre que pour gérer mes 3 threads dans cette même fonction je devais renplacer l'appel de waitformultipleobject par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dwResult = MsgWaitForMultipleObjects( 3, &g_hNotificationEvent[0], 
                                                  FALSE, INFINITE, QS_ALLEVENTS );
    g_hNotificationEvent étant le tableau des 3 évenements crées pour les 3 threads.

    je comprend bien que l'événement ce produit mais comment savoir quel threads l'a déclenché ? le 1er, le 2nd ou le dernier ?

    merci d'avance, ja rame a mort avec les threads

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    je suppose que les events n'ont pas de rapport avec le numero de thread .

    sinon au lieu de passer un handle de fenetre en arguement passe un structure qui contient le numero de thread + le handle de fenetre
    dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NotificationProc( LPVOID lpParameter )

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    en fait je crée 3 events

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g_hNotificationEvent[0] = CreateEvent( NULL, FALSE, FALSE, NULL );
    	g_hNotificationEvent[1] = CreateEvent( NULL, FALSE, FALSE, NULL );
    	g_hNotificationEvent[2] = CreateEvent( NULL, FALSE, FALSE, NULL );
    et j'ai 3 threads
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Create a thread to handle DSound notifications
        g_hNotifyThread = CreateThread( NULL, 0, NotificationProc, 
                                        hDlg, 0, &g_dwNotifyThreadID );
     
    	// Create a thread to handle DSound notifications
        g_hNotifyThread2 = CreateThread( NULL, 0, NotificationProc2, 
                                        hDlg, 0, &g_dwNotifyThreadID2 );
     
    	// Create a thread to handle DSound notifications
        g_hNotifyThread3 = CreateThread( NULL, 0, NotificationProc3, 
                                        hDlg, 0, &g_dwNotifyThreadID3 );
    le problème comme tu peux le voir dans la création des threads c'est que j'ai une fonction de notification par thread. Moi je cherche à n'en n'avoir qu'une seule. Ton idée est pas mal. Si je comprend bien, dans la fonction ensuite, je test le N° du thread et je répond en conséquence ?

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    MsgWaitForMultipleObjects ne permet pas de savoir à quel thread est destiné l'évenement ?

    sinon la proc de notification ne dois t'elle pas respecter un format spécifique ? Dans ce cas impossible d'utiliser ta soluce.

    ThreadProc dans MSDN. Apparement il est possible de passer une variable avec lpParameter mais je ne comprend pas tout.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    Je viens de tilter farscape, hdlg est passé comme params dans createThread. Je lui passe la structure.


  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    J'ai essayé :

    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
    typedef struct {
     
    	DWORD threadID;
    	HWND  dlgHandle;
     
    } threadInfos;
     
    avec 
    str_ThreadInfo[0].dlgHandle = hDlg;
    	str_ThreadInfo[0].threadID = g_dwNotifyThreadID;
     
    	// Create a thread to handle DSound notifications
        g_hNotifyThread = CreateThread( NULL, 0, MyNotificationProc, 
                                        &str_ThreadInfo[0], 0, &g_dwNotifyThreadID );
     
     
    	str_ThreadInfo[1].dlgHandle = hDlg;
    	str_ThreadInfo[1].threadID = g_dwNotifyThreadID2;
     
    	// Create a thread to handle DSound notifications
        g_hNotifyThread2 = CreateThread( NULL, 0, MyNotificationProc, 
                                        &str_ThreadInfo[1], 0, &g_dwNotifyThreadID2 );
     
    	str_ThreadInfo[2].dlgHandle = hDlg;
    	str_ThreadInfo[2].threadID = g_dwNotifyThreadID3;
     
    	// Create a thread to handle DSound notifications
        g_hNotifyThread3 = CreateThread( NULL, 0, MyNotificationProc, 
                                        &str_ThreadInfo[2], 0, &g_dwNotifyThreadID3 );
     
     
    et 
     
    threadInfos *pThreadInfo = (threadInfos *)lpParameter;
    ca marche à moitié, mon premier son n'est joué qu'une fois et les autres répété mais toujours le même sample, le buffer audio n'avance pas. Les évenements crée sont dépendant des threads, j'ai l'impression que le bon threadID est récupéré mais pas le bon évenement ID

    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dwResult = MsgWaitForMultipleObjects( 3, &g_hNotificationEvent[0], 
                                                  FALSE, INFINITE, QS_ALLEVENTS );
    on passe bien un pointeur vers un tableau de eventHandle ainsi que le nombre d'event (3). mais comment savoir lequel est déclenchée ? pour que je sache quel buffer sonore mettre a jour ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    si je comprend bien msgWaitForMultipleObject avec mes 3 handles :

    alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    dwResult = MsgWaitForMultipleObjects( 3, &g_hNotificationEvent[0], 
                                                  FALSE, INFINITE, QS_ALLEVENTS );
     
            switch( dwResult )
            {
                case WAIT_OBJECT_0 + 0: == event thread 1
     
                case WAIT_OBJECT_0 + 1: == event thread 2
     
                case WAIT_OBJECT_0 + 2: == event thread 3
     
                case WAIT_OBJECT_0 + 3: == ncount donc défaut
            }
    non ? pourtant ce code plante a l'éxécution (mauvais rafraîchessement des mauvais buffers sonores

  9. #9
    Membre habitué Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    Je n'ai pas tout lu et pas tout suivi, mais tes threads accèdent-ils à des variables communes ?
    Le cas échéant, as-tu géré les accès concurrentiels sur ces variables (sections critiques) ?
    Les orteils servent à trouver les pieds de chaise et les montants de porte quand il fait noir.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    finalement ça marche avec :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    DWORD WINAPI MyNotificationProc( LPVOID lpParameter )
    {
        HRESULT hr;
        HWND    hDlg;
        MSG     msg;
        DWORD   dwResult;
        BOOL    bDone = FALSE;
        BOOL    bLooped;
     
        while( !bDone ) 
        { 
            dwResult = MsgWaitForMultipleObjects( 3, &g_hNotificationEvent[0], 
                                                  FALSE, INFINITE, QS_ALLEVENTS );
     
    		threadInfos *pThreadInfo = (threadInfos *)lpParameter;
    		hDlg = pThreadInfo->dlgHandle;
     
            switch( dwResult )
            {
                case WAIT_OBJECT_0 + 0:
     
     
     
    				if(pThreadInfo->threadID == 0) {
     
     
     
     
    						// g_hNotificationEvent is signaled
     
    						// This means that DirectSound just finished playing 
    						// a piece of the buffer, so we need to fill the circular 
    						// buffer with new sound from the wav file
    						bLooped = ( IsDlgButtonChecked( hDlg, IDC_LOOP_CHECK ) == BST_CHECKED );
    						if( FAILED( hr = g_pStreamingSound[0]->HandleWaveStreamNotification( bLooped ) ) )
    						{
    							DXTRACE_ERR_MSGBOX( TEXT("HandleWaveStreamNotification"), hr );
    							MessageBox( hDlg, "Error handling DirectSound notifications."
    									"Sample will now exit.", "DirectSound Sample", 
    									MB_OK | MB_ICONERROR );
    							bDone = TRUE;
    						}
     
    				}
     
                    break;
     
    			case WAIT_OBJECT_0 + 1 :
     
    				if (pThreadInfo->threadID == 1) {
    				bLooped = ( IsDlgButtonChecked( hDlg, IDC_LOOP_CHECK ) == BST_CHECKED );
    						if( FAILED( hr = g_pStreamingSound[1]->HandleWaveStreamNotification( bLooped ) ) )
    						{
    							DXTRACE_ERR_MSGBOX( TEXT("HandleWaveStreamNotification"), hr );
    							MessageBox( hDlg, "Error handling DirectSound notifications."
    									"Sample will now exit.", "DirectSound Sample", 
    									MB_OK | MB_ICONERROR );
    							bDone = TRUE;
    						}
    				}
    						break;
     
    			case WAIT_OBJECT_0 + 2 :
    				if(pThreadInfo->threadID == 2) {
    				bLooped = ( IsDlgButtonChecked( hDlg, IDC_LOOP_CHECK ) == BST_CHECKED );
    						if( FAILED( hr = g_pStreamingSound[2]->HandleWaveStreamNotification( bLooped ) ) )
    						{
    							DXTRACE_ERR_MSGBOX( TEXT("HandleWaveStreamNotification"), hr );
    							MessageBox( hDlg, "Error handling DirectSound notifications."
    									"Sample will now exit.", "DirectSound Sample", 
    									MB_OK | MB_ICONERROR );
    							bDone = TRUE;
    						}
    				}
    					break;
     
     
                case WAIT_OBJECT_0 + 3:
                    // Messages are available
                    while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) 
                    { 
                        if( msg.message == WM_QUIT )
                            bDone = TRUE;
                    }
                    break;
            }
        }
     
        return 0;
    }
    mais je note un léger décalage au bout d'un moment, ça reste léger.

    j'ai noté ceci dan MSDN :

    pHandles
    [in] Pointer to an array of object handles. For a list of the object types whose handles can be specified, see the following Remarks section. The array can contain handles of objects of different types. It may not contain multiple copies of the same handle.
    If one of these handles is closed while the wait is still pending, the function's behavior is undefined.

    The handles must have the SYNCHRONIZE access right. For more information, see Standard Access Rights
    or mes threads sont créés comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CreateThread( NULL, 0, MyNotificationProc, 
                                        &str_ThreadInfo[0], 0, &g_dwNotifyThreadID );
    donc LPSECURITY_ATTRIBUTES est NULL, pas de synchronize. Est ce génant ?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    Non ils n'accèdent pas aux même buffers audio, chacun le sient pas de conurrence à gérer

  12. #12
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonjour,
    je vais peut être mettre mon grain de sel à tord, mais:
    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
     
             if(pThreadInfo->threadID == 0) { 
     
     
     
     
                      // g_hNotificationEvent is signaled 
     
                      // This means that DirectSound just finished playing 
                      // a piece of the buffer, so we need to fill the circular 
                      // buffer with new sound from the wav file 
                      bLooped = ( IsDlgButtonChecked( hDlg, IDC_LOOP_CHECK ) == BST_CHECKED ); 
                      if( FAILED( hr = g_pStreamingSound[0]->HandleWaveStreamNotification( bLooped ) ) ) 
                      { 
                         DXTRACE_ERR_MSGBOX( TEXT("HandleWaveStreamNotification"), hr ); 
                         MessageBox( hDlg, "Error handling DirectSound notifications." 
                               "Sample will now exit.", "DirectSound Sample", 
                               MB_OK | MB_ICONERROR ); 
                         bDone = TRUE; 
                      }
    Les threadID que tu testes sont bizarres! Je n'en ai jamais vu d'aussi simple. Tu es sûr que le code marche ?

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    OUI

    en fait, je les ais prog a la manière de microsoft dans le SDK directX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DWORD               g_dwNotifyThreadID      = 0;
    HANDLE              g_hNotifyThread         = NULL;
    100% microsoft, vérifiable dans l'exemple streamData, directSound.

    Si i se gourre c'est assez grave

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    Ce n'est pas comme ça d'habitude ?

    Quelle forme alors ?

  15. #15
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Il s'agit d'initialisation de variable, amis ça ne veut absoluement pas dire que les thread ont un id qui s'incrémente comme un entier.

    Renvoie toi quelques thread id en debug pour t'en convaincre via la fonction GetCurrentThreadID.

    Tiens, un liens sur msdn:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getcurrentthreadid.asp
    Citation Envoyé par inertia
    OUI

    en fait, je les ais prog a la manière de microsoft dans le SDK directX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DWORD               g_dwNotifyThreadID      = 0;
    HANDLE              g_hNotifyThread         = NULL;
    100% microsoft, vérifiable dans l'exemple streamData, directSound.

    Si i se gourre c'est assez grave

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    OK, je vais contrôler tout ça. Sinon d'après le MSDN mes threads doivent être synchronizé :

    The handles must have the SYNCHRONIZE access right. For more information, see Standard Access Rights.
    Sauf que je n'arrive pas à fixer cet accès de sécurité. Comment faire ? J'ai cherché dans la structure SECURITY_ATTRIBUTES que l'on passe comme 1er arg de CreateThread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    HANDLE CreateThread(
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      SIZE_T dwStackSize,
      LPTHREAD_START_ROUTINE lpStartAddress,
      LPVOID lpParameter,
      DWORD dwCreationFlags,
      LPDWORD lpThreadId
    );
    Comment faire ? Ya une fonction spéciale qui prend des flags et un ID de threads en params, un truc comme ça ?

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    GetCurrentThreadId renvoit un DWORD (long en fait), c'est donc bien un numéric ? pas une structure bizarre comme un GUID.

    J'ai des valeurs style 2038, etc etc .... donc pas 0,1,2 effectivement mes contrôles d'ID était simpliste, tout comme mes compétences actuelles en threads

    Comment recup correctement l'ID d'un threads alors ? Mon problème, c'est que pour chaque threads threads, un évenement est créé. Dans mon unique fonction, comment savoir quel évenemlent a était déclenché, pour y réagir.

    je pensais que c'était la valeur de retour de MsgWaitForMultipleObject ? nan.

    Si je passe par plusieurs fonctions de notification de threads bien définies tout marche mais c lourd et pas propre. Ca ressemble a de la bidouille.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Points : 37
    Points
    37
    Par défaut
    Pour la synchronization des threads, c'est via les access list et access entry ? ACL, ACE ?

Discussions similaires

  1. [demande Info]Base Access sous Oracle
    Par léti07 dans le forum Oracle
    Réponses: 2
    Dernier message: 15/09/2006, 14h29
  2. Demande infos pour développer un plugin
    Par alexge dans le forum Eclipse Platform
    Réponses: 5
    Dernier message: 10/05/2006, 15h13
  3. demande info de la fonction move dans un module
    Par lechtifred dans le forum Access
    Réponses: 1
    Dernier message: 01/05/2006, 15h04
  4. [NetBeans RCP] Demande Infos Complémentaires
    Par afrikha dans le forum NetBeans
    Réponses: 2
    Dernier message: 23/01/2006, 14h44
  5. Réponses: 3
    Dernier message: 11/01/2006, 14h22

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