begin process at 2012 02 13 05:41:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Passer des arguments à un Thread & framework 2.0


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Passer des arguments à un Thread & framework 2.0

dimanche 29 octobre 2006 à 02:33:33 | Passer des arguments à un Thread & framework 2.0

nico971gwada

Salut,

Je dois faire une interface graphique qui permet de s'échanger des fichiers xml.
Sans trop rentrer dans les détails je dois faire 2 serveur UDP écoutant 2 ports différents, 1 client UDPBroadast et 1 serveur TCP multithreadé.
Le problème c'est que je suis une quiche en c++.
Je n'en suis qu'au début et je m'attaque au deux serveur UDP. J'ai pensé faire un thread mais je ne sais pas comment lui passer des arguments (en l'occurence le numéro du port qu'il doit écouter).
De plus au moment où je souhaite récupérer le nombre de bytes reçus en exécutant :
<code>
count = socket_udp->ReceiveFrom(buffer_reception,_port_distant);
</code>
Ma fenetre se gèle. En mode débug je ne remarque rien de particulier.
Help!!!!

Merci d'avance.

dimanche 29 octobre 2006 à 09:57:57 | Re : Passer des arguments à un Thread & framework 2.0

juju12

Pour le thread, tu utilises la fonction CreateThread : l'argument lpParameter est un pointeur vers une structure contenant les arguments que tu souhaites passer, ou bien directement un pointeur sur une donnée (le numéro du port par exemple).
dimanche 29 octobre 2006 à 12:59:08 | Re : Passer des arguments à un Thread & framework 2.0

nico971gwada

Merci Juju, ça marche nikel pour le passage d'argument. Par contre g toujours ce problème de fenetre figée.
Voici une partie de mon code. Si quelqu'un comprend ce qui se passe...

