Ir al contenido


Foto

Multihilos


  • Por favor identifícate para responder
31 respuestas en este tema

#21 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 enero 2009 - 03:16

Bueno, me ha surgido una duda, use el com virtual pero nunca le "dije" al thread que puerto queria leer y aun asi lo tomó.

Bueno, me voy a meter a estudiar el code :)

Salud OS
  • 0

#22 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 enero 2009 - 03:26

:D :D :D

Perdona seoane, pero por una de esas causas extrañas de la vida, lei el que cree virtualmente jajajajaja



delphi
  1.   MiThread:= TThreadCom.Create(2); // Se abre el COM2



El puerto virtual fué el COM2, :p

Salud OS
  • 0

#23 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 09 enero 2009 - 03:41

Me alegro de que te funcione bien :D

Por cierto ¿que aplicación usaste para enviar los datos al puerto virtual?, o le enviaste directamente un archivo de texto
  • 0

#24 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 enero 2009 - 03:48

Me alegro de que te funcione bien :D

Por cierto ¿que aplicación usaste para enviar los datos al puerto virtual?, o le enviaste directamente un archivo de texto


Si, tengo varios formatos (en archivos) de equipos con los que he trabajado, y use hiperterminal para enviar el archivo.

Salud OS
  • 0

#25 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 09 enero 2009 - 03:54

Windows Vista no tiene hyperterminal así que para probarlo tuve que usar esto:


delphi
  1. C:\>type archivo.txt > com2


  • 0

#26 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 enero 2009 - 04:03

Ah vaya

Pues practicamente es lo mismo :)

Salud OS
  • 0

#27 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 09 enero 2009 - 09:50

