ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

mensagem de espera usando Thread.

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
rzzanatta
Novato
Novato


Registrado: Segunda-Feira, 18 de Setembro de 2006
Mensagens: 63

MensagemEnviada: Qui Mar 08, 2012 9:48 am    Assunto: mensagem de espera usando Thread. Responder com Citação

Ola galera, estou fazendo uma rotina de pesquisa no banco, e queria colocar uma mensagem de espera(seria outro form com gif animado mostrando 'Aguarde, em processamento'), mas ela trava enquanto nao termina a pesquisa, e estava mexendo com Thread, mas quando chamo a mensagem de espera que é um form com um gif animado, ele me retorna erro...
"Project ProjectTest.exe raised exception class EInvalidOperation with message 'Canvas does not allow drawing'.

o que seria esse erro?
chamar tela executando uma Thread nao da certo?
obrigado..
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
tanure
Profissional
Profissional


Registrado: Segunda-Feira, 7 de Novembro de 2011
Mensagens: 712

MensagemEnviada: Qui Mar 08, 2012 9:56 am    Assunto: Responder com Citação

poste o código que faz o desenho, este erro
pode ser porque ele está tentando desenhar antes de criar o form
quando vc roda o executavel também da esse erro?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rzzanatta
Novato
Novato


Registrado: Segunda-Feira, 18 de Setembro de 2006
Mensagens: 63

MensagemEnviada: Qui Mar 08, 2012 10:05 am    Assunto: Responder com Citação

aqui eu monto a Thread em uma Unit:
unit Unit2;

interface

uses Classes,Graphics;

type
TContador = class(TThread)
protected
procedure Execute; override;

end;

implementation

uses Unit1, MsgEspera;

{ TContador }

procedure TContador.Execute;
begin
Priority := tpLower;
//Messagem de espera
MsgEspera.Msg(True,True,'Aguarde, mostrando mensagem de espera...');
end;
end.

aqui eu monto o form da mensagem:
unit MsgEspera;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls, Gauges, JvExComCtrls, JvProgressBar,
JvExControls, JvAnimatedImage, JvGIFCtrl, JvTimer;

Procedure Msg(AtivaMsg:Boolean;Animacao:Boolean;Msg:String='');

type
TTeste = class(TWinControl);
TdlgMsgEspera = class(TForm)
PMsg: TPanel;
lblMsg: TLabel;
Barra: TJvGIFAnimator;
private
{ Private declarations }


public
{ Public declarations }
end;

var
dlgMsgEspera: TdlgMsgEspera;

implementation

{$R *.dfm}

Procedure Msg(AtivaMsg:Boolean;Animacao:Boolean;Msg:String='');
Var Control:TWinControl;
Begin
If AtivaMsg Then begin
dlgMsgEspera := TdlgMsgEspera.Create(Application);

dlgMsgEspera.lblMsg.Caption := Msg;
dlgMsgEspera.Width := dlgMsgEspera.lblMsg.Width + 50;

If Animacao Then begin
dlgMsgEspera.Height := dlgMsgEspera.lblMsg.Height +
dlgMsgEspera.Barra.Height + 20;
End else begin
dlgMsgEspera.Height := dlgMsgEspera.lblMsg.Height + 44;
End;

dlgMsgEspera.Barra.Visible := Animacao;
dlgMsgEspera.Barra.Animate := True;

dlgMsgEspera.Show;
dlgMsgEspera.PMsg.Refresh;
dlgMsgEspera.lblMsg.Refresh;

End else begin
If ( dlgMsgEspera <> Nil ) Then begin

Screen.ActiveControl.SetFocus;
dlgMsgEspera.Close;
dlgMsgEspera.Free;
dlgMsgEspera := Nil;

//Verifica o controle ativo
Control := Screen.ActiveControl;

//Se houver algum controle ativo volta o foco nele
If ( Control <> Nil ) Then begin
Screen.ActiveForm.DefocusControl(Control,False);
If ( Control.Enabled ) Then begin
Control.ControlState := [];
Control.SetFocus;
End;
End;
End;
End;
End;
end.

aí no form que eu faço o processamento eu chamo em um Button, a unit do Thread:
procedure TForm1.Button4Click(Sender: TObject);
var
ThreadContador: TContador;
begin
ThreadContador := TContador.Create( True);;
ThreadContador.FreeOnTerminate:= true;
ThreadContador.Resume;
end;

se alguem puder me ajudar....
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rzzanatta
Novato
Novato