<code>
try {
                    // On construit la socket.
                    socket_udp = gcnew System::Net::Sockets::Socket(
                        System::Net::Sockets::AddressFamily::InterNetwork,
                        System::Net::Sockets::SocketType::Dgram,
                        System::Net::Sockets::ProtocolType::Udp);

                    adresse_locale = Net::IPAddress::Parse("127.0.0.1");
                    port_local   = gcnew System::Net::IPEndPoint(adresse_locale, port);
                    _port_distant = gcnew System::Net::IPEndPoint(adresse_locale, port);
                    socket_udp->Bind(port_local);

                    // On alloue le buffer de réception
                    buffer_reception = gcnew array<System::Byte>(10000);
                    while(1) {
                        this->labelVortex->Text="Vortex ouvert";
                        count = socket_udp->ReceiveFrom(buffer_reception,_port_distant);

                        port_distant = dynamic_cast<System::Net::IPEndPoint^>(_port_distant);

                        // Le buffer de réception contient quelque chose du genre:
                        // 20004\nMon message
                        // Dont il faut extraire, de la suite '2' '0' '0' '0' '4'
                        // la valeur entière 20004.

                        mem_stream = gcnew System::IO::MemoryStream(buffer_reception,0,count);
                        parser = gcnew System::IO::StreamReader(mem_stream); // Lit de l'ascii
                        message = parser->ReadLine();      // Lit "20004\n" et vaut "20004"
                        // Là, on ReadLine a lu tout le stream (???) et
                        // mem_stream->get_Position() retourne la valeur 11
                        // Pour un message 20004\nHello (qui a 11 caractères).
                        // Donc je dois recalculer la position dans mon stream à la main...

                        port_reponse = System::Int32::Parse(message);
                        pos = message->Length + 1;
                        System::Console::WriteLine(
                            "Port reponse = {0}, pos = {1}",
                            System::Convert::ToString(port_reponse),
                            System::Convert::ToString(pos));
                        message = System::Text::Encoding::ASCII->GetString(
                            buffer_reception,pos, count);
                        System::Console::WriteLine("Recu : ");
                        System::Console::Write("  Message : ");
                        System::Console::WriteLine(message);
                        System::Console::WriteLine("       de : {0}",port_distant->Address);
</code>

En rouge la ligne qui gèle tout. Voilà si quelqu'un comprend pourkoi ça marche pas ce serait cool.

dimanche 29 octobre 2006 à 14:50:00 | Re : Passer des arguments à un Thread & framework 2.0

nico971gwada

J'ai trouvé d'où venait le problème mais je ne sais pas comment le résoudre.
Quand mon thread UDPserveur s'exécute, il doit mettre à jour certains controles sur ma windowsform. Donc dans la méthode UDPServeur avec laquelle j'appelle mon thread, j'ai mis un :

if (this->labelVortex->InvokeRequired)
            {
                array<Object^>^ toto = {obj};
                this->Invoke(gcnew MaMethode(this, &Fenetre_principale::UDPServeur), toto );
             }
else{...le vrai corps de la fonction...}

Le Invoke a apparement pour effet d'annuler l'intéret du thread puisqu'après ma fenetre se fige au moment d'aborder ma boucle while(true) (voir message précédant).
Je ne sais pas comment faire. Mon serveur doit passer des messages à ma windowsForm et doit tourner en boucle alors je suis coincé.
Please help!!!
dimanche 29 octobre 2006 à 22:30:17 | Re : Passer des arguments à un Thread & framework 2.0

badrbadr

juste comme ça, y a pas de BeginInvoke() ?

[:D] @++
dimanche 29 octobre 2006 à 22:56:32 | Re : Passer des arguments à un Thread & framework 2.0

nico971gwada

Quelle est la différence entre invoke et beginInvoke?

Sinon j'ai trouvé un moyen peu élégant (mais bon ça fonctionne) de résoudre mon problème.
En fait j'ai crée des fonctions spécifiques pour chaque control de ma windowsForm que je veux modifier et j'apelle ces fonctions quand j'en ai besoin. Je m'explique:

monThread :
void monThread(Object^ obj){
                                              ....................
                                              while(true){
                                                               array<Object^>^ toto = {this->labelVortex,"Vortex  ouvert"};
                                                               this->Invoke(upControl, toto);
                                                               ........................
                                              }
}

upControl:
void UpdateControl(Control^ cont, String^ s){
             cont->Text = s;
}
Je sais c'est un peu moche mais j'ai pas trouvé mieux pour l'instant.
Si quelqu'un a une idée...

lundi 30 octobre 2006 à 01:06:44 | Re : Passer des arguments à un Thread & framework 2.0

badrbadr

Salut, je ne connais rien en C++/CLI.
Mais en .net en général, BeginInvoke invoke ton contrôle d'une manière asynchrome (qui ne bloque pas ton thread).
Ca revient en plus élégant à ce que t'as fait, c'est à dire créer un nouveau thread pour chaque invoke.
Regarde du côté de MSDN la-dessus. Sur CodeProject, un article en parle [ Lien ]

Bonne chance

[:D] @++
lundi 30 octobre 2006 à 02:06:54 | Re : Passer des arguments à un Thread & framework 2.0

nico971gwada

J'ai essayé avec BeginInvoke et j'ai pas eu de meilleurs résultats.
Finalament je pense que je vais me contenter de ma solution un peu sale.
Merci en tout cas ;)


Cette discussion est classée dans : serveur, thread, passer, udp, arguments


Répondre à ce message

Sujets en rapport avec ce message

Thread et serveur UDP [ par nico971gwada ] Salut,J'ai fait une IHM qui doit démarrer un serveur UDP à partir de l'appuie sur un bouton. Puis en réapuyant sur ce même bouton je voudrais arreter Problème d'arret de thread (MFC) [ par swinteur ] Me revoila! lolBon alors j'explique mon probleme.Lorsque mon serveur se lance, il crée un Thread qui gere la connexion.A la fin de l'execution de la t perte de paquets UDP dans un thread quand l'autre thread fait un write() [ par fabricius ] Hello,Voila mon problème, ca fait bien une semaine que je suis dessus...J'ai écrit un soft qui écoute une socket UDP, qui reçoit des paquets et qui le Passer des arguments via les événements [ par billou_13 ] Voila, j'aimerais avoir votre avis sur la question : quel est pour vous le meilleur moyen de passer des arguments via une événement.Je m'explique. Un Client UDP avec CAsyncsocket [ par underdog08 ] Bonjour,Je doit réaliser une communication client serveur UDP en mfc avec CAsyncsocket, je suis débutant en programmation et j'ai difficilement réussi Thread & Socket [ par katerson ] Bonjour tout le monde! Je travaille actuellement sur un projet serveur/client sur UDP. Mon serveur comporte 3 threads qui doivent scruter (indépenda Meilleur solution pour serveur MMORPG. [ par LA_Tupac ] Bonjour à tous! voila ma question: Je développe actuellement mon premier jeu en réseau. Le socket d'envoi du client est en tcp et le socket d'envoi du Passage de paramètres [ par deck_bsd ] Bonjour/bonsoir a tous,Voila , dans la fonction créate thread il y a un paramètre de type LPVOID qui permet de passer des paramètres au thread. Bon po Question sur Thread dans mon serveur multithread [ par Nixeus ] Bonjour a tous !J'ai récupérer un code source d' un serveur multithread multi client, en mode console.J'ai repris les classes et j'ai porté ce program Client/Serveur UDP sur 1 unique machine ! [ par sena ] Bonjour,j'ai fais deux programmes :un client et un serveur UDP.Ceux ci fonctionnent bien quand je les fait communiquer sur 2 machines différentes.Ce q


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,406 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales