GARANTIR DESCONTO

Fórum Problemas com Threads #347981

26/10/2007

0

Pessoal.

Não to entendendo o que tá acontecendo.

Uso Delphi 2007 com todas as atualizações.

procedure Thread_Restore.Criar_Ponto;
begin
frm_CreateRestore.lbl.Caption := ´Teste..´;
end;

procedure Thread_Restore.Execute;
begin
Synchronize(Criar_Ponto);
end;

procedure Tfrm_CreateRestore.FormShow(Sender: TObject);
var
ThrRestore: Thread_Restore;
begin
ThrRestore := Thread_Restore.Create(False)
end;


Ele cria a thread mas na hora de mudar o texto do caption, a Thread fecha.

O que pode ser?


Bernardop

Bernardop

Responder

Posts

26/10/2007

Massuda

Pelo código que você postou, é isso mesmo que deve ocorrer. O .Execute da thread apenas atualiza o label e depois, como não há mais nada a ser feito, a thread pára.


Responder

Gostei + 0

26/10/2007

Bernardop

O problema é que o LABEL não está atualizando.


Responder

Gostei + 0

26/10/2007

Massuda

O problema é que o LABEL não está atualizando.
Você não disse isso antes.

frm_CreateRestore tem um valor válido? Ou seja, esse form é criado automaticamente pelo Delphi ou quando você cria manualmente o form usa essa variável para receber o form?


Responder

Gostei + 0

26/10/2007

Bernardop

Todos são criado com o procedimento Create_Form(Tfrm_CreateRestore, frm_CreateRestore);


Responder

Gostei + 0

26/10/2007

Bernardop

Qual seria o problema de usar threads - método syncronize com form´s criados dinamicamente?


Responder

Gostei + 0

26/10/2007

Massuda

Nenhum, desde que a variável frm_CreateRestore corresponda ao form criado dinamicamente.


Responder

Gostei + 0

26/10/2007

Bernardop

Corresponde.

procedure Create_Form(Tfrm:TFormClass; frm:TForm);
begin
frm := Tfrm.Create(Application);
try
frm.Position := poScreenCenter;
frm.BorderStyle := bsNone;
frm.ShowModal;
finally
FreeAndNil(frm);
end;
end;

Muito estranho não estar sincronizando. O código do form é exatamente o que postei anteriormente.

Alguma sugestão?


Responder

Gostei + 0

26/10/2007

Massuda

Na verdade não. Nesse seu código, o frm é tratado como uma variável local, de modo que mudanças feitas em frm não são refletidas na variável que foi passada.

Experimente por um breakpoint depois do .Create e veja qual o valor de frm_CreateRestore; provavelmente será nil. Sem entrar no mérito do código em si, faltou por um [b:96ccf1c26e]var[/b:96ccf1c26e]...
procedure Create_Form(Tfrm:TFormClass; var frm:TForm);
...para esse seu código funcionar. Por causa disso, quando a thread é executada, deve estar dando um access violation (valor nil) o que encerra a thread.


Responder

Gostei + 0

26/10/2007

Bernardop

Mas colocando esse var na frente,

como vou chamar o procedimento?

Já que chamar dessa maneira

Create_Form(Tfrm_CreateRestore, frm_CreateRestore);

não funcionaria mais.


Responder

Gostei + 0

26/10/2007

Massuda

...como vou chamar o procedimento?
Da mesma maneira que faz agora.

...não funcionaria mais.
Funciona.


Responder

Gostei + 0

26/10/2007

Bernardop

O Delphi 2007 me retorna:

[DCC Error] E2033 Types of actual and formal var parameters must be identical


Responder

Gostei + 0

26/10/2007

Massuda

E2033 Types of actual and formal var parameters must be identical
Tinha esquecido que isso poderia ocorrer... Isso pode ser resolvido mudando um pouco sua Create_Form...
procedure Create_Form(Tfrm:TFormClass; var frm); 
var
  F: TForm;
begin 
  F := Tfrm.Create(Application); 
  Tfrm(frm) := F;
  try 
    F.Position := poScreenCenter; 
    F.BorderStyle := bsNone; 
    F.ShowModal; 
  finally 
    FreeAndNil(F); 
    Tfrm(frm) := nil;
  end; 
end;



Responder

Gostei + 0

26/10/2007

Bernardop

Tanto a linha Tfrm(frm) := F; e a Tfrm(frm) := nil;

Ambos derão
[DCC Error] E2066 Missing operator or semicolon


Responder

Gostei + 0

26/10/2007

Massuda

Desculpe... nessas linhas, onde é Tfrm, devia ser TForm. então fica assim
procedure Create_Form(Tfrm:TFormClass; var frm); 
var 
  F: TForm; 
begin 
  F := Tfrm.Create(Application); 
  TForm(frm) := F; 
  try 
    F.Position := poScreenCenter; 
    F.BorderStyle := bsNone; 
    F.ShowModal; 
  finally 
    FreeAndNil(F); 
    TForm(frm) := nil; 
  end; 
end;



Responder

Gostei + 0

26/10/2007

Bernardop

Era exatamente este o problema.

Muito obrigado!

Abração!

Bernardo.


Responder

Gostei + 0

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

Aceitar