Tengo una problema al capturar de eventos. Algunos se pierden.
Pongo un ejemplo:
Recibo un evento en el cliente y se ejecuta correctamente el evento asociado.
Pero cada x tiempo pierdo algun evento.
El evento asociado tarda varios segundos en completarse, pueden ser como 10 segundos, ejecutando un par de querys, updates y commit, ademas de llamadas a reproducir sonido con mediaplayer y tambien uso SAPI de microsoft para Texto a voz. Obviamente si recivo uno o mas evento durante el procesamiento, marco el hecho y sin hacer nada mas, y al terminar el proceso actual, comienzo uno nuevo.
Algo de codigo:
procedure TdmMain1.dbeventLLAMA_PERSONAAlert(ASender: TFDCustomEventAlerter; const AEventName: string; const AArgument: Variant); begin if CompareText(AEventName, 'LLAMA_PERSONA') = 0 then begin lNewAlert := True; while lNewAlert and not lRunning do begin lNewAlert := False; lRunning := True; try ProcessCall; finally lRunning := False; end; end; end; end;
procedure TfrmPerson.LlamaPersona(Sender: TObject; Descripcion, puesto: string); begin // Sound Alert if Length(mp1.FileName) > 0 then begin mp1.Open; mp1.Wait := True; mp1.Play; mp1.Close; end; if UpperCase(Txt2Voz) = 'S' then TextoAVoz; end;
procedure TfrmPerson.TextoAVoz; var // SavedCW: Word; CoSuccess: HResult; begin CoSuccess := CoInitializeEx(nil, COINIT_MULTITHREADED); // http://stackoverflow.com/questions/3032739/delphi-sapi-text-to-speech// Solucion bug division por cero. // SavedCW := Get8087CW; // Set8087CW(SavedCW or $4); SpVoice1.Speak('Atención. ' + dmMain1.Descripcion + ', consultorio' + dmMain1.puesto, 2); CoUninitialize; // Set8087CW(SavedCW); end;
procedure TdmMain1.DefEvent; begin dbeventLLAMA_PERSONA.Active := False; dbeventLLAMA_PERSONA.Options.Synchronize := False; dbeventLLAMA_PERSONA.Names.Clear; dbeventLLAMA_PERSONA.Names.Add('LLAMA_PERSONA'); dbeventLLAMA_PERSONA.Options.Timeout := 0; dbeventLLAMA_PERSONA.Active := True; end;
Estoy perdiendo eventos y no se porque.
Puede haber otra causal de la perdida de eventos.
Hay alguna forma de asegurarse que se reciban los todos eventos
Estoy usando Berlin + FB2.5 Classic.
Actualmente soluciono el tema utilizando fuearza bruta (un query cada 3 segundos), el tema es que ahora tengo que poner 15 puestos mas, y no quiciera entorpecer tanto la red.
Apreciaré comentarios y experiencias