Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide Recherche
328 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [Visual C++] Thread pour prog serveur/client

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Visual C++] Thread pour prog serveur/client

n°1970940
Romiinet
Kei ?
Posté le 03-03-2010 à 18:17:19  profilanswer
 

Bonjour,
 
je cherche a crée un programme serveur capable de communiquer avec un client.
 
comme je n'en n'est jamais crée en C j'ai télécharger un code source comme modèle.
 
j'utilise des fonction bloquante donc je dois obligatoirement faire des thread...
 
 
 
 
 
alors je vous explique mon problème :
 
j'ai crée un projet Windows Forms avec visual C++
 
dans Form1.h :
Ligne 26: crée le Thread

Code :
  1. public ref class Form1 : public System::Windows::Forms::Form
  2.     {
  3.      public:
  4.            Form1(void)
  5.            {
  6.                   InitializeComponent();
  7.                  myThread=gcnew Thread(gcnew ThreadStart(this, &Serveur));
  8.            }
  9. ...


Ligne 153: lance le Thread quand on clique sur BT_Start( = Bouton)

Code :
  1. private: System::Void BT_Start_Click(System::Object^  sender,System::EventArgs^  e) {
  2.             if(!connected){
  3.                 myThread->Start();
  4. ...


Ligne 172: lance un TcpListener avec TB_Port( = textbox qui contiens le numéro du port de connexion)

Code :
  1. static void Serveur()
  2. {
  3.     String^message;
  4.     server = gcnew TcpListener(Convert::ToInt16(TB_Port->Text));
  5.        server->Start();
  6. ...


 
 
 
 
alors voila ça fait 2jour que je bidouille ce code en suivant des tuto mais j'enchaine des erreur de plus en plus chevelue  :heink:  
 
dans le meilleur des cas je n'est que ses deux erreur :
 
(32)error C3350: 'System::Threading::ThreadStart' : un constructeur délégué attend 1 argument(s)
 
(176)error C2227: la partie gauche de '->Text' doit pointer vers un type class/struct/union/générique
 
 
je vois es souligner les ligne qui "bug".
 
 
 
 
 
donc en gros, je ne peu pas mettre "this" comme argument dans ma fonction ThreadStart,
 
avec seulement "ThreadStart(&Serveur)" sa passe mais j'ai la seconde erreur qui persiste...
 
il ne me dit pas que TB_Port n'est pas déclaré mais je ne peut pas lire ce qui s'y trouve  :??:  
 
 
 
un peut d'aide ne serait pas de refus car la j'en est mare de me farcir des tuto qui ne m'avance à pas grand chose  :D
 
merci


---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
mood
Publicité
Posté le 03-03-2010 à 18:17:19  profilanswer
 

n°1971603
Romiinet
Kei ?
Posté le 06-03-2010 à 15:33:17  profilanswer
 

up !
 
personne ?


---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1971735
breizhbugs
Posté le 07-03-2010 à 13:04:56  profilanswer
 

Ton programme est pas clair!  
As tu déjà fais un client serveur en mode texte?
 
Regarde bien la doc des thread pour vérifier que tu t'y prends de la bonne façon :
http://msdn.microsoft.com/en-us/library/ts553s52.aspx

n°1971772
Romiinet
Kei ?
Posté le 07-03-2010 à 17:41:02  profilanswer
 

Salut merci pour ta réponse.

 

appartement j'ai tout ce qui me faut dans le programme par rappor a ton exemple.

 

sauf que pour moi la "public ref class ServerClass"

 

c'est "public ref class Form1"

 


et que mon "ThreadStart()" est dans la classe d'où le "this" en 1er paramètre.

 

ce qui donne : ThreadStart(this, &Serveur)

 


j'ai aussi sa ligne 56:

Code :
  1. private: Threading::Thread ^myThread;

 

si sa peut aider ^^


Message édité par Romiinet le 07-03-2010 à 17:42:32

---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1971819
breizhbugs
Posté le 07-03-2010 à 22:24:13  profilanswer
 

Romiinet a écrit :


Code :
  1. public ref class Form1 : public System::Windows::Forms::Form
  2.     {
  3.      public:
  4.            Form1(void)
  5.            {
  6.                   InitializeComponent();
  7.                  myThread=gcnew Thread(gcnew ThreadStart(this, &Serveur));
  8.            }
  9. ...




Quand je regarde le code c++ http://msdn.microsoft.com/en-us/li [...] start.aspx
je me dis que ton &Serveur est incorrect et devrait ressembler à peut etre &Form1::Serveur
 
 
Il faudrait que tu mette tout le code pour être sur...
 
 
Pour l'erreur (176)error C2227: la partie gauche de '->Text' doit pointer vers un type class/struct/union/générique , je pense que tu as mal orthographié TB_Port (c'est un widget texte?)

n°1971824
Romiinet
Kei ?
Posté le 07-03-2010 à 23:09:05  profilanswer
 

TB_Port est une TextBox j'ai vérifier l'orthographe c'est ok.

 

voila tout le code de ma Form1 :

 


Code :
  1. #pragma once
  2. bool connected = false;
  3. namespace Serveur {
  4. using namespace System;
  5. using namespace System::IO;
  6. using namespace System::ComponentModel;
  7. using namespace System::Collections;
  8. using namespace System::Windows::Forms;
  9. using namespace System::Data;
  10. using namespace System::Drawing;
  11. using namespace System::Net;
  12. using namespace System::Net::Sockets;
  13. using namespace System::Threading;
  14. using namespace System::Drawing::Imaging;
  15. public ref class Form1 : public System::Windows::Forms::Form
  16. {
  17. public:
  18.  Form1(void)
  19.  {
  20.   InitializeComponent();
  21.   myThread=gcnew Thread(gcnew ThreadStart(this, &Serveur));
  22.  }
  23. protected:
  24.  /// <summary>
  25.  /// Nettoyage des ressources utilisées.
  26.  /// </summary>
  27.  ~Form1()
  28.  {
  29.   if (components)
  30.   {
  31.    if (myThread->IsAlive) myThread->Abort();
  32.    delete components;
  33.   }
  34.  }
  35. private: System::Windows::Forms::TextBox  ^TB_Port;
  36. protected:
  37. private: System::Windows::Forms::Button ^BT_Start;
  38. private: System::Windows::Forms::Label ^LB_ONOFF;
  39. private: System::Windows::Forms::RichTextBox ^RTB_Log;
  40. private: System::Windows::Forms::ProgressBar ^PB_Load;
  41. //pour le serveur :
  42. private: Threading::Thread ^myThread;
  43. //static car utilisé dans le thread
  44. private: static TcpListener ^server;
  45. private: static TcpClient ^client;
  46. //stream pour lire/ecrire sur le socket
  47. private: static NetworkStream ^stream;
  48. // pour le lecteur binaire sur le socket (plus pratique)
  49. private: static BinaryWriter ^socketbinwrite;
  50. private: static BinaryReader ^socketbinread;
  51. //binary Reader sur les fichiers
  52. private: static BinaryReader ^FichierBinReader;
  53. private: static BinaryWriter ^FichierBinWrite;
  54. private:
  55.  /// <summary>
  56.  /// Variable nécessaire au concepteur.
  57.  /// </summary>
  58.  System::ComponentModel::Container ^components;
  59. #pragma region Windows Form Designer generated code
  60.  /// <summary>
  61.  /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
  62.  /// le contenu de cette méthode avec l'éditeur de code.
  63.  /// </summary>
  64.  void InitializeComponent(void)
  65.  {
  66.   System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
  67.   this->TB_Port = (gcnew System::Windows::Forms::TextBox());
  68.   this->BT_Start = (gcnew System::Windows::Forms::Button());
  69.   this->LB_ONOFF = (gcnew System::Windows::Forms::Label());
  70.   this->RTB_Log = (gcnew System::Windows::Forms::RichTextBox());
  71.   this->PB_Load = (gcnew System::Windows::Forms::ProgressBar());
  72.   this->SuspendLayout();
  73.   //
  74.   // TB_Port
  75.   //
  76.   this->TB_Port->Location = System::Drawing::Point(12, 12);
  77.   this->TB_Port->Name = L"TB_Port";
  78.   this->TB_Port->Size = System::Drawing::Size(49, 20);
  79.   this->TB_Port->TabIndex = 0;
  80.   this->TB_Port->Text = L"8085";
  81.   //
  82.   // BT_Start
  83.   //
  84.   this->BT_Start->Location = System::Drawing::Point(67, 10);
  85.   this->BT_Start->Name = L"BT_Start";
  86.   this->BT_Start->Size = System::Drawing::Size(75, 23);
  87.   this->BT_Start->TabIndex = 1;
  88.   this->BT_Start->Text = L"Démarrer";
  89.   this->BT_Start->UseVisualStyleBackColor = true;
  90.   this->BT_Start->Click += gcnew System::EventHandler(this, &Form1::BT_Start_Click);
  91.   //
  92.   // LB_ONOFF
  93.   //
  94.   this->LB_ONOFF->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
  95.    static_cast<System::Byte>(0)));
  96.   this->LB_ONOFF->Location = System::Drawing::Point(220, 9);
  97.   this->LB_ONOFF->Name = L"LB_ONOFF";
  98.   this->LB_ONOFF->Size = System::Drawing::Size(52, 23);
  99.   this->LB_ONOFF->TabIndex = 2;
  100.   this->LB_ONOFF->Text = L"[OFF]";
  101.   this->LB_ONOFF->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
  102.   //
  103.   // RTB_Log
  104.   //
  105.   this->RTB_Log->Location = System::Drawing::Point(12, 40);
  106.   this->RTB_Log->Name = L"RTB_Log";
  107.   this->RTB_Log->Size = System::Drawing::Size(260, 260);
  108.   this->RTB_Log->TabIndex = 3;
  109.   this->RTB_Log->Text = L"";
  110.   //
  111.   // PB_Load
  112.   //
  113.   this->PB_Load->Location = System::Drawing::Point(12, 306);
  114.   this->PB_Load->Name = L"PB_Load";
  115.   this->PB_Load->Size = System::Drawing::Size(260, 14);
  116.   this->PB_Load->TabIndex = 4;
  117.   //
  118.   // Form1
  119.   //
  120.   this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
  121.   this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
  122.   this->ClientSize = System::Drawing::Size(284, 332);
  123.   this->Controls->Add(this->PB_Load);
  124.   this->Controls->Add(this->RTB_Log);
  125.   this->Controls->Add(this->LB_ONOFF);
  126.   this->Controls->Add(this->BT_Start);
  127.   this->Controls->Add(this->TB_Port);
  128.   this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
  129.   this->Icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon" )));
  130.   this->Name = L"Form1";
  131.   this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
  132.   this->Text = L"Serveur de Test";
  133.   this->ResumeLayout(false);
  134.   this->PerformLayout();
  135.  }
  136. #pragma endregion
  137.  private: System::Void BT_Start_Click(System::Object^  sender, System::EventArgs^  e) {
  138.   if(!connected){
  139.    myThread->Start();
  140.    this->Text = "Thread Start";
  141.    this->BT_Start->Text = "Arrêter";
  142.    this->LB_ONOFF->Text = "[ON]";
  143.   }else{
  144.    myThread->Abort();
  145.    server->Stop();
  146.    this->Text = "Thread Stop";
  147.    this->BT_Start->Text = "Démarrer";
  148.    this->LB_ONOFF->Text = "[OFF]";
  149.    myThread->Sleep(500);
  150.    myThread->Abort();
  151.   }
  152.   this->TB_Port->Enabled = connected;
  153.   connected = !connected;
  154.  }
  155.  static void Serveur(){
  156.   String^message;
  157.   server = gcnew TcpListener(TB_Port->Text);
  158.   server->Start();
  159.   //RTB_Log->AppendText("Serveur démaré, attente de client...\n" );
  160.   client = server->AcceptTcpClient();
  161.   stream = client->GetStream();
  162.   socketbinread = gcnew BinaryReader(stream);
  163.   socketbinwrite = gcnew BinaryWriter(stream);
  164.   //RTB_Log->AppendText("client connecté\n" );
  165.   //boucle de reception des messages
  166.   while(message=socketbinread->ReadString())
  167.   {
  168.    // ------------------------
  169.    //  # Commande
  170.    // ------------------------
  171.   }
  172.  }
  173. };
  174. }
  

sa ne fonctionne toujours pas,

 

merci pour ton aide =)


Message édité par Romiinet le 07-03-2010 à 23:11:23

---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1972056
breizhbugs
Posté le 08-03-2010 à 19:03:03  profilanswer
 


Code :
  1. public ref class Form1 : public System::Windows::Forms::Form
  2.     {
  3.      public:
  4.            Form1(void)
  5.            {
  6.                   InitializeComponent();
  7.                  myThread=gcnew Thread(gcnew ThreadStart(this, &Serveur));
  8.            }
  9. ...


Bon j'ai mis    myThread=gcnew Thread(gcnew ThreadStart(this,&Form1::Serveur));
 

Code :
  1. static void Serveur()
  2. {
  3.     String^message;
  4.     server = gcnew TcpListener(Convert::ToInt32( TB_Port->Text));
  5.        server->Start();
  6. ...


Dans la déclaration de Serveur, il faut enlever le static sinon il a pas accès a des composants non static!
 
Ca compile avec quelques warnings.
Sinon quand on lance le serveur, qu'on l'arrete, on a une erreur si on le redemarre (via le bouton démarrer/arrêter)

n°1972209
Romiinet
Kei ?
Posté le 09-03-2010 à 11:51:27  profilanswer
 

Tu à raison mes erreur on disparue ! :D
 
par contre j'en est une nouvelle :

Code :
  1. error C2664: impossible de convertir le paramètre 1 de 'System::String ^' en 'System::Net::IPEndPoint ^'


 
a la ligne :

Code :
  1. server = gcnew TcpListener(Convert::ToInt32( TB_Port->Text));


 
en gros si j'ai bien compris...
 
TB_Port->Text retourne une chaine de type : System::String ^
 
et TcpListener lui veux un argument du type : System::Net::IPEndPoint ^
 
help ? :whistle:

Message cité 1 fois
Message édité par Romiinet le 09-03-2010 à 11:51:45

---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1972405
breizhbugs
Posté le 09-03-2010 à 18:29:15  profilanswer
 

Romiinet a écrit :


Code :
  1. server = gcnew TcpListener(Convert::ToInt32( TB_Port->Text));




Bon mi il me dit que ce constructeur TcpListener est obsolete mais il compile quand même!
D'apres http://msdn.microsoft.com/fr-fr/li [...] tener.aspx
il en reste 2 de dispo:
TcpListener(IPEndPoint)
ou
TcpListener(IPAddress, Int32)
Tu trouveras tout seul comment corriger en suivant l'aide des constructeurs via le lien si dessus

n°1972512
Romiinet
Kei ?
Posté le 10-03-2010 à 10:02:01  profilanswer
 

arf j'ai rien toucher a part le code Form1 et j'ai ce message d'erreur au lancement :

Code :
  1. Une exception non gérée du type 'System.Resources.MissingManifestResourceException' s'est produite dans mscorlib.dll
  2. Informations supplémentaires : Impossible de trouver des ressources appropriées pour la culture spécifiée ou la culture neutre. Assurez-vous que "Serveur.Form1.resources" a été correctement incorporé ou lié dans l'assembly "FakeByte - Serveur" au moment de la compilation ou que tous les assemblys satellites requis sont chargeables et complètement signés.


 
ensuite j'ai le choix entre entre Arrêter et Ignorer. :/
 
au moins j'ai plus d'erreur de compilation c'est déjà ça ^^


---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1972629
breizhbugs
Posté le 10-03-2010 à 12:41:06  profilanswer
 

Régénère le projet peut être...

n°1972724
Romiinet
Kei ?
Posté le 10-03-2010 à 16:56:37  profilanswer
 

Je me suis aperçus que le compilateur s'arrêter a la ligne :

Code :
  1. this->Icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon" )));


 
j'ai donc réinitialiser ma form1 avec l'icon par défaut et maitenant c'est niquel !
 
merci bien :)
 
EDIT : nouveaux problème, je narrive pas a accéder a ma fenétre depuis le thread [:icon15]  
j'ai des message du genre :

Code :
  1. Informations supplémentaires : Opération inter-threads non valide : le contrôle 'RTB_Log' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.


Message édité par Romiinet le 10-03-2010 à 17:15:28

---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1972777
breizhbugs
Posté le 10-03-2010 à 18:53:03  profilanswer
 

Aucune idée, chez moi ca marchait...

n°1972821
Romiinet
Kei ?
Posté le 10-03-2010 à 23:27:13  profilanswer
 

bah enfaite je peu lire les info venant de ma Form1 mais je ne peut pas agir sur eu et modifier leur valeur.
 
sa fonctionne chez toi si tu retire les "//" de la ligne 168 ?

Code :
  1. //RTB_Log->AppendText("Serveur démaré, attente de client...\n" );


 


---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1972952
breizhbugs
Posté le 11-03-2010 à 11:56:26  profilanswer
 

Romiinet a écrit :

bah enfaite je peu lire les info venant de ma Form1 mais je ne peut pas agir sur eu et modifier leur valeur.
 
sa fonctionne chez toi si tu retire les "//" de la ligne 168 ?

Code :
  1. //RTB_Log->AppendText("Serveur démaré, attente de client...\n" );


 


oui

n°1973151
__tomjost
c'est un pseudo !
Posté le 11-03-2010 à 22:53:59  profilanswer
 

un mot... :D  
 
RTB_Log doit supporter l'accees de multiple thread
(change quelque parameter sur ce RTB_Log )  ... ici je parle sans
rien connaitre!
 
mais pour l'icone , tu change le language du resource
(ou francais(0x40c) , ou anglais(0x409)  )
 
 :hello:

n°1973296
Romiinet
Kei ?
Posté le 12-03-2010 à 14:31:05  profilanswer
 


 
arf peut tu me donner ta version de ton Form1.h si cela ne te dérange pas ? :(  
 

__tomjost a écrit :

un mot... :D  
 
RTB_Log doit supporter l'accees de multiple thread
(change quelque parameter sur ce RTB_Log )  ... ici je parle sans
rien connaitre!


 
je vais essaye de trouver sa mais je ne vois pas trop comment faire ><
 
 
 
 

__tomjost a écrit :


 
mais pour l'icone , tu change le language du resource
(ou francais(0x40c) , ou anglais(0x409)  )
 :hello:


 
de quoi ? [:rogr]  


---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1973380
breizhbugs
Posté le 12-03-2010 à 18:42:15  profilanswer
 

Romiinet a écrit :


 
arf peut tu me donner ta version de ton Form1.h si cela ne te dérange pas ? :(  
 


Sous VS 2008 express,
Je crée un projet winform et j'ai remplacé tout ce qu'il y avait dans form1.h par le code que tu as donnée plus et que j'ai modifié comme suit (et je crois sans autre modif au niveau de la génération du projet!):

Code :
  1. #pragma once
  2. bool connected = false;
  3.  
  4. namespace testserveur {
  5.  
  6.     using namespace System;
  7.     using namespace System::IO;
  8.     using namespace System::ComponentModel;
  9.     using namespace System::Collections;
  10.     using namespace System::Windows::Forms;
  11.     using namespace System::Data;
  12.     using namespace System::Drawing;
  13.     using namespace System::Net;
  14.     using namespace System::Net::Sockets;
  15.     using namespace System::Threading;
  16.     using namespace System::Drawing::Imaging;
  17.  
  18.     public ref class Form1 : public System::Windows::Forms::Form
  19.     {
  20.     public:
  21.         Form1(void)
  22.         {
  23.             InitializeComponent();
  24.             myThread=gcnew Thread(gcnew ThreadStart(this,&Form1::Serveur));
  25.         }
  26.  
  27.     protected:
  28.         /// <summary>
  29.         /// Nettoyage des ressources utilisées.
  30.         /// </summary>
  31.         ~Form1()
  32.         {
  33.             if (components)
  34.             {
  35.                 if (myThread->IsAlive) myThread->Abort();
  36.                 delete components;
  37.             }
  38.         }
  39.     private: System::Windows::Forms::TextBox  ^TB_Port;
  40.     protected:
  41.     private: System::Windows::Forms::Button ^BT_Start;
  42.     private: System::Windows::Forms::Label ^LB_ONOFF;
  43.     private: System::Windows::Forms::RichTextBox ^RTB_Log;
  44.     private: System::Windows::Forms::ProgressBar ^PB_Load;
  45.  
  46.     //pour le serveur :
  47.     private: Threading::Thread ^myThread;
  48.     //static car utilisé dans le thread
  49.     private: static TcpListener ^server;
  50.     private: static TcpClient ^client;
  51.     //stream pour lire/ecrire sur le socket
  52.     private: static NetworkStream ^stream;
  53.     // pour le lecteur binaire sur le socket (plus pratique)
  54.     private: static BinaryWriter ^socketbinwrite;
  55.     private: static BinaryReader ^socketbinread;
  56.     //binary Reader sur les fichiers
  57.     private: static BinaryReader ^FichierBinReader;
  58.     private: static BinaryWriter ^FichierBinWrite;
  59.  
  60.     private:
  61.         /// <summary>
  62.         /// Variable nécessaire au concepteur.
  63.         /// </summary>
  64.         System::ComponentModel::Container ^components;
  65.  
  66. #pragma region Windows Form Designer generated code
  67.         /// <summary>
  68.         /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
  69.         /// le contenu de cette méthode avec l'éditeur de code.
  70.         /// </summary>
  71.         void InitializeComponent(void)
  72.         {
  73.             System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
  74.             this->TB_Port = (gcnew System::Windows::Forms::TextBox());
  75.             this->BT_Start = (gcnew System::Windows::Forms::Button());
  76.             this->LB_ONOFF = (gcnew System::Windows::Forms::Label());
  77.             this->RTB_Log = (gcnew System::Windows::Forms::RichTextBox());
  78.             this->PB_Load = (gcnew System::Windows::Forms::ProgressBar());
  79.             this->SuspendLayout();
  80.             //
  81.             // TB_Port
  82.             //
  83.             this->TB_Port->Location = System::Drawing::Point(12, 12);
  84.             this->TB_Port->Name = L"TB_Port";
  85.             this->TB_Port->Size = System::Drawing::Size(49, 20);
  86.             this->TB_Port->TabIndex = 0;
  87.             this->TB_Port->Text = L"8085";
  88.             //
  89.             // BT_Start
  90.             //
  91.             this->BT_Start->Location = System::Drawing::Point(67, 10);
  92.             this->BT_Start->Name = L"BT_Start";
  93.             this->BT_Start->Size = System::Drawing::Size(75, 23);
  94.             this->BT_Start->TabIndex = 1;
  95.             this->BT_Start->Text = L"Démarrer";
  96.             this->BT_Start->UseVisualStyleBackColor = true;
  97.             this->BT_Start->Click += gcnew System::EventHandler(this, &Form1::BT_Start_Click);
  98.             //
  99.             // LB_ONOFF
  100.             //
  101.             this->LB_ONOFF->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
  102.                 static_cast<System::Byte>(0)));
  103.             this->LB_ONOFF->Location = System::Drawing::Point(220, 9);
  104.             this->LB_ONOFF->Name = L"LB_ONOFF";
  105.             this->LB_ONOFF->Size = System::Drawing::Size(52, 23);
  106.             this->LB_ONOFF->TabIndex = 2;
  107.             this->LB_ONOFF->Text = L"[OFF]";
  108.             this->LB_ONOFF->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
  109.             //
  110.             // RTB_Log
  111.             //
  112.             this->RTB_Log->Location = System::Drawing::Point(12, 40);
  113.             this->RTB_Log->Name = L"RTB_Log";
  114.             this->RTB_Log->Size = System::Drawing::Size(260, 260);
  115.             this->RTB_Log->TabIndex = 3;
  116.             this->RTB_Log->Text = L"";
  117.             //
  118.             // PB_Load
  119.             //
  120.             this->PB_Load->Location = System::Drawing::Point(12, 306);
  121.             this->PB_Load->Name = L"PB_Load";
  122.             this->PB_Load->Size = System::Drawing::Size(260, 14);
  123.             this->PB_Load->TabIndex = 4;
  124.             //
  125.             // Form1
  126.             //
  127.             this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
  128.             this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
  129.             this->ClientSize = System::Drawing::Size(284, 332);
  130.             this->Controls->Add(this->PB_Load);
  131.             this->Controls->Add(this->RTB_Log);
  132.             this->Controls->Add(this->LB_ONOFF);
  133.             this->Controls->Add(this->BT_Start);
  134.             this->Controls->Add(this->TB_Port);
  135.             this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
  136.             this->Icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon" )));
  137.             this->Name = L"Form1";
  138.             this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
  139.             this->Text = L"Serveur de Test";
  140.             this->ResumeLayout(false);
  141.             this->PerformLayout();
  142.  
  143.         }
  144. #pragma endregion
  145.         private: System::Void BT_Start_Click(System::Object^  sender, System::EventArgs^  e) {
  146.             if(!connected){
  147.                 myThread->Start();
  148.                 this->Text = "Thread Start";
  149.                 this->BT_Start->Text = "Arrêter";
  150.                 this->LB_ONOFF->Text = "[ON]";
  151.             }else{
  152.                 myThread->Abort();    
  153.                 server->Stop();
  154.                 this->Text = "Thread Stop";
  155.                 this->BT_Start->Text = "Démarrer";
  156.                 this->LB_ONOFF->Text = "[OFF]";
  157.                 myThread->Sleep(500);
  158.                 myThread->Abort();
  159.             }
  160.             this->TB_Port->Enabled = connected;
  161.             connected = !connected;
  162.         }
  163.  
  164.          void Serveur()
  165.          {    
  166.             String^message;
  167.             server = gcnew TcpListener(Convert::ToInt32( TB_Port->Text));
  168.             server->Start();
  169.             RTB_Log->AppendText("Serveur démaré, attente de client...\n" );
  170.             client = server->AcceptTcpClient();
  171.  
  172.             stream = client->GetStream();
  173.             socketbinread = gcnew BinaryReader(stream);
  174.             socketbinwrite = gcnew BinaryWriter(stream);
  175.             
  176.             RTB_Log->AppendText("client connecté\n" );
  177.             
  178.             //boucle de reception des messages
  179.             while(message=socketbinread->ReadString())
  180.             {
  181.                 // ------------------------
  182.                 //  # Commande
  183.                 // ------------------------
  184.             }
  185.             
  186.         }
  187.  
  188.  
  189.  
  190.     };
  191. }


Message édité par breizhbugs le 12-03-2010 à 18:43:25
n°1973461
Romiinet
Kei ?
Posté le 13-03-2010 à 11:22:37  profilanswer
 

je ne comprend plus rien  [:icon15]  
 
même avec ta Form1.h j'ai toujours ce foutu bug "intert-thread" [:icon15]  
 
Opération inter-threads non valide : le contrôle 'RTB_Log' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.


---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1973595
__tomjost
c'est un pseudo !
Posté le 13-03-2010 à 22:32:29  profilanswer
 

ah pardon, j'ai donner une chose a essayer
mais pas une reponse.
 
 
j'ai vu un peu ce .net (rien de nouveau) un win-java-VB-com! + lourd!
Rien est hors control  :o  , mais j'ai pas de temp maintenant pour ca.
 
 :D on continue ...
 
RTB_Log est un RichEdit control , c'est similair a  
(ou le meme) de wordpad.
 
1/ l'exception de l'icone , tu a supprimer
un fichier (*.manifest) je crois, ...oublie ce que j'ai dit avant
 
2/ pour RTB_Log , change readonly to read write (pour ecrire)
et aussi  multi-ligne (pour ecrire plus d'une ligne) ... voir propriete.
si ca continue ,  (et tu n a pas de solution direct )
tu fait functionner le program avec un seul thread
... puis tu vois le probleme apres
 
avec form.h il y l'autre cpp ? , ou il'y a main() , voir ca aussi !
 
CTRL+^ pour sauter entre '{'  et la correspondante  '}'  
(va bien aider!)
 

n°1973622
Romiinet
Kei ?
Posté le 14-03-2010 à 10:53:15  profilanswer
 

l'option ReadOnly est sur false donc c'est ok

 

j'ai toujours ce message d'erreur :
Opération inter-threads non valide : le contrôle 'RTB_Log' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

 

voila le main.cpp :

Code :
  1. // FakeByte - Serveur.cpp : fichier projet principal.
  2. #include "stdafx.h"
  3. #include "Form1.h"
  4. #include <windows.h>
  5. using namespace Serveur;
  6. [STAThreadAttribute]
  7. int main(array<System::String ^> ^args)
  8. {
  9. // Activation des effets visuels de Windows XP avant la création de tout contrôle
  10. Application::EnableVisualStyles();
  11. Application::SetCompatibleTextRenderingDefault(false);
  12. // Créer la fenêtre principale et l'exécuter
  13. System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
  14. Application::Run(gcnew Form1());
  15. return 0;
  16. }
 

il n'y a pas de Form1.cpp

 

voila  :(


Message édité par Romiinet le 14-03-2010 à 10:54:24

---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1973632
breizhbugs
Posté le 14-03-2010 à 12:30:29  profilanswer
 

Tu as du changer des parametes dans le projet, ca n'a pas l'air de venir du code...
Sinon je crois que cette ligne
System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
est inutile a cause du [STAThreadAttribute]
(en tout cas moi, je ne l'ai pas dans mon main.cpp, pas plus que <windows.h> qui est inutile d'ailleurs)!

n°1973656
__tomjost
c'est un pseudo !
Posté le 14-03-2010 à 14:36:06  profilanswer
 

pour l'icone
 tu a effacer le namespace , tu doit changer ca :
 [complie command de *.resx] (voir propriete sour *.resx)
 outputfilename :
 de : $(IntDir)\$(RootNamespace).$(InputName).resources
 a : $(IntDir)\$(InputName).resources
 
 si un control->InvokeRequired return true ,
 tu doit appeler
 la method ou changer les prorpriete avec Invoke(..) + tu va faire
 des delegate sur le thread qui a cree les controls  
 c'est similair au evenement .. les click , button pressed ...etc
 il manque tros de details mais..
 
.. si tu ne connais pas ces chose avant l'apparition du .Net
 , tu va trouver quelque (ou beaucoup !) des problemes
 
/1 pour eviter ca  
 tu doit cree ta form (et ses controls) par le thread qui va changer
 les attribut ou appeler le method , ...( sont tous des methods)
 
/2 tu doit trouver un plan pour ca , avant de faire le code.
 
tu peut chercher encore :
tu peut voir aussi la haut ,  
http://forum.hardware.fr/hfr/Progr [...] ujet-1.htm
 
.. ou bien lance ca et va cree ce client-serveur avec C (en console!)
http://forum.hardware.fr/hfr/Progr [...] ujet-1.htm
 
 :hello:  
 
 

n°1973697
Romiinet
Kei ?
Posté le 14-03-2010 à 16:54:50  profilanswer
 

bon ça commence a devenirs un peut hors de mes compétence en C++.
 
ce qui m'énerve c'est que chez les autre ça fonctionne et pas chez moi.
 
j'ai donc crée un nouveaux projet Windows Form sous VC 2008 Express
 
et copier la form1 de breizhbugs. ce qui en toute logique devrais aboutir au même résultat et ben non ! toujours ce f**tu bug d'inter thread ...
 
j'en est vraiment marre là ...
 
quelqu'un d'entre vous pourrait me zipper son projet fonctionnelle et me l'envoyer s'il vous plait :??:  
 
 
breizhbugs ? [:fight]


---------------
Q9550 Owner || GTX 580 Owner || Watercooling addict || ACH-VDS-ECH-FEED
n°1973709
breizhbugs
Posté le 14-03-2010 à 19:09:11  profilanswer
 
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [Visual C++] Thread pour prog serveur/client

 

Sujets relatifs
Probleme variable fichier [ langage C ][C/C++] afx.h qu'es que c'est ?
[C] Petites questions (débutant)SDL + C
Ajouter les classes Qt de Network dans Visual Studiolangage C transformée de Hough
[C++/CLI] Dispose et delete[C/C++] C ou C++ pour des performances optimales?
Créer un serveur pour SON jeu vidéo!!C - attendre n milliseconds entre 2 iterations d'une boucle
Plus de sujets relatifs à : [Visual C++] Thread pour prog serveur/client


Hit-Parade
Copyright © 1997-2012 Hardware.fr SARL / Groupe LDLC / LesNumeriques.com / Version anglaise du site: BeHardware