Fórum Onde está o erro? (thread) #264196

04/01/2005

0

Pessoal onde está o erro? Antes, no final da procedure btconcluirClick eu chamava o procedimento impressaodecupom que usa impressão direta (writeln) funcionava mto bem só que a tela travava e não fechava enquanto o cupom era impresso totalmente, então estou tentando usar thread mas não estou conseguindo. Olhe o que fiz e me ajudem, por favor. :oops:

[color=darkblue:0f7324a407]type
T2 = class(TThread)
private
procedure Execute; override;
procedure chamar_imp;
end; { of class declaration }

procedure Tfrmconcluiravista.btconcluirClick(Sender: TObject);
begin
//registra a venda
(...)
//associa os itens da cesta à venda
(...)
//e já aproveita para alterar o estoque
(...)
//dá baixa no caixa
(...)
//solicita a impressao de cupom
t2.Create(false); //impressão de cupom com thread
close;
end;

procedure t2.chamar_imp;
begin
//a linha abaixo que imprime o cupom
manip_reg.impressaodecupom(codvenda,dados.tbconfiguracoeslargura_cupom.Value,qtdeimpressao);
end;

procedure T2.Execute;
begin
Synchronize(chamar_imp);
end;[/color:0f7324a407]

Da maneira que está acima o cupom não está sendo impresso. (obs.: coloquei um showmessage(´qualquercoisa´) em chamar_imp e a mensagem ´qualquercoisa´ foi exibida, ou seja ele está indo até este procedimento.
Agradeço qualquer ajuda.


Alfadesign

Alfadesign

Responder

Posts

04/01/2005

Dopi

Veja o link a seguir:

http://delphiforum.icft.com.br/forum/viewtopic.php?t=52380

Usei uma Thread com finalidade semelhante... pode ser que ajude...

Usando a Thread citada no tópico vc poderia imprimir cada Linha com um Timeout predefinido... Exemplo:
  Imprimir( ´LINHA A SER IMPRESSA´, #0, 2000);   { Timeout = 2000 milisegundos  (2seg) } 



Responder

Gostei + 0

04/01/2005

Massuda

procedure t2.chamar_imp; begin //a linha abaixo que imprime o cupom manip_reg.impressaodecupom(codvenda,dados.tbconfiguracoeslargura_cupom.Value,qtdeimpressao); end;


De onde surgiu [b:594b966d36]manip_reg[/b:594b966d36]?

Da maneira que está acima o cupom não está sendo impresso. (obs.: coloquei um showmessage(´qualquercoisa´) em chamar_imp e a mensagem ´qualquercoisa´ foi exibida, ou seja ele está indo até este procedimento.

Existe uma ´pegadinha´ com o TThread... se ocorrer uma exceção em TThread.Execute é bem possível que você nem fique sabendo, pois TThread.Execute é executada dentro de um bloco try..finally.

Dependendo de onde você colocou o ShowMessage, pode ser que você tenha visto que chamar_imp é iniciada, mas seria interessante checar se chamar_imp está sendo terminada.


Responder

Gostei + 0

05/01/2005

Alfadesign

[quote:4a5cb0defe=´AlfaDesign´]procedure t2.chamar_imp; begin //a linha abaixo que imprime o cupom manip_reg.impressaodecupom(codvenda,dados.tbconfiguracoeslargura_cupom.Value,qtdeimpressao); end;


De onde surgiu [b:4a5cb0defe]manip_reg[/b:4a5cb0defe]?

Da maneira que está acima o cupom não está sendo impresso. (obs.: coloquei um showmessage(´qualquercoisa´) em chamar_imp e a mensagem ´qualquercoisa´ foi exibida, ou seja ele está indo até este procedimento.

Existe uma ´pegadinha´ com o TThread... se ocorrer uma exceção em TThread.Execute é bem possível que você nem fique sabendo, pois TThread.Execute é executada dentro de um bloco try..finally.

Dependendo de onde você colocou o ShowMessage, pode ser que você tenha visto que chamar_imp é iniciada, mas seria interessante checar se chamar_imp está sendo terminada.[/quote:4a5cb0defe]

Manip_reg é o nome da unit que contem a procedure, esta já esta declarada em uses. Quanto ao local onde coloquei o showmessage foi assim:

procedure t2.chamar_imp;
begin
//a linha abaixo que imprime o cupom
manip_reg.impressaodecupom(codvenda,dados.tbconfiguracoeslargura_cupom.Value,qtdeimpressao);
showmessage(´qualquercoisa´);
end;


Responder

Gostei + 0

05/01/2005

Massuda

Acho que seria interessante você postar o código de manip_reg.impressaodecupom.


Responder

Gostei + 0

05/01/2005

Alfadesign

Acho que seria interessante você postar o código de manip_reg.impressaodecupom.

procedure impressaodecupom(codvenda, largura, n_copias : integer);
var i, s, nc, venda_antiga : integer; //nc = numero de colunas que a impressora aceita
F : TextFile;
x : string;
begin
if largura = 0 then
nc := 70
else
nc := largura;
if n_copias > 0 then
begin
AssignFile(F,dados.porta_impressora);
Rewrite(F);
venda_antiga := dados.tbvendacd_venda.Value;
if dados.tbvenda.Locate(´cd_venda´,codvenda,[]) then
for i := 1 to n_copias do
begin
x := centraliza(´ ´,´ ´, nc);
insere(x,inttostr(i) + ´ª via´,´R´,nc);
writeln(F,X);
imprime(F,nc,1,´ ´,centraliza(´=´,´=´,nc));
imprime(F,nc,1,´ ´,centraliza(´ ORCAMENTO - VENDA ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ orcamento sem validade fiscal ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ exija a nota fiscal ao efetuar sua compra ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´=´,´=´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbconfiguracoesempresa.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbconfiguracoesendereco.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbconfiguracoescidade.Value + ´ tel.: ´ + dados.tbconfiguracoestelefone.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
imprime(F,nc,1,´ ´,´CD_VENDA: ´ + formatfloat(´00000´,dados.tbvendacd_venda.Value));
if dados.tbvendacd_clientes.Value 0 then
begin
//montagem da linha clientes
x := centraliza(´ ´,´ ´,nc);
insere(x,´Cliente: ´+ ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.Value,´nome´)),´L´,1);
insere(x,´Cod: ´ + formatfloat(´00000´,dados.tbvendacd_clientes.Value),´L´, nc-10);
imprime(F,nc,1,´ ´,trim(x));
end
else
imprime(F,nc,1,´ ´,´Cliente: Venda balcao´);
if dados.tbvendacd_clientes.Value 0 then
begin
x := ´´;
if ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´endereco´)) ´´ then
imprime(F,nc,1,´ ´,ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´endereco´)));
if ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´bairro´)) ´´ then
begin
x := ´´;
x := ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´bairro´)) + ´ - ´ ;
x := x + ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´cidade´));
imprime(F,nc,1,´ ´,x);
end;
end;
//montagem da linha funcionario
x := centraliza(´ ´,´ ´,nc);
insere(x,´Vendedor: ´+ ConvString(dados.tbsenha.Lookup(´cd_func´,dados.tbvendacd_func.value,´login´)),´L´,1);
insere(x,datetostr(dados.tbvendadata.Value),´L´, nc-10);
imprime(F,nc,1,´ ´,trim(x));
//
imprime(F,nc,1,´ ´,centraliza(´_´,´_´,nc));
//montagem do cabecalho de produtos
x := centraliza(´ ´,´ ´,nc);
insere(x,´COD. ´,´L´,1);
insere(x,´PRODUTO ´,´L´,6);
insere(x,´QTDE ´,´L´,nc-20);
insere(x,´UNIT.´,´R´,nc-8 );
insere(x,´TOTAL´,´R´,nc);
imprime(F,nc,1,´ ´,trim(x));
//
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
//montagem dos produtos
dados.tbdesc_venda.First;
while not dados.tbdesc_venda.Eof do
begin
x := centraliza(´ ´,´ ´,nc);
insere(x,formatfloat(´0000´,dados.tbdesc_vendacd_produto.Value),´L´,1);
insere(x,copy(dados.tbdesc_vendanome_prod.Value,1,nc-26),´L´,6);
insere(x,floattostr(dados.tbdesc_vendaqtde.Value),´R´,nc-16);
insere(x,format(´¬2f´,[dados.tbdesc_vendavalor.Value]),´R´,nc-8 );
insere(x,format(´¬2f´,[dados.tbdesc_vendasub.Value]),´R´,nc);
imprime(F,nc,1,´ ´,TrimRight(x));
dados.tbdesc_venda.Next;
end;
//
imprime(F,nc,1,´ ´,centraliza(´_´,´_´,nc));
//
x := centraliza(´ ´,´ ´,nc);
insere(x,´QTDE DE PRODUTOS: ´ + inttostr(dados.tbdesc_venda.RecordCount),´L´,1);
insere(x,´TOTAL.....:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendatotal.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));

