Ir para conteúdo
  • Cadastre-se

dev botao

"canvas Does Not Allow Drawing" Quando Rodo A Aplicação Numa Máquina Virtual


Lincoln D
  • Este tópico foi criado há 3668 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom tarde, pessoal.

 

Estou com um problema muito estranho e não sei como resolvê-lo, já fiz várias buscas na internet procurando algum embasamento, mas tudo que tentei até agora não resolveu nada. 

 

O problema só ocorre quando rodo a aplicação através de uma máquina virtual. 

 

Tenho em meu projeto dois componentes ACBrNFe, um ACBrNFeDANFERave e um ACBrNFeDANFERaveCB. Um dos componentes ACBrNFe e o ACBrNFeDANFERave é usado no processo principal para interação direta com o usuário o outro ACBrNFe é usado juntamente com o ACBrNFeDANFERaveCB num processo secundário(thread) para realizar operações de envio de NFe sem intervenção do usuário, é nesse segundo processo que ocorre o meu problema. Não sei porque, mas quando rodo a aplicação através de uma máquina virtual e a aplicação tenta enviar um e-mail com a nota gerada ocorre o erro "Canvas does not allow drawing" .

 

Nas pesquisas que fiz na internet, quase tudo que achei dizia respeito a uma má configuração de impressora. Instalei uma impressora virtual para tentar sanar o problema, mas não resolveu. Gostaria de saber se alguém pode me dar uma luz em relação a isso.

 

Obrigado

Editado por Lincoln D
Link para o comentário
Compartilhar em outros sites

Lincoln D,

 

Vou te falar algumas experiencias que tenho aqui com Canvas / Thread, e então veja se te ajuda...

 

 

Notei que você mencionou 3 coisas importantes:

1. Máquina Virtual

2. Thread

3. RaveCB com Canvas

 

 

Ou seja, se pode partir do princípio que, ao executar um método em Thread em uma máquina virtual, o resultado esperado pode realmente ser diferente do que ao executar em um Console de PC normal, pois as Thread's são executadas em vários níveis diferentes no processador (e então quando em máquina virtual, onde esses níveis são emulados, o resultado pode ser outro).

 

Resumindo, eu também já tive problema parecido, retornando o mesmo erro, quando pintando com Canvas dentro de Threads...

 

A solução encontrada na ocasião foi utilizar os métodos Lock e Unlock do Canvas para que a Thread não perdesse o controle do Canvas.

 

Em suma ficou tudo funcionando perfeitamente, no meu caso, quando TODOS OS MÉTODOS do Canvas estavam protegidos dessa maneira:

procedure TThreadTeste.Execute;
var C: TCanvas;
begin
    ...
    C.Lock; 
    try
      C.Draw....
      C.TextOut....
      ...
    finally
      C.Unlock;
    end;
end;
Link para o comentário
Compartilhar em outros sites

Boa noite, colega!

 

Peço desculpas pela demora na resposta e agradeço muito por essa luz. O que você falou faz todo sentido e eu não tinha parado para pensar nisso "em máquina virtual, onde esses níveis são emulados, o resultado pode ser outro".

Seguirei sua sugestão, mas independente do resultado, manifesto minha gratidão.

 

Abraço

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3668 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...