Hola.
Despues de buscar varios dias en el foro y no encontrar algo que se paresca a mi problema que tengo me decidi por hacer esta pregunta.
Bueno primero uso Delphi7 y las Indy 9, y me encuentro desarrollando un sistemita para un cyber, Tengo una AplicacionCliente con un TIdTCPClient y tambien una AplicacionServidor con un TIdTCPServer y un TIdThreadMgrDefault.
Código:
//--- Mi bloc de comunicaciones lo uso en ambas partes (AppServer+AppCliente)
TComunicacion = record
Comando,
NombreUsuario, // Quien manda el mensaje
Msg, // El Mensaje
NombreReceptor: string[100]; // Nombre del Receptor
Pc : Integer; // Numero de la Pc que envia
end;
Todo funciona bien puedo mandar informacion desde mi cliente hasta el servidor y del servidor al cliente tambien:
Del cliente al servidor lo hago asi:
Código:
procedure TFrm_Principal.Button1Click(Sender: TObject);
Var
commBlock :TComunicacion;
begin
//-- Asignar datos del bloc de comunicación
CommBlock.Comando := 'MENSAJE';
CommBlock.NombreUsuario := Client.LocalName;
CommBlock.Msg := 'Hola esto es una prueba :))))';
CommBlock.NombreReceptor := 'SERVIDOR';
CommBlock.Pc :=Num_Pc;
// ---- Mandarlo ----
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;
Del servidor hacia el cliente hago algo parecido, mi problema es en el procedimiento Execute del Servidor al leer un mensaje del cliente si lo muestro en un Memo en el formulario principal no hay ningun problema pero lo que yo quiero es mostrar el mensaje que el cliente manda en un formulario distinto al principal, cuando muestro el mensaje el servidor se queda colgado y creo que tengo mi cerebro bloqueado ya que no encuentro la forma de mostrar el mensaje en otro formulario sin que mi servidor se cuelgue.... si alguien me puede iluminar un poco se lo agradeceria mucho... les pongo el codigo del procedimiento:
Código:
procedure TFrm_Principal.ServerExecute(AThread: TIdPeerThread);
var
RecClient: PCliente;
CommBlock, NewCommBlock: TComunicacion;
RecThread: TIdPeerThread;
i: Integer;
begin
If Not AThread.Terminated And AThread.Connection.Connected Then
Begin
AThread.Connection.ReadBuffer (CommBlock, SizeOf (CommBlock));
If (CommBlock.Comando = 'MENSAJE') Or (CommBlock.Comando = 'COMANDO') Then
Begin
// es el mismo código para ambas órdenes
If CommBlock.NombreReceptor = '' Then
Begin // ningún destinatario dado se envia a todos los usuarios
NewCommBlock := CommBlock; // No cambiar nada ;-))
With Clientes.LockList Do
Try
For i := 0 To Count-1 Do // interactuar con la lista de clientes
Begin
RecClient := Items[i]; //Obtener el objeto cliente RecThread := RecClient.Thread; // Obtener el hilo del cliente
RecThread.Connection.WriteBuffer(NewCommBlock, SizeOf(NewCommBlock), True); // Enviar el paquete
End;
Finally
Clientes.UnlockList;
End;
End
Else
Begin // receptor dado - busquelo y se le envía a él
If CommBlock.NombreReceptor = 'SERVIDOR' Then
Begin // destinatario el servidor
Paquete:=CommBlock;
MostrarMensaje(Paquete); // aqui esta el problema
End
Else
Begin
NewCommBlock := CommBlock; // De nuevo no cambiar nada ;-))
With Clientes.LockList Do
Try
For i := 0 To Count-1 Do
Begin
RecClient:=Items[i];
// No tenemos ninguna función de inicio de sesion por eso usamos el DNS
If RecClient.DNS=CommBlock.NombreReceptor Then
Begin
RecThread:=RecClient.Thread;
RecThread.Connection.WriteBuffer(NewCommBlock, SizeOf(NewCommBlock), True);
End;
End;
Finally
Clientes.UnlockList;
End;
End;
End;
End
Else
Begin // Comando desconocido
NewCommBlock.Comando := 'MENSAJE'; // El mensaje que debe mostrarse en la pantalla del cliente
NewCommBlock.NombreUsuario := 'ADMINISTRADOR'; // El nombre del servidor
NewCommBlock.Msg := 'Comando desconocido: "'+CommBlock.Comando+'"';
NewCommBlock.NombreReceptor := '[De vuelta al remitente]'; // innecesario
AThread.Connection.WriteBuffer (NewCommBlock, SizeOf (NewCommBlock), true); // y aqui va...
End;
End;
end;
el procedimiento que se ejecuta para mostrar la ventana del mensaje:
Código:
Procedure TFrm_Principal.MostrarMensaje(Pak : TComunicacion);
Begin
Frm_Mensaje.Label1.Caption:= Pak.NombreUsuario;
Frm_Mensaje.cxMemo1.Lines.Add('Mensaje: ' + Pak.Msg);
Frm_Mensaje.ShowModal;
End;
