Application qui freeze

[Résolu]
Signaler
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009
-
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009
-
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

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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.
Messages postés
721
Date d'inscription
dimanche 10 juin 2001
Statut
Membre
Dernière intervention
27 mars 2011
7
While true est une boucle infinie... Et tu n'en sort jamais ... donc ca freeze
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009

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é
Messages postés
721
Date d'inscription
dimanche 10 juin 2001
Statut
Membre
Dernière intervention
27 mars 2011
7
Thread.Sleep(1000); pour endormir le thread courant et redonner la main au reste du systeme ou alors de Application.DoEvents
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009

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é
Messages postés
721
Date d'inscription
dimanche 10 juin 2001
Statut
Membre
Dernière intervention
27 mars 2011
7
Fermer l'application, avec quoi ? du code ? et bien dans le code de ta boucle il faut insérer un Application.exit()
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009

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é
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009

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é
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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.
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009

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...
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009

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é!