GLUP.... +o(

Aun tengo atragantado bastante del codigo pero solo por molestar, en el constructor haces esta asignacion:



delphi
  1. FPort := APort;



sin embargo en ningun lado usas FPort. ¿?
  • 0

#28 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 10 enero 2009 - 05:07

sin embargo en ningun lado usas FPort. ¿?

Tienes razón, lo añadí por si mas adelante necesitaba saber que puerto se había abierto, pero por ahora no lo uso. Al igual que los parámetros de la comunicación que los fijo en el código y deberían pasarse como parámetros, pero esos detalles ya se pulirán mas adelante.

Por cierto FGarcia, echale un vistazo a la función ClearCommError que, entre otros valores, nos devuelve el numero de bytes que están esperando en el buffer del puerto serie para ser leídos. Intentando leer un numero de bytes igual o menor al que hay en el buffer nos aseguramos de que la funciona ReadFile nunca se quede bloqueada.
  • 0

#29 MasterXP

MasterXP

    Member

  • Miembros
  • PipPip
  • 13 mensajes
  • LocationRepública Dominicana

Escrito 11 enero 2009 - 12:34


Hola, ha decir verdad yo no se nada de multihilos mas que solo teoria, nunca los he puesto en practica, pero he investigado mucho anteriormente y llegue a descargarme unos componentes para manejar los hilos que pintan muy bien.


Muchas gracias MasterXP les voy a dar un vistazo, debo comentar que he replicado algunas de las soluciones que he encontrado en internet pero mi problema realmente es que no logro entender el concepto, quiero decir, he creado multihilos pero sigo sin poder hacerlo en mi desarrollo, no logro conceptualizar como de una applicación ya hecha, hacerla multihilos.

Salud OS


Por nada jefe para eso estamos.

Me alegra que ya hallas encontrado la solucion a tu problema en particula, gracias al amigo seoane.

Por otro lado si llegas a encontrar la respuesta a tu duda de "...pero mi problema realmente es que no logro entender el concepto, quiero decir, he creado multihilos pero sigo sin poder hacerlo en mi desarrollo...", te agradeceria que la compartieras conmigo porque la verdad yo estoy en el aire todavia.

Si es posible hacer un mini-tutorial de un ejemplo sencillo de multihilos, paso a paso y bien explicado, seguro hay mas personas como yo que todavia no terminamos de entender esto de los multi-hilos.

Salu2.
  • 0

#30 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 13 enero 2009 - 12:29

Hola! pues esto de los hilos da para mucho, aqui un enlace:

http://www.thealphasite.org/node/10


Y aqui mas de Salvador Jover http://sjover.com/delphi/?m=200308

  • 0

#31 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 03 febrero 2009 - 03:43

Tienes razón, lo añadí por si mas adelante necesitaba saber que puerto se había abierto, pero por ahora no lo uso. Al igual que los parámetros de la comunicación que los fijo en el código y deberían pasarse como parámetros, pero esos detalles ya se pulirán mas adelante.


Bueno, después de estar metido en otros asuntos, he realizado algunas modificaciones al code, he pasado con parámetros los valores de configuración del puerto.

En el constructor Create() he puesto los parámetros que necesito:



delphi
  1. { TThreadCom }
  2. constructor TThreadCom.Create(APort: Integer; Bauds, LengthData, Parity, StopBit: DWORD);
  3. var
  4.   DCB: TDCB;
  5. begin
  6.   FPort:= APort;
  7.   FHandle:= CreateFile(PChar('\\.\COM' + IntToStr(APort)), GENERIC_READ or
  8.     GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  9.   if FHandle = INVALID_HANDLE_VALUE then
  10.     raise EThreadCom.Create('No puedo abrir el puerto COM' + IntToStr(APort));
  11.   DCB.DCBlength:= Sizeof(DCB);
  12.   if not GetCommState(FHandle,DCB) then begin
  13.     raise EThreadCom.Create('Error al configurar el puerto');
  14.     Form1.PortOpen := False;
  15.   end
  16.   else
  17.     Form1.PortOpen := True;
  18.   // Aqui esta la configuracion del puerto. Se la podriamos pasar por parametros ...
  19.   //Se pasaron parámetros desde el constructor Create
  20.   with DCB do
  21.   begin
  22.     BaudRate := Bauds;
  23.     ByteSize := LengthData;
  24.     Parity  := Parity;
  25.     StopBits := StopBit;
  26.     Flags    := $01;
  27.   end;
  28.   if not SetCommState(FHandle, DCB) then begin
  29.     raise EThreadCom.Create('Error al configurar el puerto');
  30.     Form1.PortOpen := False;
  31.   end
  32.   else
  33.     Form1.PortOpen := True;
  34.  
  35.   inherited Create(FALSE);
  36. end;



En el programa he puesto una forma patra configurar los valores y en el código he hecho esto



delphi
  1. procedure TForm1.AbrePuerto1Click(Sender: TObject);
  2. begin
  3.   MiThread:= TThreadCom.Create(Puerto,Velocidad,LongDatos,Paridad,BitStop);
  4.   AbrePuerto1.Enabled := false;
  5. end;
  6.  
  7. procedure TForm1.ConfiguraPuerto1Click(Sender: TObject);
  8. var
  9.   ConfPuerto: TfrmConfPort; //esta es la forma donde obtengo los valores
  10. begin
  11.   ConfPuerto := TfrmConfPort.Create(nil);
  12.   if ConfPuerto.ShowModal = mrOK then begin
  13.     //Se obtiene el número de COM
  14.     Puerto := strtoint(StringReplace(ConfPuerto.CBPorts.Text,'COM','',[rfReplaceAll]));
  15.     //Se configura la velocidad en Bauds
  16.     case ConfPuerto.RGBaudsSMDR.ItemIndex of
  17.         0: Velocidad := BAUD_1200;
  18.         1: Velocidad := BAUD_2400;
  19.         2: Velocidad := BAUD_4800;
  20.         3: Velocidad := BAUD_9600;
  21.         4: Velocidad := BAUD_38400;
  22.         5: Velocidad := BAUD_56K;
  23.         6: Velocidad := BAUD_115200;
  24.     end;
  25.     //Se configura la longitud de datos
  26.     case ConfPuerto.RGDataSMDR.ItemIndex of
  27.         0: LongDatos := DATABITS_7;
  28.         1: LongDatos := DATABITS_8;
  29.     end;
  30.     //Se configura la paridad
  31.     case ConfPuerto.RGParitySMDR.ItemIndex of
  32.         0: Paridad := PARITY_NONE;
  33.         1: Paridad := PARITY_ODD;
  34.         2: Paridad := PARITY_EVEN;
  35.         3: Paridad := PARITY_MARK;
  36.         4: Paridad := PARITY_SPACE;
  37.     end;
  38.     //Se configura el bit de stop
  39.     case ConfPuerto.RGStopSMDR.ItemIndex of
  40.         0: BitStop := STOPBITS_10;
  41.         1: BitStop := STOPBITS_20;
  42.     end;
  43.     AbrePuerto1.Enabled := true;
  44.   end
  45.   else begin
  46.         AbrePuerto1.Enabled := false;
  47.         ShowMessage('Proceso Cancelado');
  48.   end;
  49.   ConfPuerto.Free;
  50. end;



En la forma de parámetros hago esto para obtener los puertos seriales activos en la maquina.



delphi
  1. procedure TfrmConfPort.FormShow(Sender: TObject);
  2. var
  3.   i: integer;
  4. begin
  5.   { Obtiene Puertos Seriales disponibles }
  6.   Reg := TRegistry.Create;
  7.   try
  8.     Reg.RootKey := HKEY_LOCAL_MACHINE;
  9.     if Reg.OpenKey('HARDWARE\DEVICEMAP\SERIALCOMM', false) then
  10.     begin
  11.       Reg.GetValueNames(CBPorts.Items);
  12.       for I := 0 to CBPorts.Items.Count - 1 do
  13.           CBPorts.Items[i] := Reg.ReadString(CBPorts.Items[i]);
  14.     end;
  15.   finally
  16.     Reg.Free;
  17.   end;
  18.   CBPorts.Sorted := true;
  19. end;



Adjunto les muestro la forma para configurar los parámetros de comunicación.

Salud OS
  • 0

#32 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 03 febrero 2009 - 04:43

:D Va tomando forma
  • 0




IP.Board spam blocked by CleanTalk.