Organisation de projet.

Organisation de projet. - Ada - Programmation

Marsh Posté le 24-09-2011 à 21:35:36    

Bonjour,
 
Je souhaite écrire une programme client avec interface graphique...
Je souhaite le faire au mieux...
 
Je décrirais mon programme comme une tri applications composée :
d'un terminal souche
d'une interface graphique comprenant :
  un client pour discuter en réseau
  un client pour jouer en réseau.
 
Pour réaliser ce programme j'écris avec Ada et j'utilise Gtkada.
 
Le processus principal (terminal souche) est le suivant.
 
1 lecture de l'adresse du serveur sur la ligne de commande. (notation IP ou hostname)
2 lecture du username sur l'entrée du terminal.
  2.1 lecture du password sur l'entrée du terminal.
3 Choix du jeu
4 démarrage de l'interface graphique comprenant le client Jeu et le client tchat.
5 retour à 3 ou fin.
 
Je cherche comment architecturer mon programme au delà de cette succinte description.
 
Par exemple, si vous aviez une idée de l'endroit ou je doit lire les argument de ligne de commande.
 
Aussi une question plus vague, comment détacher mon interface de mes thread client ?
 
S'il vous plaît ?
Merci.


Message édité par Profil supprimé le 25-09-2011 à 02:13:55
Reply

Marsh Posté le 24-09-2011 à 21:35:36   

Reply

Marsh Posté le 25-09-2011 à 01:24:38    

Je reprend mon projet à zéro, dans lequel je vais essayer de faire une et une seul chose à la fois.
J'ai commencé le client de la manière suivante :
 

Code :
  1. with Warborg.Xborg.Terminal;
  2. use Warborg.Xborg;
  3.  
  4. with Ada.Command_Line, Ada.Text_Io;
  5. use Ada;
  6.  
  7. with Gnat.Sockets;
  8. use Gnat;
  9.  
  10. procedure Xborg is
  11.  
  12.   procedure Usage is
  13.  
  14.   begin
  15.      Text_Io.Put_Line("usage : " & Command_Line.Command_Name & "  -a IP | -n Hostname" );
  16.   end Usage;
  17.  
  18.  Args_Error : exception;
  19.  
  20.  Address : aliased Sockets.Sock_Addr_Type;
  21.  
  22. begin
  23.  
  24.   if Command_Line.Argument_Count < 2 then
  25.  
  26.      raise Args_Error;
  27.   end if;
  28.  
  29.   if Command_Line.Argument(1) = "-a" then
  30.  
  31.      begin
  32.  
  33.         Address.addr := Sockets.Addresses (Sockets.Get_Host_By_address (Sockets.Inet_addr (Command_Line.Argument(2))));
  34.      end;
  35.   elsif Command_Line.Argument(1) = "-n" then
  36.  
  37.      begin
  38.  
  39.         Address.addr := Sockets.Addresses (Sockets.Get_Host_By_Name (Command_Line.Argument(2)));
  40.      end;
  41.   else
  42.  
  43.      Text_Io.Put_Line(Command_Line.Command_Name & " : unknow switch : " & Command_Line.Argument(1));
  44.  
  45.      raise Args_Error;
  46.   end if;
  47.  
  48.   Terminal.Run(Address'access);
  49.  
  50. exception
  51.   when Args_Error =>
  52.      Usage;
  53. end Xborg;


 
Je detecte sur la ligne de commande si c'est une notation par nom ou par adresse et je file l'adresse à Terminal.Run.
 
Comment ?


Message édité par Profil supprimé le 25-09-2011 à 06:10:36
Reply

Marsh Posté le 25-09-2011 à 02:13:23    

Dans la procédure Terminal.Run je complète l'adresse avec le N° du port, j'initialise la connexion avec le serveur.

Code :
  1. procedure Run(Address : access Sockets.Sock_Addr_Type) is
  2.      Term_Address      : Sockets.Sock_Addr_Type := Address.all;
  3.      Socket            : Sockets.Socket_Type;
  4.      Channel           : Sockets.Stream_access;
  5.      Command, Response : String_Access;
  6.      Status            : Boolean := False;
  7.  
  8.   begin
  9.  
  10.      Term_Address.Port := 5876;
  11.  
  12.      Sockets.Create_Socket (Socket);
  13.  
  14.      Sockets.Set_Socket_Option
  15.        (Socket,
  16.         Sockets.Socket_Level,
  17.         (Sockets.Reuse_Address, True));
  18.  
  19.      delay 0.2;
  20.  
  21.      Sockets.Connect_Socket (Socket, Term_Address);
  22.  
  23.      Channel :=  Sockets.stream(Socket);
  24.  
  25.      loop
  26.         Response := new String ' (String'Input(Channel));
  27.         Print(Response.all, 0.02, False);
  28.         Command := new String ' (Text_Io.Get_Line);
  29.         String'Output(Channel, Command.all);
  30.         Status := Boolean'Input(Channel);
  31.         case Status is
  32.            when True =>
  33.               null;
  34.            when False =>
  35.               null;
  36.         end case;
  37.      end loop;
  38.   end Run;

 
 
Bon, déjà j'ai fait trois truc d'un coup....  :o
 
Edit : Quatre même....


Message édité par Profil supprimé le 25-09-2011 à 06:13:00
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed