Colocar transações no FB em fila de espera.

21/12/2005

Imaginem um supermercado com 5 PDV emitindo Cupom Fiscal, cada um tem uma Base de Dados e ao fechar o cupom quero transferir os dados da venda para um micro servidor. Beleza tudo funciona muito bem mas o problema é o deadlock quando mais de um caixa fecha o cupom ao mesmo tempo.
Para sulocionar criei tipo de uma sinaleira no banco servidor dou um Post_Event(´Vermelho´) na tabela de vendas quando está sendo inserido ou alterado dados e um Post_Event(´Verde´) na tabela final (Caixa). Nos clientes eu leio este evento dentro de uma classe que fiz no momento que tenta fechar o cupom, na verdade crio o objeto no show do form principal e o objeto da classe fica monitorando, funciona bem se está ocioso mas quando realmente preciso que é antes do comando Transferir não acontece nada. Parece que não consegue executar duas coisas ao mesmo tempo. Por que eu queria com isso dentro de um While not Verde dar um Sleep para aguardar até que o outro caixa termina a transferência.


Mkoch

Respostas

21/12/2005

Pain_elemental

Tente usar a WaitForSingleObject da api do windows. Um exemplo prático eh essa TSimpleThread e TWaitThread, que usa mensagens de sincronização do windows para nao travar a aplicacao e esperar por um objeto.

No caso, voce na thread principal exibiria um formulario modal tipo ´aguarde sua vez :D´ e com o metodo MsgWaitForThread que vai ser a thread que esperará pela sinalização.

http://www.midnightbeach.com/jon/pubs/MsgWaits/SynchedThreads_pas.html


Responder Citar

21/12/2005

Mkoch

Muito obrigado amigo, mas me lembrei de algo muito simples e funcionou muito bem. Dentro do loop que aguarda a mensagem de sinalização usei o Application.ProcessMessages e funcionou muito bem.


Responder Citar

21/12/2005

Pain_elemental

se houver um sleep, voce perdera um pouco em performance, colocando um valor muito baixo voce chamara o Application.ProcessMessages demais e gastará espaço da pilha, e se usar um valor muito alto, congelará a tela. Mas a solução do application.processmessages + sleep dentro de um loop funciona, mas nao gosto dessa abordagem.


Responder Citar

21/12/2005

Mkoch

Hum, entendo, acredito que vc tenha razão, por enquanto vou deixar assim mas vou reabordar este problema.


Responder Citar