Sistema Travando
Pessoal na vida de ano aconteceu uma coisa em meu sistema que esta me deixando maluco....
Quando efetuo uma venda em meu sistema ele funciona nomal mas quando vou feichar a venda o sistema ocupa entre 85 a 99% da CPU e trava e o sistema nao fazia isso e agora eu voutei um backup da primeira versao do frente de caixa e continua fazendo a mesma coisa ja mudei tudo e continua a mesma coisa sempre quando vou finalizar a venda ele trava... deletei as dll ele funcionou durante um dia mas depois voutou a dar o mesmo problema uso as dll da bematech, elpson, daruma e elgin para o sistema...
Formatei o meu pc achando que era virus mas pelo jeito nao é...
alguemtem alguma ideia doque pode ser pois as minhas ja se esgotarao....
estou usando o delphi 2006 + firebird 2.1
Quando efetuo uma venda em meu sistema ele funciona nomal mas quando vou feichar a venda o sistema ocupa entre 85 a 99% da CPU e trava e o sistema nao fazia isso e agora eu voutei um backup da primeira versao do frente de caixa e continua fazendo a mesma coisa ja mudei tudo e continua a mesma coisa sempre quando vou finalizar a venda ele trava... deletei as dll ele funcionou durante um dia mas depois voutou a dar o mesmo problema uso as dll da bematech, elpson, daruma e elgin para o sistema...
Formatei o meu pc achando que era virus mas pelo jeito nao é...
alguemtem alguma ideia doque pode ser pois as minhas ja se esgotarao....
estou usando o delphi 2006 + firebird 2.1
Laelson Fagundes
Curtidas 0
Respostas
Pjrm1470
09/01/2010
Amigo debuge a parte em que o seu sistema dispara a CPU e trava. O que pode estar travando pode ser:
- Thread mal feita.
- Loop sem fim.
- Caso esteja varrendo dados em um dataset usando o "while not dataset.eof", talvez esteja faltando o DataSet.Next.
Verifique isso. Em alguma parte há algo sendo executado sem fim. Cuidado com thread, é bacana trabalhar com ela, porém tem que saber usa-lo.
Da uma olhada e volte a postar.
GOSTEI 0
Laelson Fagundes
09/01/2010
Eu axo q o problema esta aqui no loop no repeat
e na until
pois o sistema trava quando eu finalizando o pagamento...
gosataria de uma dica de como posso substituir esse loop ou parar ele para nao acontecer oq esta acontecendo no sistema...
==================================================================================================================== if not Orcamento then
begin
repeat
vValorPago := 0;
vValorDinheiro := 0;
vValorCheque := 0;
vValorCartao := 0;
fm_pagamentos := Tfm_pagamentos.Create(Application);
try
{$REGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}
fm_pagamentos.lbl_dinheiro.Enabled := (i_Tipo in [2,6,10,14]) or (i_SolicitaEntrada = 1) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_dinheiro.Enabled := (i_Tipo in [2,6,10,14]) or (i_SolicitaEntrada = 1) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.lbl_cheque.Enabled := (i_Tipo in [4,6,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_cheque.Enabled := (i_Tipo in [4,6,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.lbl_cartao.Enabled := (i_Tipo in [8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_cartao.Enabled := (i_Tipo in [8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
{$ENDREGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}
fTroco := (vValorDinheiro+vValorCartao+vValorCheque)-fTotalPagar;
fm_pagamentos.lbl_restante.Caption := FormatFloat('###,###,###,##0.00',fTroco);
fm_pagamentos.lbl_desconto.Caption := FormatFloat('###,###,###,##0.00',fDesconto);
fm_pagamentos.lbl_total_pagar.Caption := FormatFloat('###,###,###,##0.00',fTotalPagar);
if (i_Tipo in [2,4,6,8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
begin
if fm_pagamentos.ShowModal = mrOk then
begin
vValorDinheiro := StrToFloat(fm_pagamentos.edt_dinheiro.Text);
vValorCheque := StrToFloat(fm_pagamentos.edt_cheque.Text);
vValorCartao := StrToFloat(fm_pagamentos.edt_cartao.Text);
vValorPago := (vValorDinheiro + vValorCheque + vValorCartao);
end
else
begin
SetarValorPadrao;
JBMensagem('Ação cancelada!, para fechar a venda/orçamento pressione F2 novamente.');
Exit;
end;
end;
finally
FreeAndNil(fm_pagamentos);
end;// try;
if ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao
else if i_AvistaAprazo = 1 then
vVAlorEntrada := vValorDinheiro
else
vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao;
if vVAlorEntrada >= fTotalPagar then
vVAlorEntrada := fTotalPagar;
if (i_AvistaAprazo = 0) and (i_Tipo in [2,4,6,8,10,12,14]) then
if StrToFloat(FormatFloat('##0.00', vValorPago)) < StrToFloat(FormatFloat('##0.00', fTotalPagar)) then
JBMensagem('O valor a ser pago não pode ser menor que o valor total a pagar!');
until (vValorPago >= fTotalPagar) or (i_Tipo = 16);
end;
pois o sistema trava quando eu finalizando o pagamento...
gosataria de uma dica de como posso substituir esse loop ou parar ele para nao acontecer oq esta acontecendo no sistema...
==================================================================================================================== if not Orcamento then
begin
repeat
vValorPago := 0;
vValorDinheiro := 0;
vValorCheque := 0;
vValorCartao := 0;
fm_pagamentos := Tfm_pagamentos.Create(Application);
try
{$REGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}
fm_pagamentos.lbl_dinheiro.Enabled := (i_Tipo in [2,6,10,14]) or (i_SolicitaEntrada = 1) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_dinheiro.Enabled := (i_Tipo in [2,6,10,14]) or (i_SolicitaEntrada = 1) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.lbl_cheque.Enabled := (i_Tipo in [4,6,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_cheque.Enabled := (i_Tipo in [4,6,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.lbl_cartao.Enabled := (i_Tipo in [8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_cartao.Enabled := (i_Tipo in [8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
{$ENDREGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}
fTroco := (vValorDinheiro+vValorCartao+vValorCheque)-fTotalPagar;
fm_pagamentos.lbl_restante.Caption := FormatFloat('###,###,###,##0.00',fTroco);
fm_pagamentos.lbl_desconto.Caption := FormatFloat('###,###,###,##0.00',fDesconto);
fm_pagamentos.lbl_total_pagar.Caption := FormatFloat('###,###,###,##0.00',fTotalPagar);
if (i_Tipo in [2,4,6,8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
begin
if fm_pagamentos.ShowModal = mrOk then
begin
vValorDinheiro := StrToFloat(fm_pagamentos.edt_dinheiro.Text);
vValorCheque := StrToFloat(fm_pagamentos.edt_cheque.Text);
vValorCartao := StrToFloat(fm_pagamentos.edt_cartao.Text);
vValorPago := (vValorDinheiro + vValorCheque + vValorCartao);
end
else
begin
SetarValorPadrao;
JBMensagem('Ação cancelada!, para fechar a venda/orçamento pressione F2 novamente.');
Exit;
end;
end;
finally
FreeAndNil(fm_pagamentos);
end;// try;
if ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao
else if i_AvistaAprazo = 1 then
vVAlorEntrada := vValorDinheiro
else
vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao;
if vVAlorEntrada >= fTotalPagar then
vVAlorEntrada := fTotalPagar;
if (i_AvistaAprazo = 0) and (i_Tipo in [2,4,6,8,10,12,14]) then
if StrToFloat(FormatFloat('##0.00', vValorPago)) < StrToFloat(FormatFloat('##0.00', fTotalPagar)) then
JBMensagem('O valor a ser pago não pode ser menor que o valor total a pagar!');
until (vValorPago >= fTotalPagar) or (i_Tipo = 16);
end;
GOSTEI 0
Emerson Nascimento
09/01/2010
if not Orcamento then
begin
vValorPago := 0;
vValorDinheiro := 0;
vValorCheque := 0;
vValorCartao := 0;
repeat
fm_pagamentos := Tfm_pagamentos.Create(Application);
try
{$REGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}
fm_pagamentos.lbl_dinheiro.Enabled := (i_Tipo in [2,6,10,14]) or (i_SolicitaEntrada = 1) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_dinheiro.Enabled := fm_pagamentos.lbl_dinheiro.Enabled;
fm_pagamentos.edt_dinheiro.text := FormatFloat('###,###,###,##0.00', vValorDinheiro);
fm_pagamentos.lbl_cheque.Enabled := (i_Tipo in [4,6,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_cheque.Enabled := fm_pagamentos.lbl_cheque.Enabled;
fm_pagamentos.edt_cheque.text := FormatFloat('###,###,###,##0.00', vValorCheque);
fm_pagamentos.lbl_cartao.Enabled := (i_Tipo in [8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_cartao.Enabled := fm_pagamentos.lbl_cartao.Enabled;
fm_pagamentos.edt_cartao.text := FormatFloat('###,###,###,##0.00', vValorCartao);
{$ENDREGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}
fTroco := (vValorDinheiro+vValorCartao+vValorCheque)-fTotalPagar;
fm_pagamentos.lbl_restante.Caption := FormatFloat('###,###,###,##0.00',fTroco);
fm_pagamentos.lbl_desconto.Caption := FormatFloat('###,###,###,##0.00',fDesconto);
fm_pagamentos.lbl_total_pagar.Caption := FormatFloat('###,###,###,##0.00',fTotalPagar);
if (i_Tipo in [2,4,6,8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
begin
if fm_pagamentos.ShowModal = mrOk then
begin
vValorDinheiro := StrToFloat(fm_pagamentos.edt_dinheiro.Text);
vValorCheque := StrToFloat(fm_pagamentos.edt_cheque.Text);
vValorCartao := StrToFloat(fm_pagamentos.edt_cartao.Text);
vValorPago := (vValorDinheiro + vValorCheque + vValorCartao);
end
else
begin
SetarValorPadrao;
JBMensagem('Ação cancelada!, para fechar a venda/orçamento pressione F2 novamente.');
FreeAndNil(fm_pagamentos);
Exit;
end;
end;
finally
FreeAndNil(fm_pagamentos);
end;// try;
if ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao
else if i_AvistaAprazo = 1 then
vVAlorEntrada := vValorDinheiro
else
vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao;
if vVAlorEntrada >= fTotalPagar then
vVAlorEntrada := fTotalPagar;
if (i_AvistaAprazo = 0) and (i_Tipo in [2,4,6,8,10,12,14]) and (vValorPago < fTotalPagar) then
JBMensagem('O valor a ser pago não pode ser menor que o valor total a pagar!');
until (vValorPago >= fTotalPagar) or (i_Tipo = 16);
end;
verifique as linhas em negrito:
- se o if..then não for atendido (se é que há essa possibilidade), quem preenche o valor de vValorPago?
- a rotina SetarValorPadrao preenche vValorPago?
ao que parece essa variável não está sendo incrementada.
begin
vValorPago := 0;
vValorDinheiro := 0;
vValorCheque := 0;
vValorCartao := 0;
repeat
fm_pagamentos := Tfm_pagamentos.Create(Application);
try
{$REGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}
fm_pagamentos.lbl_dinheiro.Enabled := (i_Tipo in [2,6,10,14]) or (i_SolicitaEntrada = 1) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_dinheiro.Enabled := fm_pagamentos.lbl_dinheiro.Enabled;
fm_pagamentos.edt_dinheiro.text := FormatFloat('###,###,###,##0.00', vValorDinheiro);
fm_pagamentos.lbl_cheque.Enabled := (i_Tipo in [4,6,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_cheque.Enabled := fm_pagamentos.lbl_cheque.Enabled;
fm_pagamentos.edt_cheque.text := FormatFloat('###,###,###,##0.00', vValorCheque);
fm_pagamentos.lbl_cartao.Enabled := (i_Tipo in [8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
fm_pagamentos.edt_cartao.Enabled := fm_pagamentos.lbl_cartao.Enabled;
fm_pagamentos.edt_cartao.text := FormatFloat('###,###,###,##0.00', vValorCartao);
{$ENDREGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}
fTroco := (vValorDinheiro+vValorCartao+vValorCheque)-fTotalPagar;
fm_pagamentos.lbl_restante.Caption := FormatFloat('###,###,###,##0.00',fTroco);
fm_pagamentos.lbl_desconto.Caption := FormatFloat('###,###,###,##0.00',fDesconto);
fm_pagamentos.lbl_total_pagar.Caption := FormatFloat('###,###,###,##0.00',fTotalPagar);
if (i_Tipo in [2,4,6,8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
begin
if fm_pagamentos.ShowModal = mrOk then
begin
vValorDinheiro := StrToFloat(fm_pagamentos.edt_dinheiro.Text);
vValorCheque := StrToFloat(fm_pagamentos.edt_cheque.Text);
vValorCartao := StrToFloat(fm_pagamentos.edt_cartao.Text);
vValorPago := (vValorDinheiro + vValorCheque + vValorCartao);
end
else
begin
SetarValorPadrao;
JBMensagem('Ação cancelada!, para fechar a venda/orçamento pressione F2 novamente.');
FreeAndNil(fm_pagamentos);
Exit;
end;
end;
finally
FreeAndNil(fm_pagamentos);
end;// try;
if ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao
else if i_AvistaAprazo = 1 then
vVAlorEntrada := vValorDinheiro
else
vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao;
if vVAlorEntrada >= fTotalPagar then
vVAlorEntrada := fTotalPagar;
if (i_AvistaAprazo = 0) and (i_Tipo in [2,4,6,8,10,12,14]) and (vValorPago < fTotalPagar) then
JBMensagem('O valor a ser pago não pode ser menor que o valor total a pagar!');
until (vValorPago >= fTotalPagar) or (i_Tipo = 16);
end;
verifique as linhas em negrito:
- se o if..then não for atendido (se é que há essa possibilidade), quem preenche o valor de vValorPago?
- a rotina SetarValorPadrao preenche vValorPago?
ao que parece essa variável não está sendo incrementada.
GOSTEI 0
Pjrm1470
09/01/2010
Já tentou utilizar outra forma de validação sem utilizar um loop para repetir o processo?
Já tentou utilizar labels para dar retorno a uma parte do codigo em que vc quer?
Se a intenção é repetir todo o codigo da procedure, basta rechamar a procedure em vez de utilizar um loop.
> Label Volta;
> begin
> Volta:
> if True then
> goto Volta;
| FreeAndNil(fm_pagamentos);
Aconselho a utilizar:
> fm_pagamentos.Free;
|if StrToFloat(FormatFloat('##0.00', vValorPago)) < StrToFloat(FormatFloat('##0.00', fTotalPagar)) then
| JBMensagem('O valor a ser pago não pode ser menor que o valor total a pagar!');
Porque não colocar essa validação dentro do fm_pagamentos? Assim vc evita tambem o loop infinito e garante que a pessoa so digite um valor correto.
veja bem:
if (i_Tipo in [2,4,6,8,10,12,14]) or
((i_Tipo = 16) and
(i_SolicitaEntrada = 1)) then e: until (vValorPago >= fTotalPagar) or (i_Tipo = 16); O que me leva a pensar que esse loop ta na cara que vai ser infinito. Tem a possibilidade de sua variável ter valores [2,4,6,8,10,12,14] e so sai do loop se for atender um 16. "Há algo de podre no reino da dinamarca", Não acha!? se o tipo não for 16 e a outra condição do Until não atender vai sempre repetir. Antes de tudo, você debugou para ver aonde ta travando? (com F8 e principalmente com F7) Aguardo, pjrm1470.
((i_Tipo = 16) and
(i_SolicitaEntrada = 1)) then e: until (vValorPago >= fTotalPagar) or (i_Tipo = 16); O que me leva a pensar que esse loop ta na cara que vai ser infinito. Tem a possibilidade de sua variável ter valores [2,4,6,8,10,12,14] e so sai do loop se for atender um 16. "Há algo de podre no reino da dinamarca", Não acha!? se o tipo não for 16 e a outra condição do Until não atender vai sempre repetir. Antes de tudo, você debugou para ver aonde ta travando? (com F8 e principalmente com F7) Aguardo, pjrm1470.
GOSTEI 0
Laelson Fagundes
09/01/2010
Olá eu ja debuguei sentenas de vezes e quando trava o debug do delphi nao m mostra nada ele trava pq ele ocupa 99 da CPU e o processo fica normal so q CPU fica lotado eu to amarrado nessas funções ja faz 2 semana e nao to conseguindo sair dela nao estou sabendo usar outras funções como vc destacou eu fiz mas quando chego no
until (vValorPago >= fTotalPagar) or (i_Tipo = 16);
não estou sabendo terminar essa função eu queria sair do loop como vc falou uam função mais limpa e que faça a mesma coisa q a outra função
until (vValorPago >= fTotalPagar) or (i_Tipo = 16);
não estou sabendo terminar essa função eu queria sair do loop como vc falou uam função mais limpa e que faça a mesma coisa q a outra função
GOSTEI 0
Laelson Fagundes
09/01/2010
Emerson ja tentei fazer oq vc falou econtinua a mesma coisa o q outro colega disse tem tudo aver mas nao estou conseguindo implementar da forma q ele mensionou...
GOSTEI 0
Laelson Fagundes
09/01/2010
PJRM1470 eu usei o label voltar como vc disse mas sempre ele volta para tela de pagamento nao to sabendo como adicionar ele ao sistema...
sera q poderia m dar uma forcinha aqui com o codigo q eu postei aqui no forum...
sera q poderia m dar uma forcinha aqui com o codigo q eu postei aqui no forum...
GOSTEI 0