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

Multithreading Discussion :

QextSerialPort et le multithreading avec QThread [QThread]


Sujet :

Multithreading

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut QextSerialPort et le multithreading avec QThread
    Bonjour à tous,

    Je cherche à intégrer qextserialport à une GUI.

    Je pense donc à un thread de qextserialport qui devra :
    - surtout pouvoir lire sur le port COM (et par la suite écrire) en continu ce que lui envoie un matériel embarqué,
    - parser le contenu
    - produire des signaux conditionnels personnalisés afin de reveiller le thread principal.

    J'ai suivi des tats de tutos et les exemples de qextserialport, que j'ai bien réussi à compiler, mais maintenant que je dois intégrer un thread de qextserialport par moi même, je dois dire que je sèche un peu.

    Je précise que je suis débutant en Qt C++, mais pas en programmation.

    Merci d'avance pour vos réponses !

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    qextserialport n'as pas un fonctionnement asynchrone?

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Merci de ta réponse Yan,

    En fait, j'ai vu dans un des exemples de qextserialport (qespta) que la lecture continue sur le port était effectuée par un Qthread.

    J'ai essayé de modifier par moi-meme cet exemple pour l'intégrer dans une GUI Qt du thread principal. J'arrive à récupérer le flux du port COM, mais je dois avoir un bug, car j'ai un usage processeur à 56% (un des threads doit etre planté...).

    Ca ne semble pas idiot de procéder avec un thread comme dans l'exemple, car j'aurai des algos qui pourront prendre un peu de temps dans le thread principal (calculs 3D...), et je voudrai que le parsage se fasse en continu sur l'autre thread.
    Mais je ne sais pas dans quel ordre déclarer tous ces modules (d'ou le bug je pense) :

    - Thread lecture port COM + parsage,
    - Thread principal contenant :
    o Interface graphique Qt (Boutons, affichage de graphiques des données du port COM par exemple (mais ce sera un autre post !)),
    o Fenêtre Ogre mise à jour à partir des données du port COM

    Qu'en pensez-vous ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par neoirto Voir le message
    Qu'en pensez-vous ?
    Si qextserialport as un fonctionnement synchrone il te faut un thread.

    Ce que tu propose est bien. Pour faire transiter les info entre tes threasd, je te conseil d'utiliser les signal/slot (sans pointeur en paramètre). Car ceci te permet d'avoir un fonction quasi sans risque. Y as des exemplse dans la doc de Qt (leur serveur de doc étant en rade je ne peux pas te donner les liens pour l'instant).

    Si qextserialport le permet tu pourrais éviter d'implémenter un thread. Regarde ces documents :
    http://qt-labs.developpez.com/#thread

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Ok, alors je progresse un peu...

    Désormais je crois mon thread lecture sur le port COM commence à fonctionner correctement. Mais je n'arrive pas à déclarer mes propres SIGNALS et SLOTS. Et surtout je ne sais pas comment y accéder depuis mes autres threads.

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    class SerialThread: public QThread
    {
    	QextSerialPort * port;
     
     
    	protected:
    		virtual void run()
    		{
     
    			int compteur_sans_com = 0;
     
    			qDebug("THREAD lecture COM : %i", (int)currentThreadId());
     
    			QextSerialPort * port = new QextSerialPort("COM6", QextSerialPort::EventDriven);
     
     
    			while(1){
     
    				/////////// si le port est ouvert, on lit les données :
    				if( port->isOpen() ){
     
     
    				Sleep(DELAI_lecture_port_COM); //////// pour eviter de surcharger ce thread et donc laisser les autres threads travailler
     
    				char data[4096];
     
    				int bytesRead = port->read(data, 4096);
    				data[bytesRead] = '\0';
     
    					////////////// si on a recu qq chose :
    					if( bytesRead > 0 ){
    					qDebug("%s ## %i", data, (int)currentThreadId());
    					// qDebug(" %i", (int)currentThreadId());
    					} else {
    					qDebug("RIEN %i", compteur_sans_com);
     
    						if (!(port->lineStatus() & LS_DSR)) {
     
    							compteur_sans_com++;
     
    							if( compteur_sans_com > NBR_sans_com_before_reopen_COM6 ){
    							compteur_sans_com = 0;
    							qDebug("On referme le port COM !!!");
     
    							port->close();
     
    							Sleep(10);
    							}
     
     
    						}
     
    					}
     
    				} else {
     
    							port = new QextSerialPort("COM6", QextSerialPort::EventDriven);
    							port->setBaudRate(BAUD9600);
    							port->setFlowControl(FLOW_OFF);
    							port->setParity(PAR_NONE);
    							port->setDataBits(DATA_8);
    							port->setStopBits(STOP_2);
    							port->open(QIODevice::ReadWrite);
    							port->setTimeout(500);
    							qDebug("On essai de reouvrir !! ");
     
     
    							Sleep(5000); ////////// la negociation avec le materiel peut prendre du temps 
     
    				}
     
    			}
     
    		}
     
     
     
    	signals:
    	  // Émet un entier
    	  void unEntier(int);
     
     
     
    	public slots:
     
          void close_COM()
          {
              qDebug("demande fermeture port com !!!");
    		  port->close();
          }
     
     
    }; 
     
     
     
     
     
     
    int main(int argc, char *argv[])
    {
     
    	int exec;
     
    	QApplication app(argc, argv);
        //redirect debug messages to the MessageWindow dialog
    	qInstallMsgHandler(MessageWindow::AppendMsgWrapper);
     
    	MainWindow mainWindow(APP_TITLE);
    	mainWindow.show();
     
     
    	qDebug("THREAD MAIN : %i", (int)QThread::currentThreadId());
     
    	// SerialThread * thread = new SerialThread(port);
    	SerialThread * thread = new SerialThread();
    	app.connect(thread, SIGNAL(finished()), & app, SLOT(quit()));
     
     
     
     
        QPushButton BOUTON_CLOSE_COM("Fermer COM");
        BOUTON_CLOSE_COM.resize(75, 30);
        BOUTON_CLOSE_COM.setFont(QFont("Times", 15, QFont::Bold));
     
        app.connect(&BOUTON_CLOSE_COM, SIGNAL(clicked()), thread, SLOT(close_COM()));
     
    	BOUTON_CLOSE_COM.show();
     
    	thread->start();
     
     
    	exec = app.exec();
     
    	return exec;
    }
    Par exemple je n'arrive pas à executer le slot close_COM depuis BOUTON_CLOSE_COM.

    Et comment est-ce que je dois faire pour declencher le slot depuis ma classe
    MainWindow please ?

    Merci d'avance !

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Si tu commence avec Qt, je te conseil de commencer par les tuto ou du moins de faire un tours rapide :
    http://qt.developpez.com/tutoriels/introduction-qt/

    Sinon, regarde ces deux liens :
    http://qt.developpez.com/faq/index.p...ots#signalslot
    http://qt.developpez.com/faq/index.p...ECT-moc-header

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Il est vrai que je débute... Je sais que c'est pas marrant de repondre à des questions de base... Désolé Yan.

    Donc pour éviter de passer pour un gros lourdot, bien sur, j'ai deja lu (ou au moins parcouru) la plupart des tutos avant de vous adresser mes questions. Mais l'architecture Qt reste quand meme assez obscure pour moi. D'ou mes questions de gros debutant !

    Comme tu viens de me le conseiller, je viens d'essayer d'ajouter :
    Juste derriere la declaration de ma classe sans .h, mais le compilateur n'apprécie pas des masses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main.cpp:121:101: error: main.moc: No such file or directory
    Je dois éditer mon .pro ?

    Je pédale dans le yaourt !

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par neoirto Voir le message
    . Mais l'architecture Qt reste quand meme assez obscure pour moi. D'ou mes questions de gros debutant !
    y as pas de problème t'inquiète. Qt n'est pas aussi simple au début

    En faite il te manque Q_OBJECT dans ta classe.

  9. #9
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Merci, j'apprécie beaucoup ton aide !

    Je comprends entre les lignes que comme ce n'est pas un objet qt valide à part entière, je ne peut pas utiliser les slot / signal ??

    Bon je creuse cette piste, et je reviens vers toi si je tombe sur le fond du pot (de yaourt).

    Merci encore

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par neoirto Voir le message
    Je comprends entre les lignes que comme ce n'est pas un objet qt valide à part entière, je ne peut pas utiliser les slot / signal ??
    Ben c'est une des base de Qt... C'est pour cela que je t'ai dit de regarder les tuto.
    EN gros raccourcie, Q_OBJECT permet de spécifier au moc que tu va déclarer des signal/slot.
    Pour plus de détaille, regarde :
    http://louis-du-verdier.developpez.com/qt/fondations/

  11. #11
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Oui, effectivement, c'est plus clair. Je suis passé à coté apparemment...
    Merci encore

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Bon, je ne suis toujours pas sorti d'affaires avec ces histoires d'heritages...

    J'essaie d'hériter de Qwidget et de Qthread pour afficher une fenetre Opencv désormais. J'ai donc dans mon .h :
    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
    class QOpenCVWidget : public QWidget, public QThread 
    // class QOpenCVWidget : public QWidget
    {
     
    	// Q_OBJECT // ca ne compile pas si j'ajoute ca...
     
        private:
            QLabel *imagelabel;
            QVBoxLayout *layout;
            QImage image;
    		CvCapture * webcam;
     
        public:
            QOpenCVWidget(QWidget *parent = 0);
            ~QOpenCVWidget(void);
    		void run();
            void putImage(IplImage *);
            QImage getImageLabel();
     
    };
    Et dans le .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QOpenCVWidget::QOpenCVWidget(QWidget *parent) : QThread(parent),  webcam(0)  {
    ...
    }
    Et ca compile, sans planter quoique ce soit.
    Par contre lorsque je fais appel à QThread::start(); la fonction run(); s'exécute une fois... Et quitte aussitot !

    J'ai beau chercher, je crois que j'ai besoin d'un sérieux coup de main !

    Merci d'avance

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par neoirto Voir le message
    J'essaie d'hériter de Qwidget et de Qthread
    Là tu fait fausse route....
    pourquoi tu cherche à faire cela???

  14. #14
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Et bien j'ai besoin d'afficher dans un Qwidget le resultat d'un thread Opencv.

    A la fin du script du Thread, le resultat est un QPixmap il me semble (voir ci dessous).

    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
     layout = new QVBoxLayout;
     
     
        imagelabel = new QLabel;
        QImage dummy(100,100,QImage::Format_RGB32);
        image = dummy;
        layout->addWidget(imagelabel);
        for (int x = 0; x < 100; x ++) {
            for (int y =0; y < 100; y++) {
                image.setPixel(x,y,qRgb(x, y, y));
            }
        }
        imagelabel->setPixmap(QPixmap::fromImage(image));
     
        setLayout(layout);
    Tu vois une autre facon de faire ?

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Tous ce qui est IHM et QPixmap ne doivent pas être manipuler par un thread autre que le principale.


    Si tu as réellement besoin de faire un thread pour OpenCV fait une classe à part et exploite QImage dans ce thread.
    A chaque résultat emet un signal avec le QImage et créé un slot dans ta widget qui recevra cette QImage.

    Mais l'utilité du thread dépend de ce que tu veux faire

  16. #16
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Ok, je vois

    Mais alors, si la Qimage sera bien créé par un thread à part, l'intégration de cette Qimage sera effectuée par mon thread principal, non ?

    Donc le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        imagelabel->setPixmap(QPixmap::fromImage(image));
        setLayout(layout);
    sera executé par le thread principal, non ?

    Tu dis qu'il faut toujours manipuler les QPixmap par un autre thread : pour des raisons de performances ? J'ai effectivement constaté que cela faisait ramer tout mon programme, sans que le processeur soit saturé, ce que j'ai du mal à comprendre.

    Y a t il une autre facon d'intégrer des Qimages que QPixmap, et qui serait donc plus performante ?

    Merci de ton aide !

  17. #17
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    A ok, je viens de relire ta réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tous ce qui est IHM et QPixmap ne doivent être manipuler par un thread autre que le principale.
    C'est pourtant clair, c'est du français, mais j'avais compris l'inverse, sorry !!!

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par neoirto Voir le message
    du français, mais j'avais compris l'inverse, sorry !!!
    arf, sans le pas c'est plus difficile à comprendre... dsl
    pourtant je fais souvent attention à ne pas l'oublier

  19. #19
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Bon alors j'ai encore tout faux... Gasp

    Pour l'instant j'ai réduit le thread à sa plus simple expression :


    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
    #ifndef QOPENCVWIDGET_H
    #define QOPENCVWIDGET_H
    #include <QThread>
    #include <cv.h>
    #include <highgui.h>
    #include <QImage>
     
     
    class QOpenCVWidget : public QThread 
    {
     
    	Q_OBJECT
     
        public:
            QOpenCVWidget( QObject * parent = 0 );
            ~QOpenCVWidget();
            void run();
     
        signals:
        void Emit_frame_webcam( QImage image_a_envoyer );
     
        private:
            QImage image;
    		CvCapture *webcam;
     
    }; 
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    QOpenCVWidget::QOpenCVWidget( QObject *parent ) 
    	: QThread( parent ) 
    {
    }
     
     
    QOpenCVWidget::~QOpenCVWidget() {
    }
     
    void QOpenCVWidget::run()
    {
    		Sleep(1000);
    }
    Et j'obtiens l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    obj/QOpenCVWidget.o: In function `QOpenCVWidget':
    C:\CODE\CODEBLOCKS\TEST_QT\ogre_qt_test_2/QOpenCVWidget.cpp:7: undefined referen
    ce to `vtable for QOpenCVWidget'
    C:\CODE\CODEBLOCKS\TEST_QT\ogre_qt_test_2/QOpenCVWidget.cpp:7: undefined referen
    ce to `vtable for QOpenCVWidget'
    obj/QOpenCVWidget.o: In function `~QOpenCVWidget':
    C:\CODE\CODEBLOCKS\TEST_QT\ogre_qt_test_2/QOpenCVWidget.cpp:48: undefined refere
    nce to `vtable for QOpenCVWidget'
    C:\CODE\CODEBLOCKS\TEST_QT\ogre_qt_test_2/QOpenCVWidget.cpp:48: undefined refere
    nce to `vtable for QOpenCVWidget'
    C:\CODE\CODEBLOCKS\TEST_QT\ogre_qt_test_2/QOpenCVWidget.cpp:48: undefined refere
    nce to `vtable for QOpenCVWidget'

  20. #20
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    http://qt.developpez.com/faq/index.p...ore#linkvtable

    Tu utilise code block? tu devrais essayer QtCreator.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Multithreading avec section critique ?
    Par Cokate dans le forum C#
    Réponses: 8
    Dernier message: 25/08/2008, 16h05
  2. Lancer une application multithread avec msdos
    Par SpIrIt505050 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 11/06/2008, 19h47
  3. Multithread avec partage de ressources et join
    Par Razgriz dans le forum Langage
    Réponses: 4
    Dernier message: 09/05/2008, 10h41
  4. Multithreading avec Visual Basic pour Access
    Par NoViceDel dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/10/2006, 21h18

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