Application qui freeze

Résolu
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009 - 18 août 2005 à 14:37
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009 - 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é

11 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
19 août 2005 à 19:02
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.
Tilois Messages postés 721 Date d'inscription dimanche 10 juin 2001 Statut Membre Dernière intervention 27 mars 2011 7
18 août 2005 à 14:52
While true est une boucle infinie... Et tu n'en sort jamais ... donc ca freeze
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
18 août 2005 à 16:21
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é
Tilois Messages postés 721 Date d'inscription dimanche 10 juin 2001 Statut Membre Dernière intervention 27 mars 2011 7
18 août 2005 à 17:03
Thread.Sleep(1000); pour endormir le thread courant et redonner la main au reste du systeme ou alors de Application.DoEvents

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
18 août 2005 à 20:07
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é
Tilois Messages postés 721 Date d'inscription dimanche 10 juin 2001 Statut Membre Dernière intervention 27 mars 2011 7
18 août 2005 à 20:37
Fermer l'application, avec quoi ? du code ? et bien dans le code de ta boucle il faut insérer un Application.exit()
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
19 août 2005 à 01:47
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é
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
19 août 2005 à 01:49
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é
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
19 août 2005 à 05:37
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.
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
19 août 2005 à 12:19
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...
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
19 août 2005 à 22:21
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é!
Rejoignez-nous