Application qui freeze [Résolu]

warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 18 août 2005 à 14:37 - Dernière réponse : warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention
- 19 août 2005 à 22:21
Bonjour
j'ai un probleme avec une application...
je veux faire un petit serveur qui fonctionnerai en TCP
il marche mais mal: je ne peux pas le fermer... et je n'ai plus de controle sur la form une fois lancée

voila le code:

<HR>

using System;


using System.Drawing;


using System.Collections;


using System.ComponentModel;


using System.Windows.Forms;


using System.Data;


using System.Net.Sockets;


using System.Net;


namespace pagserveur


{



/// <summary>



/// Summary description for Form1.



/// </summary>



public
class Form1 : System.Windows.Forms.Form


{



/// <summary>



/// Required designer variable.



/// </summary>



private System.ComponentModel.Container components =
null;



private Socket socket =
null;



private System.Windows.Forms.TextBox tbhide;



private TcpListener listener =
null;



public Form1()


{



//



// Required for Windows Form Designer support



//


InitializeComponent();


connex();



//



// TODO: Add any constructor code after InitializeComponent call



//


}



/// <summary>



/// Clean up any resources being used.



/// </summary>



protected
override
void Dispose(
bool disposing )


{



if( disposing )


{



if (components !=
null)


{


components.Dispose();


}


}



base.Dispose( disposing );


}


#region Windows Form Designer generated code



/// <summary>



/// Required method for Designer support - do not modify



/// the contents of this method with the code editor.



/// </summary>



private
void InitializeComponent()


{



this.tbhide =
new System.Windows.Forms.TextBox();



this.SuspendLayout();



//



// tbhide



//



this.tbhide.BorderStyle = System.Windows.Forms.BorderStyle.None;



this.tbhide.Location =
new System.Drawing.Point(0, 0);



this.tbhide.Name = "tbhide";



this.tbhide.Size =
new System.Drawing.Size(112, 13);



this.tbhide.TabIndex = 0;



this.tbhide.Text = "";



//



// Form1



//



this.AutoScaleBaseSize =
new System.Drawing.Size(5, 13);



this.ClientSize =
new System.Drawing.Size(115, 14);



this.ControlBox =
false;



this.Controls.Add(
this.tbhide);



this.Name = "Form1";



this.Text = "Form1";



this.ResumeLayout(
false);


}


#endregion



/// <summary>



/// The main entry point for the application.



/// </summary>


[STAThread]



static
void Main()


{


Application.Run(
new Form1());


}



private
void connex()


{



try


{


Socket s =
new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);


listener =
new TcpListener(80);



while (
true)


{


listener.Start();


s = listener.AcceptSocket();



if (s.Connected)


{


reception(s);


}


}


}



catch(SocketException e)


{


MessageBox.Show(e.ToString());


}


}


<HR>
je ne met pas la suite car elle ne pose pas de problemes
lorsque je lance le serveur, la fenetre ne s'affiche pas. elle ne s'affiche QUE si je met this.show() DANS la fonction connex() et AVANT le try{}
si je met ça dans le form1() ça s'affiche pas , de meme si je met autre part dans le code.
par exemple aussi, si je met tbhide.text = "coucou" avant le try dans connex() le textbox correspondant se met a jour. sinon ça ne marche pas

dans le meme genre si je met un application.exit() ça ne quitte pas l'application. quelque soit l'endroit ou je le met
j'ai alors pensé à faire un thread pour connex()
mais sans succes
des idées?

la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Afficher la suite 

Votre réponse

11 réponses

Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 19 août 2005 à 19:02
+3
Utile
Mieux vaut ne pas créer de forme principale si c'est juste pour la masquer.

Tu peux supprimer le socket "s" il n'a aucune utilité, du moins dans le code tel qu'il est plus haut, la classe Socket permet d'utiliser differents protocoles alors que TcpListener/TcpClient simplifie l'utilisation du protocole TCP/IP.

protected override void OnLoad( EventArgs e )
{
// base.OnLoad( e );

// Ici si tu as créé ta forme avec Application.Run( new MyForm( ) )
// il y'a une boucle de message, tu peux utiliser Form.Close ou Application.Exit

Connex( ); // Ca va encore se bloquer.
}

Connex va encore être bloquante à cause des méthodes AcceptSocket ou AcceptTcpClient. Je pense qu'il faudrait pogrammer ca de manière asynchrone et si tu restes dans une boucle il faudra un Application.DoEvents pour traiter les messages en attentes.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Lutinore
Tilois 721 Messages postés dimanche 10 juin 2001Date d'inscription 27 mars 2011 Dernière intervention - 18 août 2005 à 14:52
0
Utile
While true est une boucle infinie... Et tu n'en sort jamais ... donc ca freeze
Commenter la réponse de Tilois
warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 18 août 2005 à 16:21
0
Utile
oui j'y ai pensé
mais tu vois le truc c'est que quand j'enleve ce while mon serveur ne marche plus car il n'attend pas en continu une connexion
d'ou le thread. mais meme avec le thread ça ne marche pas
alors si j'enleve le while comment faire pour que le serveur attende indefiniment une connexion?

la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Commenter la réponse de warenbe
Tilois 721 Messages postés dimanche 10 juin 2001Date d'inscription 27 mars 2011 Dernière intervention - 18 août 2005 à 17:03
0
Utile
Thread.Sleep(1000); pour endormir le thread courant et redonner la main au reste du systeme ou alors de Application.DoEvents
Commenter la réponse de Tilois
warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 18 août 2005 à 20:07
0
Utile
bon je peux essayer
mais une question me turlupine... est ce que si je laisse le while et que je fais un thread et que j'utilise thread.sleep je pourai quitter l'application?
car si le while est infini , pourquoi l'application quitterai avec un thread.sleep ?
si ce n'est pas le cas comment pourrais je "termnier" le thread
j'ai essayé avec application.threadclose (ou un truc dans le genre) mais ça n'a pas marché

la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Commenter la réponse de warenbe
Tilois 721 Messages postés dimanche 10 juin 2001Date d'inscription 27 mars 2011 Dernière intervention - 18 août 2005 à 20:37
0
Utile
Fermer l'application, avec quoi ? du code ? et bien dans le code de ta boucle il faut insérer un Application.exit()
Commenter la réponse de Tilois
warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 19 août 2005 à 01:47
0
Utile
je vais essayer. :)
bon pour tester j'ai donc mis un application.exit() en plein dans ma boucle... sans effets!
l'application ne se ferme pas, rien ne se passe...
bref donc ça doit venir d'autre chose. ce qui me semblait bien vu que j'avais essayé de faire sans la boucle while et que ça n'avait pas eu d'effets...

