Multihilos
#21
Escrito 09 enero 2009 - 03:16
Bueno, me voy a meter a estudiar el code
Salud OS
#22
Escrito 09 enero 2009 - 03:26
Perdona seoane, pero por una de esas causas extrañas de la vida, lei el que cree virtualmente jajajajaja
MiThread:= TThreadCom.Create(2); // Se abre el COM2
El puerto virtual fué el COM2,
Salud OS
#23
Escrito 09 enero 2009 - 03:41
Por cierto ¿que aplicación usaste para enviar los datos al puerto virtual?, o le enviaste directamente un archivo de texto
#24
Escrito 09 enero 2009 - 03:48
Me alegro de que te funcione bien
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
#25
Escrito 09 enero 2009 - 03:54
C:\>type archivo.txt > com2
#26
Escrito 09 enero 2009 - 04:03
Pues practicamente es lo mismo
Salud OS
#27
Escrito 09 enero 2009 - 09:50
Aun tengo atragantado bastante del codigo pero solo por molestar, en el constructor haces esta asignacion:
FPort := APort;
sin embargo en ningun lado usas FPort. ¿?
#28
Escrito 10 enero 2009 - 05:07
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.sin embargo en ningun lado usas FPort. ¿?
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.
#29
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.
#30
Escrito 13 enero 2009 - 12:29
http://www.thealphasite.org/node/10
Y aqui mas de Salvador Jover http://sjover.com/delphi/?m=200308
#31
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:
{ TThreadCom } constructor TThreadCom.Create(APort: Integer; Bauds, LengthData, Parity, StopBit: DWORD); var DCB: TDCB; begin FPort:= APort; FHandle:= CreateFile(PChar('\\.\COM' + IntToStr(APort)), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if FHandle = INVALID_HANDLE_VALUE then raise EThreadCom.Create('No puedo abrir el puerto COM' + IntToStr(APort)); DCB.DCBlength:= Sizeof(DCB); if not GetCommState(FHandle,DCB) then begin raise EThreadCom.Create('Error al configurar el puerto'); Form1.PortOpen := False; end else Form1.PortOpen := True; // Aqui esta la configuracion del puerto. Se la podriamos pasar por parametros ... //Se pasaron parámetros desde el constructor Create with DCB do begin BaudRate := Bauds; ByteSize := LengthData; Parity := Parity; StopBits := StopBit; Flags := $01; end; if not SetCommState(FHandle, DCB) then begin raise EThreadCom.Create('Error al configurar el puerto'); Form1.PortOpen := False; end else Form1.PortOpen := True; inherited Create(FALSE); end;
En el programa he puesto una forma patra configurar los valores y en el código he hecho esto
procedure TForm1.AbrePuerto1Click(Sender: TObject); begin MiThread:= TThreadCom.Create(Puerto,Velocidad,LongDatos,Paridad,BitStop); AbrePuerto1.Enabled := false; end; procedure TForm1.ConfiguraPuerto1Click(Sender: TObject); var ConfPuerto: TfrmConfPort; //esta es la forma donde obtengo los valores begin ConfPuerto := TfrmConfPort.Create(nil); if ConfPuerto.ShowModal = mrOK then begin //Se obtiene el número de COM Puerto := strtoint(StringReplace(ConfPuerto.CBPorts.Text,'COM','',[rfReplaceAll])); //Se configura la velocidad en Bauds case ConfPuerto.RGBaudsSMDR.ItemIndex of 0: Velocidad := BAUD_1200; 1: Velocidad := BAUD_2400; 2: Velocidad := BAUD_4800; 3: Velocidad := BAUD_9600; 4: Velocidad := BAUD_38400; 5: Velocidad := BAUD_56K; 6: Velocidad := BAUD_115200; end; //Se configura la longitud de datos case ConfPuerto.RGDataSMDR.ItemIndex of 0: LongDatos := DATABITS_7; 1: LongDatos := DATABITS_8; end; //Se configura la paridad case ConfPuerto.RGParitySMDR.ItemIndex of 0: Paridad := PARITY_NONE; 1: Paridad := PARITY_ODD; 2: Paridad := PARITY_EVEN; 3: Paridad := PARITY_MARK; 4: Paridad := PARITY_SPACE; end; //Se configura el bit de stop case ConfPuerto.RGStopSMDR.ItemIndex of 0: BitStop := STOPBITS_10; 1: BitStop := STOPBITS_20; end; AbrePuerto1.Enabled := true; end else begin AbrePuerto1.Enabled := false; ShowMessage('Proceso Cancelado'); end; ConfPuerto.Free; end;
En la forma de parámetros hago esto para obtener los puertos seriales activos en la maquina.
procedure TfrmConfPort.FormShow(Sender: TObject); var i: integer; begin { Obtiene Puertos Seriales disponibles } Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('HARDWARE\DEVICEMAP\SERIALCOMM', false) then begin Reg.GetValueNames(CBPorts.Items); for I := 0 to CBPorts.Items.Count - 1 do CBPorts.Items[i] := Reg.ReadString(CBPorts.Items[i]); end; finally Reg.Free; end; CBPorts.Sorted := true; end;
Adjunto les muestro la forma para configurar los parámetros de comunicación.
Salud OS
#32
Escrito 03 febrero 2009 - 04:43