Registrado: Segunda-Feira, 18 de Setembro de 2006
Mensagens: 63

MensagemEnviada: Sex Mar 09, 2012 3:10 pm    Assunto: Responder com Citação

O que e queria realmente era, fazer q meu sistema quando vai atualizar a versao, mostre ao usuario uma tela que contenha um ProgressBar indicando o andamento e nao trave..
tentei usar Thread, mas nao estou entendendo direito seu funcionamento, acho; eu fiz q ele chame o formulario normalmente e nao deu erro, mas quando eu coloco um ProgressBar nesse formulario ele me retorna um erro..
:a component named progressbar1 already exists

como faço pra montar isso? nao consigo ver algo consistente na net q resolva isso pra mim....
alguem aí tem uma soluçao pratica?
obrigado!!!!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcieldeg
Colaborador
Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011
Mensagens: 1054
Localização: Vitória - ES

MensagemEnviada: Sex Mar 09, 2012 4:19 pm    Assunto: Responder com Citação

A tela não pode ser criada pela thread. Deve ser criada pela sua aplicação; a thread deve somente alterar seus valores (sempre com synchronize).

Um exemplo bem simples:

UProgress.pas:
Código:
unit UProgress;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;

type
  TFProgress = class(TForm)
    ProgressBar1: TProgressBar;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FPosition: Integer;
  public
    { Public declarations }
    procedure RefreshForm;
    property Position: Integer read FPosition write FPosition;
  end;

var
  FProgress: TFProgress;

implementation

{$R *.dfm}

uses UThread;

{ TFProgress }

procedure TFProgress.FormCreate(Sender: TObject);
begin
  with TFormThread.Create(Self) do
  begin
    FreeOnTerminate := True;
    Start;
  end;
end;

procedure TFProgress.RefreshForm;
begin
  Self.ProgressBar1.Position := Self.FPosition;
  Application.ProcessMessages;
end;

end.


UThread.pas:
Código:
unit UThread;

interface

uses Forms, Classes, SysUtils, UProgress;

type
  TFormThread = class(TThread)
  private
    FForm: TFProgress;
  public
    constructor Create(AForm: TFProgress); reintroduce;
    procedure Execute; override;
  end;

implementation

{ TFormThread }

constructor TFormThread.Create(AForm: TFProgress);
begin
  inherited Create(True);
  FForm := AForm;
end;

procedure TFormThread.Execute;
var i: Integer;
begin
  // a atividade da thread aqui está representada por um sleep. Troque esse
  // loop pelo seu evento;
  for i := 1 to 100 do
  begin
    Sleep(500);
    FForm.Position := i;
    Synchronize(FForm.RefreshForm);
  end;
end;

end.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
DarkPirate
Novato
Novato


Registrado: Quarta-Feira, 7 de Março de 2012
Mensagens: 18

MensagemEnviada: Sex Mar 09, 2012 5:15 pm    Assunto: Re: mensagem de espera usando Thread. Responder com Citação

rzzanatta escreveu:
Ola galera, estou fazendo uma rotina de pesquisa no banco, e queria colocar uma mensagem de espera(seria outro form com gif animado mostrando 'Aguarde, em processamento'), mas ela trava enquanto nao termina a pesquisa, e estava mexendo com Thread, mas quando chamo a mensagem de espera que é um form com um gif animado, ele me retorna erro...
"Project ProjectTest.exe raised exception class EInvalidOperation with message 'Canvas does not allow drawing'.

o que seria esse erro?
chamar tela executando uma Thread nao da certo?
obrigado..


Cria a Thread, manda Startar;
No metodo Execute(); você coloca um
repeat
application.processmessage;
until terminated;
lembrando que quando você acabar de abrir o DataSet com os dados você deve terminar a thread para sair do loop.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rzzanatta
Novato
Novato


Registrado: Segunda-Feira, 18 de Setembro de 2006
Mensagens: 63

MensagemEnviada: Sex Mar 09, 2012 5:18 pm    Assunto: Responder com Citação

Obrigado marcieldeg, fiz um parecido com o que vc postou aqui e deu tudo certo.....
Valeu................. Laughing
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
anderson_rf
Novato
Novato


Registrado: Sábado, 9 de Junho de 2007
Mensagens: 10

MensagemEnviada: Sex Set 28, 2012 10:15 am    Assunto: Exemplo Responder com Citação

Olá, estou precisando disso tb, teria algum exemplo, pois não entendi muito bem
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB