Verificação se registro Existe em fração de segundos

Delphi

25/09/2007

Olá

E ai galera... pelo assunto parece ser algo bem simples de fazer, mas na prática estou tendo dificuldades. Tenho um sistema que captura todas as informações de jobs impressos em um servidor de impressão (aproximadamente 80 impressoras instaladas), porém estão havendo várias inconsistências de registros e em alguns casos ele não está nem conseguindo capturar a informação do job. Tenho uma unit que consegui no grupo dos desenvolvedores da CodeGear, onde tenho uma procedure que retorna uma lista dos jobs com STATUS concluído, e para cada job da fila essa procedure retorna cerca de 4 a 6 registros, praticamente com as mesmas informações, exceto o número de páginas do job, que pode variar e nesse caso, preciso pegar o maior registro que é retornado.

Estou usando um ClientDataSet em memória onde faço um insert na primeira vez que o id do job é retornado pela função, e nas próximas vezes faço um pesquisa através do locate no ClientDataSet, e dou um Update caso o volume de páginas seja maior ao já cadastrado.

Meu problema é que todo esse processo demora menos de 1 segundo, e levando em consideração que essas cerca de 80 impressões podem imprimir quase que ao mesmo tempo (imagino que no pico de impressões cerca de 40 requisições são feitas ao clientdataset em 1 segundo).

Creio que nesse caso o ClientDataSet em memória não seja a forma mais aconselhável, mas não sei nenhuma outra forma de guardar todas essas informações por cerca de 20 minutos onde todas as informações são gravadas em um banco de dados e excluídas da memória salvo a condição de não existir nenhum job sendo concluído na fila.

Alguém poderia me dar alguma outra dica de trabalhar com essas informações, onde o espaço de tempo entre os registros e a pesquisa dos mesmos não fosse causar perda de informações.

Dicas serão muito bem-vindas.

Agradeço desde já pela ajuda.

Att


Maikel

Maikel

Curtidas 0

Respostas

Paulo Samurai

Paulo Samurai

25/09/2007

Olá, não sei se resolverá, mas uma ideia seria dividir o processo em duas threads.

Uma delas pegaria e popularia uma lista com os jobs, sempre adicionando. A outra se preocuparia com analisar a lista, remover as duplicações e armazenar os dados no bd.

A thread de leitura teria maior prioridade :)

[]´s


GOSTEI 0
Maikel

Maikel

25/09/2007

Bom dia Paulo Samurai

Agradeço muito pela sua atenção e ajuda, e se possível, pedir mais um help.
Você teria algum exemplo ai de como trabalhar com thread, como faço para jogar os valores a ela, pesquisar registros existentes e depois como resgatar os mesmos para serem jogados np BD.

Valeu...

Att


GOSTEI 0
Paulo Samurai

Paulo Samurai

25/09/2007

Olá, eu tenho pouca experiencia com thread, mas a ideia é a seguinte:


TMinhaThread = class(TThread)
private
  FMensagem: string;
  procedure AddLog;
public
  property MemoLog: TMemo read FMemoLog write FMemoLog;
  procedure Execute; override;
end;

procedure TMinhaThread.Execute;
begin
  // Tudo o que voce escrever aqui vai ser executado durante a thread.
  // Para iterar com a thread principal voce tem que usar syncronize, ex:
  FMensagem := ´Passei por aqui´;
  Syncronize(AddLog);
end;

procedure TMinhaThread.AddLog;
begin 
  if Assigned(FMemoLog) then 
    FMemoLog.Lines.Add(FMensagem);
end;


Para usar a thread seria assim:

private
  FThread: TMinhaThread;
....
begin
  FThread := TMinhaThread.Create(true);
  FThread.MemoLog := Memo1;
  FThread.resume;
end;


No caso, voce poderia alimentar uma TObjectlist do datamodule ou outra estrutura de dados com os dados obtidos nesta thread... a outra opera com o banco de dados.. o código para operar com o banco de dados é exatamente o mesmo que voce está acostumado a usar... mas a conexão com o banco de dados merece algum cuidado ;)

- Eu prefiro criar minha conexão dentro da propria thread
- ADO requer um CoInitialize para operar com multithread, outros componentes podem ter outras exigencias

Espere que ajude ;)

[]´s


GOSTEI 0
Maikel

Maikel

25/09/2007

Paulo Samurai... valeu ai pela ajuda... obrigado mesmo

vou tentar usar aqui, encontrei mais alguns materiais na internet e um exemplo bem prático no grupo da CodeGear.

Qualquer coisa posto os resultados aqui.

Valeu


GOSTEI 0
POSTAR