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 :

Shell Extensions : avec QThread pour un QTcpSocket [QThread]


Sujet :

Multithreading

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut Shell Extensions : avec QThread pour un QTcpSocket
    Bonjour,

    Je me suis lancé dans la création d'une DLL pour créer une extension shell pour explorer sous windows.
    Je suis parti depuis ce tutoriel : http://www.qtcentre.org/threads/3210...source-edition
    L'ajout d'overlay sur les icones fonctionne correctement.

    Ensuite, je me suis lancé dans une extension plus complexe : Namespace Shell Extension (en gros, un folder virtuel comme le Google Drive par exemple).
    Ca fonctionne pas mal mais j'aimerais pouvoir récupérer des listes de fichiers/dossiers d'un serveur.
    Donc, dans cette optique, je veux ajouter un QTcpSocket qui se connecte à une application standalone.

    Voici mes différents essais:
    1/ La création du QTcpSocket en variable globale dans le thread principal (dans DllMain) de l'extension ne fonctionne pas.
    Je peux voir une connection du QTcpSocket au serveur mais après c'est tout. Le thread principal bloque sans doute; ce que je peux comprendre.

    2/ J'ai donc opté pour la création d'un thread pour contenir mon QTcpSocket.
    Pour cela; j'ai tenté la création de QThread mais il ne fonctionne pas non plus. C'est comme ci il bloquait.
    Le résultat est le même qu'au point 1/.

    3/ Apres des recherches sur internet, j'ai trouvé une solution avec _beginthread.
    Le socket fonctionne correctement. Je peux voir qu'il se connecte au serveur avec succès. Je peux envoyer ou recevoir des données dans le thread sans problème.

    voici le code utilisé:
    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
     
    void CreateThread(void * param) 
    {
       // creation du QTcpSocket 
       // + boucle pour garder le thread fonctionnel
    }
    STDAPI_(BOOL) DllMain(HINSTANCE hInstance, DWORD dwReason, void *)
    {
        if (dwReason == DLL_PROCESS_ATTACH)
        {
            g_hInst = hInstance;
            DisableThreadLibraryCalls(hInstance);
     
            g_thread = (HANDLE) _beginthread( CreateThread, 0, NULL);
        }
    }
    Mon soucis est que cette solution _beginthread ne me permet plus d'utiliser la méthode des signals/slots comme avec QThread.
    Je ne peux donc pas interagir avec le QTcpSocket pour lui faire envoyer des donnees ou récuperer les données depuis le thread principal.
    Or, les fonctions appellées par explorer se trouve dans le thread principal.

    Auriez vous une piste pour moi?
    - Est il possible de faire fonctionner QThread pour remplacer _beginthread et alors récupérer les bienfaits des signals/slots ?
    - Si _beginthread est la seule solution, est il possible d'établir une interaction avec le QTcpSocket situé dans ce thread?

    Merci d'avance pour vos lumières!

    Cordialement

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    J'ai finalement réussi à faire fonctionner ce que je voulais faire.

    Je n'ai jamais réussi à faire fonctionneer QThread directement dans le dllmain. Le _beginthread fonctionne néanmoins correctement.
    Je suspecte qu'il faille un QApplication fonctionnel pour utiliser le QThread.

    Pour l'appel des slots, j'utilise alors QMetaObject::invokeMethod sur le pointeur global de mon socket. Cela fonctionne correctement.

    Cordialement,

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 20/11/2009, 19h31
  2. Réponses: 1
    Dernier message: 18/11/2009, 18h49
  3. Problème pour faire des box extensibles avec des images)
    Par dream_of_australia dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 17/11/2007, 10h58
  4. Réponses: 3
    Dernier message: 18/07/2007, 17h20
  5. Réponses: 19
    Dernier message: 24/05/2002, 16h36

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