Thread de insercao e consulta no FireBird
Olá pessoal
Estou fazendo um sistema onde preciso consultar e gravar em algumas tabelas do FireBird
O problema é o seguinte
O sistema fica em um loop verificando uma tabela paradox vazia
Qdo existir algum registro nesta tabela crio uma instancia de uma thread passando alguns parametros... assim:
ThreadRodBel := TThreadRodBel.Create(True);
ThreadRodBel.Cod_Barra := tbCodBarra.FieldByName´CODBARRA´).Value;
ThreadRodBel.NumCatraca := tbCodBarra.FieldByName(´NRCAT´).Value;
ThreadRodBel.NumPortaria := NumeroPortaria;
ThreadRodBel.Resume;
tbCodBarra.Delete;
tbCodBarra.Refresh;
A ThreadRodBel faz algumas verificacoes fazendo chamadas de procedures, grava um registro em uma tabela ( Historicos ) e edita uma tabela ( Acessos ) e aind grava um registro em uma tabela paradox
Decidi usar thread pois o sistema deve controlar varias catracas
Fiz um programa q insere um registro na tabela paradox que o sistema fica monitorando.
O problema é que da um pau no FireBird.... simplesmente o sistema trava e o cursor fica em forma de ampulheta SQL.
Passei a usar o componente TIB_Transaction, para ver se dava certo, mas o probela continuou
Estou fazendo um sistema onde preciso consultar e gravar em algumas tabelas do FireBird
O problema é o seguinte
O sistema fica em um loop verificando uma tabela paradox vazia
Qdo existir algum registro nesta tabela crio uma instancia de uma thread passando alguns parametros... assim:
ThreadRodBel := TThreadRodBel.Create(True);
ThreadRodBel.Cod_Barra := tbCodBarra.FieldByName´CODBARRA´).Value;
ThreadRodBel.NumCatraca := tbCodBarra.FieldByName(´NRCAT´).Value;
ThreadRodBel.NumPortaria := NumeroPortaria;
ThreadRodBel.Resume;
tbCodBarra.Delete;
tbCodBarra.Refresh;
A ThreadRodBel faz algumas verificacoes fazendo chamadas de procedures, grava um registro em uma tabela ( Historicos ) e edita uma tabela ( Acessos ) e aind grava um registro em uma tabela paradox
Decidi usar thread pois o sistema deve controlar varias catracas
Fiz um programa q insere um registro na tabela paradox que o sistema fica monitorando.
O problema é que da um pau no FireBird.... simplesmente o sistema trava e o cursor fica em forma de ampulheta SQL.
Passei a usar o componente TIB_Transaction, para ver se dava certo, mas o probela continuou
Colerapunk
Curtidas 0
Respostas
Ericksasse
27/04/2005
Pelo menos no DBExpress, cada instância da thread precisa ter uma instância exclusiva da conexão com o banco:
http://www.ericksasse.com.br/?p=243
http://www.ericksasse.com.br/?p=243
GOSTEI 0
Colerapunk
27/04/2005
E ai ErickSasse vc poderia me dar uma exemplo de como posso faze isso?
A minha rotina de gravacao dentro da Thread esta assim
========================================
if not Form_Principal.IB_Transaction1.InTransaction then
Form_Principal.IB_Transaction1.StartTransaction;
Form_Principal.tbHistoricoAcesso.Append;
Form_Principal.tbHistoricoAcesso.FieldByName(´COD_PESSOA´).Value := Cod_pessoa;
Form_Principal.tbHistoricoAcesso.FieldByName(´NOME´).Value := Nome;
Form_Principal.tbHistoricoAcesso.FieldByName(´DATA´).Value := Date;
Form_Principal.tbHistoricoAcesso.FieldByName(´HORA´).Value := Time ;
Form_Principal.tbHistoricoAcesso.FieldByName(´MOTIVO_DESCRICAO´).Value := Motivo;
Form_Principal.tbHistoricoAcesso.FieldByName(´NUM_CARTEIRA´).Value := CodCarteira;
Form_Principal.tbHistoricoAcesso.Post;
if Form_Principal.IB_Transaction1.InTransaction then
Form_Principal.IB_Transaction1.CommitRetaining;
=======================================
Valeu cara
A minha rotina de gravacao dentro da Thread esta assim
========================================
if not Form_Principal.IB_Transaction1.InTransaction then
Form_Principal.IB_Transaction1.StartTransaction;
Form_Principal.tbHistoricoAcesso.Append;
Form_Principal.tbHistoricoAcesso.FieldByName(´COD_PESSOA´).Value := Cod_pessoa;
Form_Principal.tbHistoricoAcesso.FieldByName(´NOME´).Value := Nome;
Form_Principal.tbHistoricoAcesso.FieldByName(´DATA´).Value := Date;
Form_Principal.tbHistoricoAcesso.FieldByName(´HORA´).Value := Time ;
Form_Principal.tbHistoricoAcesso.FieldByName(´MOTIVO_DESCRICAO´).Value := Motivo;
Form_Principal.tbHistoricoAcesso.FieldByName(´NUM_CARTEIRA´).Value := CodCarteira;
Form_Principal.tbHistoricoAcesso.Post;
if Form_Principal.IB_Transaction1.InTransaction then
Form_Principal.IB_Transaction1.CommitRetaining;
=======================================
Valeu cara
GOSTEI 0
Ericksasse
27/04/2005
Threads não é um assunto tão simples, recomendo ler os artigos indicados aqui: http://distribucon.com/blog/archive/2004/12/23/367.aspx
Você não pode acessar objetos da VCL livremente dentro de uma thread como você está fazendo.
Você não pode acessar objetos da VCL livremente dentro de uma thread como você está fazendo.
GOSTEI 0
Cabelo
27/04/2005
Colega..
Só um apergunta.. pq vc não cria uma thread para ficar verificando se a tabela paradox está vazia, e se não estiver, pq vc não acessa uma stored procedure direto no banco.. isso lhe pouparia trabalho e ganhartia em velocidade..
Só um apergunta.. pq vc não cria uma thread para ficar verificando se a tabela paradox está vazia, e se não estiver, pq vc não acessa uma stored procedure direto no banco.. isso lhe pouparia trabalho e ganhartia em velocidade..
GOSTEI 0
Colerapunk
27/04/2005
E ai Cabelo
Ja estou fazendo isso.... a thread fica verificando se a tabela esta vazia... se nao estiver chama uma procedure do banco q me retorna os valores q preciso.... ai eu mostro os resultados na tela e mando os comandos para a catraca... so a gravacao do historico q nao estou fazendo por procedure...
Tenho q usar thread pq o sistema fica verificando se a pessoa girou o braço da catraca (fico em um loop verificando isso)...
Mas valeu pela dica e agradeço todos ai do forum....
ja estou resolvendo os problema aki. e ainda aprendi a trabalhar com threads da forma correta...
Valeu d+
Ja estou fazendo isso.... a thread fica verificando se a tabela esta vazia... se nao estiver chama uma procedure do banco q me retorna os valores q preciso.... ai eu mostro os resultados na tela e mando os comandos para a catraca... so a gravacao do historico q nao estou fazendo por procedure...
Tenho q usar thread pq o sistema fica verificando se a pessoa girou o braço da catraca (fico em um loop verificando isso)...
Mas valeu pela dica e agradeço todos ai do forum....
ja estou resolvendo os problema aki. e ainda aprendi a trabalhar com threads da forma correta...
Valeu d+
GOSTEI 0