la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Commenter la réponse de warenbe
warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 19 août 2005 à 01:49
0
Utile
pour confirmer ce que je viens de dire, j'ai fait un changement a ma boucle while de maniere à ce que la condition "false" arrive a un moment... meme en faisant ça pas moyen de quitter l'application; je n'ai toujours pas le controle sur la form
donc le fait que l'app freeze ne vient pas de la boucle.
une autre idée? ;)

la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Commenter la réponse de warenbe
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 19 août 2005 à 05:37
0
Utile
Salut,

Première chose que je ne comprends pas, tu crées un socket "s" qui est écrasé 3 lignes aprés, ca sert à rien et tu perds des ressources.

A la place de AcceptSocket utilise plutôt AcceptTcpClient, c'est plus simple.

Le problème c'est pas vraiment la boucle c'est surtout que AcceptSocket et AcceptTcpClient sont des methodes bloquantes.

Ta forme ne s'affiche pas parce que tu ne sors jamais du constructeur, ( Connex est appelée dans le constucteur ), la méthode Application.Run n'est donc jamais executée et tu n'as pas de boucle de messages, ta forme ne peut pas répondre, tu peux juste l'afficher avec "Show" ou "Visible = true" dans le constructeur, et Application.Exit ou Close ne marche pas pour la même raison.
Commenter la réponse de Lutinore
warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 19 août 2005 à 12:19
0
Utile
ok mais dans ce cas quand dois je appeler connex()?
a l'origine ce serveur va afficher des boites de dialogues ou des fenetres quand un utilisateur rentre un texte sur un ordinateur client. celui ci rentre son texte, choisi quelle type de fenetre va apparaitre sur l'ordinateur cible, et le serveur lance la fenetre choisie avec le texte approprié.
donc je n'ai pas besoin que la forme principale soit visible. au contraire. par contre les autres formes le seront. le truc qui me genais etait que ça marchait mais que le fait que je ne puise specifier a la forme d'etre cachée (et qu'elle le fasse quand meme) me faisait penser que le code etait cochon

je vais donc essayer AcceptTcpClient. reste a savoir ou et comment lancer ma fonction connex()
jusqu'a maintenant je lançais toujours mes fonctions depuis le constructeur...
Commenter la réponse de warenbe
warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 19 août 2005 à 22:21
0
Utile
Ok j'ai compris
je vais essayer de faire ça de maniere asynchrone et si je galere trop (c pressé :)) j'utiliserai application.doevents!

merci tu m'as bien aidé!
Commenter la réponse de warenbe

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.