wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 1

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» wxYield called recursively
Conversation : wxYield called recursively
07-11-2008 17:40:48  wxYield called recursively #1
sagopa (Nouveau membre)
Inscrit le : 07-11-2008
Messages: 2
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour,

j'ai une application graphique que j'aimerais faire communiquer avec une autre en utilisant les sockets. Pour cela, je me sers des classes wxTCPServer, wxTCPClient, et wxTCPCommunication. Après avoir implémenté tout ceci je me retrouve avec un assert "wxYield Called recursively" du côté du serveur, lorsque plusieurs clients sont connectés. Après quelques recherches on m'a dit de créer un thread par socket client. Ainsi j'ai décidé de modifier les classes wxTCP.. afin d'ajouter la partie thread, mais hélas je n'ai pas réussi à le faire fonctionner correctement.
Donc je pense me rabattre sur les classes wxSocketBase et autres. Le problème c'est que je n'ai pas envi de perdre encore beaucoup de temps à essayer de comprendre ces classes, surtout que je ne suis pas sûr que cela va régler mon problème.

Alors est-ce que quelqu'un connaît ce problème de wxYield ?
Où est-ce que je pourrai trouver un tuto complet sur wxSockets avec wxThread ?
Merci.

PS: Stack: wxSocketBase::Read -> ::_Read ->::WaitForRead ->::_Wait -> wxYield
07-11-2008 21:26:17  Re: wxYield called recursively #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut, et bienvenue.

Peux-tu mettre un peu plus de code, qu'on puisse voir ce qui cloche ?
Le wxYield, c'est toi qui l'a ajouté, ou tu l'as pris dans un exemple ?

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
08-11-2008 10:54:26  Re: wxYield called recursively #3
sagopa (Nouveau membre)
Inscrit le : 07-11-2008
Messages: 2
Snippets: 0
Tutoriels: 0
Hors ligne
Merci.

Non ce n'est pas moi qui ait ajouté le wxYield. Il est appelé dans la classe wxSocketBase de la lib (fichier socket.cpp); dans la fonction _Wait(long seconds, long milliseconds, wxSocketEventFlags flags) plus exactement.

Voici les classes que j'ai créés du côté du serveur:
class MyServer : public wxServer ET
class MyConnection : public wxConnection
Pour cela, je me suis servi de l'exemple donné dans la lib.

Les classes wxServer et wxConnection se servent des classes wxSocketBase, wxSocketServer, etc.

Si on regarde la fonction _Wait dont j'ai parlé précédemment, une macro PROCESS_EVENTS() est en réalité appelée:

#if wxUSE_THREADS
    #define PROCESS_EVENTS()        \
    {                               \
        if ( wxThread::IsMain() )   \
            wxYield();              \
        else                        \
            wxThread::Yield();      \
    }
#else // !wxUSE_THREADS
    #define PROCESS_EVENTS() wxYield()
#endif // wxUSE_THREADS/!wxUSE_THREADS

Mon programme entre toujours dans la ligne wxYield(); (en jaune)
Pour éviter cela, il faudrait créer un thread par socket pour que ça rentre dans la ligne suivante : wxThread::Yield(); Mais je ne sais pas comment faire..

Quelle partie de mon code voudrais tu voir plus exactement ?
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» wxYield called recursively