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

wxWidgets Discussion :

wxNoteBook + dynamique Addpage => freeze


Sujet :

wxWidgets

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut wxNoteBook + dynamique Addpage => freeze
    Bonjour à tous,

    Je n'ai pas l'habitude de solliciter les gens sur les forums (mais plutôt me servir de ce qui a déjà été analysé et résolu), car j'aime bien trouver par moi-même et essayer de ne pas "redonder" les mêmes questions. Mais, là, je ne vois plus où chercher ...

    Mon problème est le suivant :

    J'ai développé une appli graphique en C++/wxWigdet 2.8.6 (Win XP Pro SP2) dans laquelle un wxThread gère une boucle while permettant d'écouter, via un socket client, les trames arrivant d'un serveur dédié.

    En réponse à une trame spécifique du serveur, ce thread ajoute une page dans le wxNoteBook de mon GUI (dans la wxFrame principale).

    En test, je la vois bien se créer, mais c'est tout ... l'appli se freeze ... (avec obligation de killer le process).

    Toutefois si j'exécute le même code dans une méthode répondant à un évènement initié par l'utilisateur (clic sur un bouton, menu ... etc ...) ça fonctionne (pas de freeze).

    Donc le code de création de la page me paraît être correcte (et est assez basic au demeurant), mais fonctionne à moitié dans un Thread ... (dans lequel je passe une référence de la wxFrame principale contenant ce wxNoteBook).

    Quelqu'un saurait-il si cela est un bug connu ou bien, quelle serait la raison de ce "comportement inattendu" ?

    Merci pour votre aide,
    Bonne journée.
    leXof

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Il me semble que c'est normal car toutes les opérations sur la GUI doivent s'effectuer dans un seul thread, le thread principal. C'est une limitation de wxWidgets.

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Oui c'est normal, pour résoudre ton problème il faut utiliser un "PendingEvent" sur ta "main frame", message qui va s'éxécuter dans ta frame principale.

    Avec le semaphore tu vas attendre que tout a bien été créé avant de continuer dans ton thread courant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    wxSemaphore semaphore(0, 1);
     
    		wxCommandEvent tEvent( wxEVT_LC_EXECUTE_IN_MAIN_THREAD, mMainFrame->GetId() );
    		tEvent.SetClientData( ..."tes data"...), &semaphore) );
    		tEvent.SetEventObject( mMainFrame );
    		mMainFrame->GetEventHandler()->AddPendingEvent( tEvent );
     
    		if(semaphore.Wait() == wxSEMA_NO_ERROR);
    			...
    Sinon utiliser http://docs.wxwidgets.org/2.8.6/wx_threadfunctions.html pour dessiner quelque chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        wxMutexGuiEnter();
     
        // Call GUI here:
        my_window->DrawSomething();
     
        wxMutexGuiLeave();

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut
    Bonjour,

    Oui je confirme que wxWidget n'est pas "Thread Safe". Pour contourner ce point, j'ai :

    - Utilisé les wxSocket (client et serveur)
    - Utilisé les évènements qui leurs sont associés (voir plus bas)
    - le tout dans le Thread principal.

    Et ça marche nickel !!!!

    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
    /*tables des évènements*/
    BEGIN_EVENT_TABLE(myAppli,wxFrame)
        //(*EventTable(myAppli)
        //*)
        EVT_SOCKET(ID_CSOCKET, myAppli::OnSocketEvent)
    END_EVENT_TABLE()
    /**/
     
    /*instanciation du socket client*/
    csocket = new wxSocketClient();
    csocket->SetEventHandler(*this, ID_CSOCKET);
    csocket->SetNotify(wxSOCKET_CONNECTION_FLAG | wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
    csocket->Notify(true);
    /**/
     
    /*le socket event handler*/
    void myAppli::OnSocketEvent(wxSocketEvent& event)
    {
        ...
    }
    /**/
    Merci pour vos réponses

    Christophe

    NB : je passe le thread en "Résolu"

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Je vais faire un peu de "pub" pour un autre composant, je te conseil wxflatnotebook qui est très bien, il faut essayer, voila

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

Discussions similaires

  1. Creation de fiche dynamique
    Par Mouss26 dans le forum C++Builder
    Réponses: 7
    Dernier message: 24/07/2002, 07h56
  2. comment creer un alias dynamique avec BDE et ODBC
    Par david33 dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/07/2002, 11h50
  3. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36
  4. Réponses: 4
    Dernier message: 13/05/2002, 16h43
  5. repertoire temp dynamique
    Par killpilot dans le forum C
    Réponses: 2
    Dernier message: 26/04/2002, 16h19

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