x := centraliza(´ ´,´ ´,nc);
insere(x,´DESC......:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendadescontos.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));

x := centraliza(´ ´,´ ´,nc);
insere(x,´ACRESC....:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendadespesas.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));

x := centraliza(´ ´,´ ´,nc);
insere(x,´A PAGAR...:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendatotal.Value - dados.tbvendadescontos.Value + dados.tbvendadespesas.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));

x := centraliza(´ ´,´ ´,nc);
insere(x,´PAGO......:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendapago.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));

dados.qrtemp.Close;
dados.qrtemp.SQL.Clear;
dados.qrtemp.SQL.Add(´select * from receber where cd_venda = ´ + inttostr(codvenda));
dados.qrtemp.Open;
if dados.qrtemp.RecordCount > 0 then
begin
x := centraliza(´ ´,´ ´,nc);
insere(x,´DEBITO....:´,´L´,nc-23);
insere(x,inttostr(dados.qrtemp.RecordCount) + ´x´ + formatfloat(dados.formato_decimal,dados.tbreceber.Lookup(´cd_venda´,codvenda,´valor´)),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));
end;
//carne de pagamento
if (dados.tbconfiguracoescarne_cupom.Value = 1) and (dados.qrtemp.RecordCount > 0) then
begin
imprime(F,nc,1,´ ´,centraliza(´ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ VENCIMENTOS ´,´-´,nc));
dados.qrtemp.First;
s := 1;
while not dados.qrtemp.Eof do
begin
imprime(F,nc,1,´ ´,centraliza(´VENC ´ + inttostr(s) + ´: ´ + datetostr(dados.qrtemp.FieldByName(´vencimento´).AsDateTime) + ´ PGTO.: ____/____/________ ´,´ ´,nc));
dados.qrtemp.Next;
s := s + 1;
end;
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
end;
dados.qrtemp.Close;
//
if trim(dados.tbvendaobs.Value) ´´ then
begin
imprime(F,nc,1,´ ´,centraliza(´ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ observacao da venda ´,´-´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbvendaobs.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
end;
imprime(F,nc,1,´ ´,centraliza(´ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbconfiguracoesmensagem.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
imprime(F,nc,1,´ ´,centraliza(´ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´___________________________________________ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ASSINATURA DO RECEBIMENTO´,´ ´,nc));
//impressao do espaco em branco final (para
//que o papel seja ejetado em branco
//automaticamente
for s := 1 to dados.tbconfiguracoessaltos.value do
imprime(F,nc,1,´ ´,´ ´);
Writeln(F,#3); //fim do texto (isto faz parar de puxar o papel
end //for
else
showmessage(´Código de venda não encontrado´);
CloseFile(F);
if not dados.tbvenda.Locate(´cd_venda´,venda_antiga,[]) then
showmessage(´Erro: Venda inicial nao encontrada´);
end;
end;

procedure imprime(var arquivo : textfile; tamanho, alinhamento : integer; caracter, texto: string);
var palavra, palavratemp : string;
final, i : integer;
begin
if length(texto) mod tamanho > 0 then
final := length(texto) div tamanho + 1
else
final := length(texto) div tamanho;
//
for i := 1 to final do
begin
palavra := ´´;
palavra := copy(texto,tamanho*(i-1)+1,tamanho);
{tipos de alinhamento:
1 = esquerdo
2 = centralizado
3 = direito
}
case alinhamento of
1 : writeln(arquivo,palavra);
2 : writeln(arquivo,centraliza(palavra,caracter,tamanho));
3 : begin
palavratemp := centraliza(´´,´ ´,tamanho);
insere(palavratemp,palavra,´r´,tamanho);
writeln(arquivo,palavratemp);
end;
end;
end;
end;

function centraliza(palavra, character : string;largura_linha : integer):string;
var
i : integer;
x : string;
begin
x := ´´;
for i := 1 to (largura_linha - length(palavra)) div 2 do
x := character + x;
centraliza := x + palavra + x;
end;

procedure insere(var palavragrd : string;palavrapq: string; alinhamento : char ; pos : integer);
begin
if upcase(alinhamento) = ´L´ then
insert(palavrapq,palavragrd,pos);
if upcase(alinhamento) = ´R´ then
insert(palavrapq,palavragrd,pos- length(palavrapq));
end;


Responder

Gostei + 0

05/01/2005

Massuda

Não conheço direito essas impressoras de cupons, mas a primeira vista me parece que o código de impressão está OK. Não tenho como afirmar qualquer coisa sobre o acesso ao BD feito de dentro da thread, pois precisaria conhecer melhor seu programa.

Uma pergunta boba :oops: as variáveis [b:1e555f8f9a]codvenda[/b:1e555f8f9a] e [b:1e555f8f9a]qtdeimpressao[/b:1e555f8f9a] possuem valores válidos quando t2.chamar_imp é executada?


Responder

Gostei + 0

05/01/2005

Alfadesign

Não conheço direito essas impressoras de cupons, mas a primeira vista me parece que o código de impressão está OK. Não tenho como afirmar qualquer coisa sobre o acesso ao BD feito de dentro da thread, pois precisaria conhecer melhor seu programa. Uma pergunta boba :oops: as variáveis [b:87a95e989e]codvenda[/b:87a95e989e] e [b:87a95e989e]qtdeimpressao[/b:87a95e989e] possuem valores válidos quando t2.chamar_imp é executada?


Tá tudo certinho, se eu não usar thread ela imprime normalmente, a impressão so não funciona se eu usar thread (na verdade eu estou tentando aprender a usar thread) por isso acho que o erro esta na forma da implementação do mesmo.


Responder

Gostei + 0

05/01/2005

Massuda

Tá tudo certinho, se eu não usar thread ela imprime normalmente, a impressão so não funciona se eu usar thread (na verdade eu estou tentando aprender a usar thread) por isso acho que o erro esta na forma da implementação do mesmo.
Perguntei sobre as variáveis porque foi a única coisa que me ocorreu.

Geralmente uma grande fonte de dor de cabeça em threads é o uso de [b:b3cf686002]variáveis globais[/b:b3cf686002]. Por exemplo...
procedure Tfrmconcluiravista.btconcluirClick(Sender: TObject); 
begin 
  // ...
  
//solicita a impressao de cupom 
  t2.Create(false); //impressão de cupom com thread 
  close; 
end;
Pode ser que quando cria a thread t2, qtdeimpressao 0 mas (por exemplo) quando executa o Close, algum código faz limpeza de valores e faz qtdeimpressao = 0... como não dá para garantir que a thread t2 seja executada antes do Close, sua impressão não seria executada.

você pode evitar o uso de variáveis globais assim:
type 
  T2 = class(TThread) 
  private 
    procedure chamar_imp; 
  protected
    procedure Execute; override; 
  public
    CodigoDaVenda: Integer;
    QuantasCopias: Integer;
  end;

procedure Tfrmconcluiravista.btconcluirClick(Sender: TObject); 
begin 
  // ...

  //solicita a impressao de cupom 
  with T2.Create(True) do begin
    CodigoDaVenda := codvenda;
    QuantasCopias := qtdeimpressao;
    Resume;
  end;
  Close; 
end; 

procedure t2.chamar_imp; 
begin 
  //a linha abaixo que imprime o cupom 
  manip_reg.impressaodecupom(CodigoDaVenda, dados.tbconfiguracoeslargura_cupom.Value, QuantasCopias); 
end; 


Uma outra coisa... se você estiver usando [b:b3cf686002]Delphi 6 sem as atualizações[/b:b3cf686002], existe um bug em TThread.Synchronize; nesse caso, é melhor atualizar seu Delphi.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar