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 :

QTimer et QRunnable, impossible de lancer le timer [QThread]


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut QTimer et QRunnable, impossible de lancer le timer
    Bonjour,

    Je ne peux pas mettre mon code (code d'entreprise) mais je vous explique mon problème peut être quelqu'un aura une idée.
    Je développe sous Windows Mobile 5.0 avec QT 4.6.3.
    J'utilise visual studio 2005.

    J'ai une classe de communication qui est chargé de se connecter plus ou moins régulièrement suivant le temps de reconnexion que lui indique le serveur distant. Cette classe est un Heritage d'un QRunnable et QObject, elle contient en plus une boucle évènementielle (QEventLoop*) ainsi qu'une méthode exec qui se charge de lancer la QEventLoop.
    J'ai une classe manager avec une machine d'état qui en fonction des actions utilisateur réalise différent tache et notamment la création de communication. Il s'agit d'un heritage d'un QThread.
    Petite précision si je passe par des QRunnable c'est parce que j'ai vu que sur certain téléphone, au bout d'un moment n'arrivait plus a me créer des threads. Je profite donc des mécanismes du QthreadPool.

    Dans ma classe de communication j'ai un QTimer* qui, lorsqu'il timeout, effectue une reconnexion, or lorsque je crée mon client depuis le manager et qu'il tente de lancer le timer, j'ai un QObject::startTimer: timers cannot be started from another thread; Je comprend bien le soucis, mon client de communication ne peut lancer son timer lui même. Mais dans ce cas qui doit lancer ce timer? j'ai essayer de faire un movetothread de mon timer vers le thread manager, rien n'y change.
    Je me dit que peut être c'est l'instance de mon QRunnable que je doit faire movetothread vers le thread auquel appartient mon timer que je peux connaitre via m_timer->thread().

    D'ailleurs il n'y a pas si longtemps que ça j'arrivais parfaitement a le lancer, mais c'était lorsqu'il était arrêter que cela foirai. J'ai fait pas mal de modification depuis et je n'arrive plus à le lancer.

    Si quelqu'un a une idée, dites moi. Si vous avez besoin de précision, j'essayerai de vous en donné.

    Merci d'avances

  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
    Seul le thread qui as créé le timer peut le lancer. Es ce que ton timer à un QObject parent?
    Si tu pouvais faire un code minimal de ton cas, cela pourrai aider. Sans code, difficile de t'aider. Surtout quand c'est un problème de thread.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut
    Bonjour,

    voilà en gros le schema de mes classes. a l'origine, je n'avais pas myRunnable mais j'ai eu un soucis, "QThread::start: Failed to create thread ()" donc je me suis dit que passer par Threadpool serait mieux pour réutiliser les threads créé et ainsi ne pas avoir à recréé chaque fois un thread qui me bloquerai lorsque je relance plusieurs fois mes clients.

    Mon problème en plus du timer est aussi que je ne trouve pas d'exemple vraiment pertinent sur l'utilisation des QRunnable et du QThreadpool.

    Donc si vous avez une idée n'hésitez pas.

    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
    class myRunnable:public QRunnable{
    	public:
    		myRunnable();
    		~myRunnable();
    	private:
    		void init(){
    			m_eventLoop =  new QEventLoop;
    		}
    		void exec(){
    		if(m_eventLoop!=NULL)
    			m_eventLoop->exec();
    		}
    		void stop(){
    			m_eventLoop->quit();
    		}
    	QEventLoop* m_eventLoop;
    };

    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
    class myClient:public myRunnable{
    	public:
    		myClient(int time);
    		~myClient();
    	private:
    		void run(){
    					QTimer* reconnection = new QTimer();
    					connec(reconnection,SIGNAL(timeout()),this,makeConnection())
    					reconnection->setSingleShot(true);
    					reconnection->start(1000*m_time);
    					exec();
    				}
    		slots:
    			makeConnection();
     
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class myManager:public QThread{
    	public:
    		myManager();
    		~myManager();
    	private:
    		run(){
    			exec();
    		}
    		startConnexion(){
    			myClient* client = new myClient();
    			m_client.push_back(client);
    			QThreadPool::globalInstance()->start(client);
    		}
    };

  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 Heinrich Voir le message
    voilà en gros le schema de mes classes. a l'origine, je n'avais pas myRunnable mais j'ai eu un soucis, "QThread::start: Failed to create thread ()" donc je me suis dit que passer par Threadpool serait mieux pour réutiliser les threads créé et ainsi ne pas avoir à recréé chaque fois un thread qui me bloquerai lorsque je relance plusieurs fois mes clients.]
    Si tu as besoin de signal/slot ou que ton traitement dure trés longtemps, utilise ton QThread. Le threadpool est surtout utile pour de petit traitement éxécuté trés souvent. Deplus, tu utilise le ThreadPool locale. Donc si un composant de Qt à besoin de faire un traitement tu risque de le bloquer car il va attendre qu'un thread se libère.

    Au faite, pourquoi tu as besoin d'un thread?

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut
    Je peux avoir plusieurs client en même temps, au moins 2 + des modifications d'affichage en cours de connexion et de sons à jouer. Est ce possible d'augmenter le nombre de QThread lançable par l'application ou est ce que c'est géré uniquement par le système?

    si c'est QT qui me provoque le "QThread::start: Failed to create thread ()", ce serait bien de pouvoir augmenter la limite, si par contre c'est le système ce sera assez difficile sachant que c'est du windows mobile.

    Si je peux augmenter le nombre de QThread lançable du coup, pas besoin de passer par les QRunnables, mais sinon j'ai pas des masses de choix. Enfin pas des masses que je vois comme ça.

  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
    De ce que j'ai vue tu utilise des méthodes qui sont asynchrone. Donc pourquoi se compliquer le vie avec des threads? Pourquoi en as tu besoin?

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut
    L'exemple que j'ai fait représente en gros 1/100 du code de l'application.

    Je vais essayer de t'expliquer le fonctionnement. après tu me dira.

    j'ai un serveur et un téléphone client, le téléphone se connecte au serveur pour récupéré la liste des services disponible et un service par défaut qui sera en continue rafraichie à l'arrière plan. On peut se connecter sur un autre service auquel cas j'ai deux service qui se rafraichisse en même temps. Le service par défaut continue a être réceptionné, tandis que lors de la demande et la réception du service on affiche plusieurs messages en fonction de l'avancement, une bar de progression,et on joue des sons. Ceci est complètement synchrone avec le thread client puisqu'a tel instant de la réception du service, j'affiche un message particulier, je joue un son particulier,...

    Si tu as des questions j'essayerai de t'expliquer au mieux de ce que j'ai le droit de dire.

    Si je passe pas par des threads par quoi dois je passer?

  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 Heinrich Voir le message
    Si je passe pas par des threads par quoi dois je passer?
    Par l'evenloop.
    Qt propose un fonctionnement asynchrone qui évite l'utilisation de thread dans une grande majorité des cas. Par exemple, tu n'as pas besoin de faire un thread pour télécharger un fichier.

    Bien sure, tous dépend de ce que tu fait. Si tu as des traitements long ou autre, il te faut des therad.
    Je pense que ceci devrais t'intéresser :
    http://www.developpez.net/forums/d94...-movetothread/

    Sinon, regarde les exemples de Qt. Ils sont trés bien fait.

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

Discussions similaires

  1. [RMI] Impossible de lancer mon serveur
    Par Dahu dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 11/06/2006, 09h17
  2. [SWT]Lancer un timer
    Par FranT dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 07/06/2005, 16h37
  3. [Install]Impossible de lancer eclipse
    Par kaishef dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/05/2005, 10h02
  4. [Plugin Tomcat] Impossible de lancer TOMCAT
    Par Dahu dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 03/03/2005, 10h40
  5. impossible de lancer xmlrad
    Par hachach dans le forum XMLRAD
    Réponses: 3
    Dernier message: 07/09/2004, 16h52

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