ivanoff1
Messages postés99Date d'inscriptionlundi 14 octobre 2002StatutMembreDernière intervention28 décembre 2005
-
6 janv. 2005 à 10:49
mschoum
Messages postés1Date d'inscriptionjeudi 24 avril 2003StatutMembreDernière intervention 8 mai 2006
-
8 mai 2006 à 15:27
Bonjour tout le monde !
J'aimerais vous relater un problème qui m'arrive dans mon projet en ce moment.
J'ai une classe externe (Socket_Serveur) et j'ai ma fenêtre principale.
Dans cette fenêtre, j'ai une ListBox où j'aimerais afficher des infos concernant le serveur, genre : conecté, envoie du message, etc ...
En respectant le principe d'une faible couplage, j'aimerais que ma classe puisse afficher ces méthodes pour n'importe quelle ListBox. Vous me suivez jusque là ?
Donc dans ma classe (Socket_Serveur), j'ai une méthode qui écoute en continu si un client demande une connexion et donc veut envoyer un message au serveur. Pour ne pas surcharger le processeur, je l'ai mise dans un thread.
Donc nous voyons bien qu'il y a deux threads, un pour afficher la fenêtre et son ensemble (écoute d'événements) et mon thread d'ecoute du port désigné. Suis-je compréhensible ?
Enfin, pour utiliser l'afficher sur n'importe quelle listbox, je déclare un nouveau membre qui est une listbox. A l'instanciation, je met la listbox de ma fenêtre. (L'instanciation se fait bien sur dans le code de la fenêtre),
Genre : Socket_Serveur serv = new Socket_Serveur(port, this.ListeBoxe);
Et bien dès que je veux afficher, j'ai une exception : du genre crossthreading interdit. Il me dit exactement : Le thread où la listbox a été instanciée n'est pas le même que celui où vous l'utilisez.
Est-ce assez clair, je l'espère ...
Voilà, sur cela, je vous laisse.
Malgré la longueur du message, j'espère avoir été clair et attends une réponse rapide de votre part (c'est assez crucial pour mon projet).
Merci d'avance. Ivanoff.
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 7 janv. 2005 à 11:46
Invoke permet d'effectuer l'action (dans notre cas l'ajout d'item) dans le contexte du thread auquel "appartient" le controle, et non dans notre thread.
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 6 janv. 2005 à 11:33
ben l'exception a l'air clair...
tu genere une listbox a partir de ton thread d'ecoute qui doit etre gerer par le thread d'affichage et il aime pas ca....
donc le mieux serait de t'arranger pour que ton thread d'ecoute passe le message a ton thread d'affichage du type "ca y est genere ton listbox..."
en gros...
Arthenius
"Il n'y a pas de mauvais développeurs,...
mais uniquement de mauvais utilisateurs..."
ivanoff1
Messages postés99Date d'inscriptionlundi 14 octobre 2002StatutMembreDernière intervention28 décembre 2005 6 janv. 2005 à 16:21
Merci d'avoir répond aussitôt !
Le problème c'est que ça ne repond pas exactement a mon problème. Certes, cela y ressemble, mais le problème est que tout se gère dans le fenêtre.
Or je veux que ce soit ma deuxième classe (Socket_Serveur) qui envoie une message à la listbox pour afficher à chaque fois que le serveur reçoit une demande de connexion un message dans la listbox.
Pour être plus clair, je vais vous donner une partie de mon code :
Pour la classe socket_serveur :
/// <summary>
/// <c>Permet de traiter chaque client en attente</c>
/// </summary>
protected
void Sockets_Connectes()
{
while (
true)
{
this.Liste_De_Lecture.Clear();
for (
int i = 0; i <
this.Ensemble_Des_Clients.Count; i++)
Et dans commencer ecoute, on a la méthode citée plus haut, celle qui pose problème.
Je suis désolé mais je en vois pas comment adapter la source ...
En effet la méthode que je vous ai présentée est placée dans une boule infinie, donc c'est à chaque "tour", donc dès qu'un client demande une connexion, qu'on affiche un message dans la listbox.
Merci d'avance, pour vos réponses, et en espérant une nouvelle réponse de votre part.
ivanoff1
Messages postés99Date d'inscriptionlundi 14 octobre 2002StatutMembreDernière intervention28 décembre 2005 7 janv. 2005 à 10:26
Je suis désolé de revenir à la charge mais j'ai un nouveau problème pour les threads.
Vu que je devais le répéter dans bon nombre de classes,j'ai décidé de faire une classe spécifique pour ce lien vers la listbox.
J'ai créé une classe mère qui est générale pour tout objet. Et j'ai créé une classe fille héritant de cette sur-classe fonctionnant pour une listbox (et j'ai l'intention de le faire pour la combo, ...)
Voila je la crée, je l'instancie dans ma classe Socket_Serveur, et là : Toujours le même problème d'illegal threads....
Je vous file le code :
Ma classe spécifique à l'affichage :
mschoum
Messages postés1Date d'inscriptionjeudi 24 avril 2003StatutMembreDernière intervention 8 mai 2006 8 mai 2006 à 15:27
Bonjour j'ai un petit problème.
Voilà j'ai un TreeView qui reconstruit l'arborescence de mon FileSystem.
J'ai activé l'option checkboxes du treeView.
lorsque je sélectionne un node, je stocke le chemin de ce node dans une arraylist.
j'ai également un watcher qui écoute et détecte lorsqu'un répertoire est créé, renommé ou supprimé.
Je voudrais donc à chaque fois remettre à jour mon treeview. pour ça j'ai suivi la méthode proposé coq ci-dessus.
Le treeview se met à jour sans problème.
Le problème est que lorsque je parcours le nouveau treeview, je fais un test du style
foreach(string s in listeRepertoireEcoute){
if(node.fullPath() == s){
node.checked = true;
}
}
afin de cocher tous les nodes qui étaient cochés avec de faire la mise à jour du treeview.
Mais cela ne fonctionne pas, aucun node n'est séléctionné. pourtant il passe bien dans la condition et passe également sur le node.checked = true.