![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
|||
|
|||
|
No entiendo bien la pregunta, pero podría sugerirte que crees un hilo cada vez que tengas que imprimir algo...
Es decir cuando ejecute el comando, creas un hilo y dejas que el cliente siga a la escucha de nuevos eventos.. |
|
#2
|
|||
|
|||
|
Primero que nada gracias por responder, segundo, probrando de nuevo logre darme cuenta cual es problema, mi aplicacion servidor crea hilos por cada cliente que se conecta a el, cuando desde un cliente llega la peticion de impresion salta la excepcion EAccessViolation, si tu sabes a raiz de que se lanza esta excepcion te agradeceria, probe en los clientes eliminar la sincronizacion pero sigue igual, ahora estoy viendo TCriticalSection haber si con esto lo logro. Cualquier sugerencia sera bienvenida.Saludos.
|
|
#3
|
|||
|
|||
|
Podrías Incluir parte del código, para poder analizarlo?
Saludos. John Cook. |
|
#4
|
|||
|
|||
|
El tema ahora es el siguiente:
Ejemplificando, tengo un TIdTCPServer con un objeto publico impresora que hace referencia a un objeto fisico de impresion, cuando hago uso de este objeto desde la misma aplicacion, es decir, desde el mismo formulario , a traves de un boton, por ejempli funciona todo correctamente, pero he aqui, que cuando algun cliente TIdTCPClient envia un comando al servidor y en el metodo que se ejecuta quiero hacer uso de ese objeto salta la excepcion de AccessViolation, estoy bastante desconcertado, sera por los hilos que crea el servidor para atender a los clientes, no podran acceder a este objeto, no se. Probando y probando, inspecciondo el objeto, los valores que adquiere, este toma valores validos pero no lo puedo utilizar de esta manera. Espero haber sido claro en la explicacion sino avisame. Saludos. |
|
#5
|
|||
|
|||
|
Peluca: Insisto de que incluyas al menos unas líneas de código......
Creo que con el código del comando bastaría... Por el tipo de error que mencionas, me imagino que puede ser a causa de que estas referenciando objetos sin haberlos creado previamente. Es por eso que me gustaría ver el código que incluyes cuando se ejecuta el comando... Espero tu respuesta.... Saludos. John Cook. |
|
#6
|
|||
|
|||
|
Este es un extracto del codigo
type TFServidor = class(TForm) impresora : TImpresoraFiscal; procedure serverConnect(AThread: TIdPeerThread); procedure serverExecute(AThread: TIdPeerThread); procedure serverDisconnect(AThread: TIdPeerThread); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure serverComandoImpresionCommand(ASender: TIdCommand); procedure serverNoCommandHandler(ASender: TIdTCPServer; const AData: String; AThread: TIdPeerThread); procedure serverComandoCierreXCommand(ASender: TIdCommand); private { Private declarations } ipCount : integer; ipLocal : string; puerto : integer; cantart : integer; function verificarCantArticulos(param : TStringList) : boolean; function verificarIndicadores(param : TStringList) : boolean; public { Public declarations } Clients : TThreadList; secCrit : TCriticalSection; vec : TObjectList; function verficarEstadoConexionesImpFiscales() : boolean ; function inicilizarInterfaceGrafica() : boolean ; function cargarConfiguraciones() : boolean ; function inicializarConexionesClientes() : boolean ; function verificarParametros(param : TStringList) : boolean; end; var FServidor: TFServidor; implementation {$R *.dfm} function TFServidor.verficarEstadoConexionesImpFiscales() : boolean ; var res : boolean; begin res:=false; try impresora:= TEpsonTM2000AF.Create; memo1.Lines.Add('Iniciado objeto EPSON'); res:=true; except on E: Exception do MessageDlg(E.Message, mtInformation,[mbOk], E.HelpContext); end; result := res; end; function TFServidor.inicilizarInterfaceGrafica() : boolean ; var res : boolean; begin res:=false; try trayicon1.Show; result := True; except on E: Exception do MessageDlg(E.Message, mtInformation,[mbOk], E.HelpContext); end; result := res; end; function TFServidor.cargarConfiguraciones() : boolean ; begin try ipLocal := getIPs.Strings[0]; puerto := 5000; EIP.Text := ipLocal; EPuerto.Text := IntToStr(puerto); except on E: Exception do MessageDlg(E.Message, mtInformation,[mbOk], E.HelpContext); end; end; function TFServidor.inicializarConexionesClientes() : boolean ; begin Clients := TThreadList.Create; Server.Active := true; secCrit := TCriticalSection.Create; end; procedure TFServidor.FormCreate(Sender: TObject); begin // verficar estado de la conexion con las Impresoras Fiscales. verficarEstadoConexionesImpFiscales(); // cargo archivos de configuracion cargarConfiguraciones(); // Inicializamos los socket con todos los clientes inicializarConexionesClientes(); // inicializar IGU inicilizarInterfaceGrafica(); end; procedure TFServidor.serverConnect(AThread: TIdPeerThread); var NewClient: PClient; begin GetMem(NewClient, SizeOf(TClient)); NewClient.DNS := AThread.Connection.LocalName; NewClient.Connected := Now; NewClient.LastAction := NewClient.Connected; NewClient.Thread := AThread; with grillaConexiones do begin addRow(1); cell[0,0].AsString := AThread.Connection.Socket.Binding.PeerIP; cell[1,0].AsString := IPAddrToName(AThread.Connection.Socket.Binding.PeerIP); end; AThread.Data:=TObject(NewClient); memo1.Lines.Add('Conectado'); try Clients.LockList.Add(NewClient); finally Clients.UnlockList; end; end; procedure TFServidor.serverExecute(AThread: TIdPeerThread); var ActClient, RecClient: PClient; CommBlock, NewCommBlock: String; RecThread: TIdPeerThread; i: Integer; j: byte; begin if not AThread.Terminated and AThread.Connection.Connected then begin CommBlock:=AThread.Connection.ReadLn; ActClient := PClient(AThread.Data); ActClient.LastAction := Now; with Clients.LockList do try for i := 0 to Count-1 do begin RecClient:=Items[i]; // if RecClient.DNS=CommBlock.Text then // begin RecThread:=RecClient.Thread; RecThread.Connection.WriteLn(NewCommBlock); memo1.Lines.Add('Recibido : '+CommBlock+' - Renviando'); // impresora.cierreX; end; finally Clients.UnlockList; end; end; end; procedure TFServidor.serverDisconnect(AThread: TIdPeerThread); var ActClient: PClient; begin ActClient := PClient(AThread.Data); try Clients.LockList.Remove(ActClient); memo1.Lines.Add('Desconectado'); grillaConexiones.SearchNext(1,AThread.Connection.LocalName); grillaConexiones.DeleteRow(grillaConexiones.SelectedRow); finally Clients.UnlockList; end; FreeMem(ActClient); AThread.Data := nil; end; procedure TFServidor.FormClose(Sender: TObject; var Action: TCloseAction); begin Server.Active := False; Clients.Free; impresora.Destroy; end; procedure TFServidor.serverComandoImpresionCommand(ASender: TIdCommand); var resp,th: TStringList; i : integer; begin // Comando que va dar inicio a la impresion memo1.Lines.Add('recibiendo impresion'); resp := TStringList.Create; resp.Sorted := False; for i:=0 to ASender.Params.Count-1 do begin resp.add(ASender.Params.Strings[i]); end; if verificarParametros(resp) then begin memo1.Lines.Add('seteado parametros'); if impresora.setearParametros(resp) then begin memo1.Lines.Add('mandando a imprimir'); th := TStringList.Create; th.Add(impresora.imprimir()); ASender.SetResponse(th); end; end else memo1.Lines.Add('error en el seteo de parametros'); end; function TFServidor.verificarParametros(param : TStringList) : boolean; var res : boolean; begin res:=false; if param.Strings[1]='FISCAL' then begin if verificarCantArticulos(param) then begin if verificarIndicadores(param) then res:=true; end end else begin if param.Strings[1]='NO FISCAL' then res:=true; end; result:=res; end; function TFServidor.verificarCantArticulos(param : TStringList) : boolean; var i :integer; res : boolean; begin //verificamos cantidad de parametros // por defecto tiene 15 + ( 7 * Cantidad de Items de Articulos) res:=false; cantArt := 0; for i := 0 to param.Count-1 do begin if param.Strings[i]='ITEM' then cantArt:=cantArt+1; end; // Verificamos que la Cantidad de articulos OK if param.Count = (15 + ( 7 * cantArt)) then res:=true; result:=res; end; function TFServidor.verificarIndicadores(param : TStringList) : boolean; var res : boolean; index,i : integer; ParamSort : TStringList; begin res:=false; ParamSort := TStringList.Create(); for i := 0 to param.Count-1 do begin ParamSort.Add(param.Strings[i]); end; ParamSort.Sort; if ParamSort.Find('TIPO',index) then if ParamSort.Find('PUERTO',index) then if ParamSort.Find('CABEZERA',index) then if ParamSort.Find('ITEM',index) then if ParamSort.Find('CIERRE',index) then res:=true; result:=res; end; procedure TFServidor.serverComandoCierreXCommand(ASender: TIdCommand); var resp : TStringList; begin resp := TStringList.Create; try secCrit.Enter; if impresora.cierreX then <------------ aca da la Excepcion begin resp.Add('Cierre X'); ASender.SetResponse(resp); end; finally secCrit.Leave; end; end; *******************************************************************+ unit EpsonFiscal; interface uses EPSON_Impresora_Fiscal_TLB, comobj, ImpresoraFiscal, classes,utiles,SysUtils,Math; type TItem = record descripcion,cantidad,prUnitario,tasaIva,noGravado,descExtra : widestring; end; type TEpsonTM2000AF = class(TImpresoraFiscal) <--esta clase es base se implementan los metodos private port : integer; baud : widestring; items : array of TItem; itemsNF : TStringList; cantArt : integer; public PrnFisc : _PrinterFiscalDisp; constructor Create(); procedure setPuerto( puerto : integer );override; function getPuerto() : integer;override; procedure setBaudRate( baudRate : widestring );override; function getBaudRate() : widestring;override; function abrirTicketFiscal( letraDoc, ivaEmisor, ivaComprador, nombreCliente, docCliente, nroDocCliente, domicilio1, domicilio2 : widestring ) : boolean; overload;override; function abrirTicketFiscal() : boolean;overload;override; function enviarItemFiscal( descripcion, cantidad, prUnitario, tasaIVA, impNoGravado, desc1 : Widestring) : boolean; overload;override; function enviarItemFiscal() : boolean; overload;override; function cerrarTicketFiscal( letraDoc, saludo: widestring) : boolean;overload;override; function cerrarTicketFiscal() : boolean;overload;override; function abrirTicketN0Fiscal() : boolean; override; function enviarItemNoFiscal(item : widestring) : boolean;overload;override; function enviarItemNoFiscal() : boolean;overload;override; function cerrarTicketNoFiscal() : boolean;override; function verificarParamentros(param : TStringList) : boolean;override; function setearParametros(param : TStringList) : boolean;override; function imprimir() : string;override; function cierreX() : boolean;override; end; implementation uses Servidor; constructor TEpsonTM2000AF.Create; begin inherited; setMarca('Epson'); setModelo('TM2000AF'); PrnFisc := CreateComObject(CLASS_PrinterFiscal) as _PrinterFiscalDisp; prnfisc.PortNumber:=1; prnfisc.BaudRate:='9600'; itemsNF := TStringList.Create(); itemsNF.Sorted:=False; end; function TEpsonTM2000AF.cierreX() : boolean; var Aux1,Aux2:WideString; resp: boolean; begin Aux1:='X'; Aux2:='P'; resp:=prnFisc.CloseJournal(Aux1,Aux2); ActualizarMemo('CIERRE X'); result :=resp; end; function TEpsonTM2000AF.imprimir() : string; var resp : string; i : integer; aux : widestring; begin resp:=''; fservidor.memo1.Lines.Add('comenzando impresion'); if tipo_impresion = 'FISCAL' then begin if abrirTicketFiscal() then begin if enviarItemFiscal() then begin if cerrarTicketFiscal() then resp:=PrnFisc.AnswerField_3; end; end ; end else begin if tipo_impresion = 'NO FISCAL' then begin resp:='Imp NF '; if abrirTicketN0Fiscal() then begin resp:=resp+'Abrir NF '; if enviarItemNoFiscal() then begin resp:=resp+'Item NF '; if cerrarTicketNoFiscal() then begin resp:=resp+'Cerrar NF' end; end; end; end; end; result:=resp; end; Última edición por PeLuCa fecha: 27-04-2005 a las 04:13:20. |
|
#7
|
|||
|
|||
|
Peluca:
Estuve pegando una mirada, muy por arriba a tu código y me parece que el problema se podría solucionar poniendo impresora : TImpresoraFiscal; en la parte pública de la clase.. En estos momentos no tengo el delphi, pero cuando llegue a mi casa lo verifico. De paso te comento que me gustaría si podés que me pases la clase para el acceso a la impresora fiscal.. Me gustaría saber acerca de su manejo... Mas tarde posteo de nuevo... Saludos |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|