Oi Sérgio,,

   Eu tinha colocado o waitfor apenas para teste mas deixei ele
comentado. Quando executo o waitfor o sistema espera terminar a thread
e assim passa pelo syncronize e onterminate (que eu defini. pelo menos
foi isso que notei nos meus testes). O fied da prioridade eu também
usei, mas não estou usando mais e esqueci de apagar. Pra carregar os
dados eu apenas liguei um DBGrid ao datasource ligado ao dataset que
está sendo aberto na thread. 
   Fiz outros testes sem acesso a dados, como um laço por exemplo na
thread, apenas para testar a funcionalidade, e não funciona de jeito
nenhum. Será que preciso definir algo na DLL?

   Obrigado

Ricardo

--- Em delphi-br@yahoogrupos.com.br, Sérgio T. Uetanabaro <[EMAIL PROTECTED]>
escreveu
>
> Ola Ricardo!
>  
>     Revendo seu código acredito que vc esteja em um deadlock. Vc chama a
> thread e depois entra num waitfor. Depois na thread vc tentar dar um
sync
> com a maisthread que está travada esperando a sua thread terminar.
Acredito
> que ai esteja seu problema. Outra coisa, vc definiu um field public
Priority
> mas a thread ja tem uma propriedade pra definir isso. Só uma
pergunta: Como
> vc pretende fazer a carga das informações dos datasets da thread para os
> datasets do formulário?
>     
>  
>  
> []´s
>  
>  
> Sérgio T. Uetanabaro
> 
>  
> 
>    _____  
> 
> De: delphi-br@yahoogrupos.com.br
[mailto:[EMAIL PROTECTED] Em
> nome de malikoski
> Enviada em: terça-feira, 18 de dezembro de 2007 16:33
> Para: delphi-br@yahoogrupos.com.br
> Assunto: [delphi-br] Thread - Problemas!
> 
> 
> 
> Pessoal, estou desenvolvendo um sistema que possui a seguinte situação:
> 
> Opções do menu carregam uma DLL que se encarrega de criar um
> formulário dinâmicamente. Logo após tenho um objeto em uma outra unit
> que possui funções para gerar os objetos visuais nesse
> formulário.(tudo dinâmicamente)
> Nesse formulário é criado um dbgrid onde é aberto uma tabela(de acordo
> com a opção do menu principal) onde assim os dados são exibidos.
> Algumas telas ficam lentas até carregar todos os dados da tabela, pois
> algumas possuem milhares de registros, assim achamos melhor usar uma
> thread para carregar essa tabela, assim o usuário abrir outro processo
> no programa. 
> Eu estou conseguindo abrir certinho na thread, mas não estou
> conseguindo atulizar alguns dados da tela como componentes que
> mostram que os dados estão carrengando, e também não consigo verificar
> quando a thread termina, pois quando ela passa la no evento
> Syncronize(minhafun-caoexemplo) ele simplesmente para de executar a
> thread e não passa pelo método (onTerminate)-. Exemplo abaixo:
> 
> função na DLL:
> 
> procedure ShowForm(NewApplica-tion, NewScreen : Pointer; FormName :
> String; Params : TStringList)-;
> 
> ...
> 
> oForm := TForm.Create(-Application.-MainForm)-;
> oForm.Name := FormName;
> 
> oMontaTela := Tmontar_tela.-Create(oForm)-;
> oMontaTela._-Montar_GRID(-oDM.oSQLConnecti-on,
> Params.ValueFromInd-ex[viIdxCodTab]-,
> Params.ValueFromInd-ex[viIdxMat]-,oForm);
> 
> ...
> end;
> 
> na unit que existe a classe Tmontar_tela
> 
> TConsultaThread = class(TThread)
> private
> SessaoCritica: TCriticalSection;
> 
> protected
> procedure Execute; override;
> procedure Atualiza;
> public
> oDataSource : TDataSource;
> Priority : TThreadPriority;
> oQuery : TSQLQuery;
> oCDS : TClientDataSet;
> oMontatela : Tmontar_tela;
> I : integer;
> end;
> 
> ...
> ...
> ...
> 
> Tmontar_tela = class(TObject)
> private
> oThread : TConsultaThread;
> ...
> public
> function RunThread(Query : TSQLQuery; CDS : TClientDataSet; DS
> : TDataSource; MontaTela : Tmontar_Tela) : TConsultaThread;
> procedure ThreadTerminate(-Sender: TObject);
> 
> procedure Tmontar_tela.-_ShowForm(-Sender: TObject); //procedure
> atribuída manualmente (onShow)
> begin
> oThread := RunThread(SQLQ_-DB2, CDS_DB2, DS_DB2, Self);
> 
> // if not oThread.Terminated then begin
> // oThread.WaitFor;
> // end;
> 
> end;
> 
> ...
> 
> function Tmontar_tela.-RunThread(-Query : TSQLQuery; CDS :
> TClientDataSet; DS : TDataSource; 
> MontaTela : Tmontar_Tela) : TConsultaThread;
> var
> oConsThread : TConsultaThread;
> begin
> oConsThread := TConsultaThread.-Create(True)-;
> oConsThread.-FreeOnTerminate := True;
> oConsThread.-Priority := tpHigher;
> oConsThread.-OnTerminate := ThreadTerminate;
> oConsThread.-oQuery := Query;
> oConsThread.-oCDS := CDS;
> oConsThread.-oDataSource := DS;
> oConsThread.-oMontatela := MontaTela;
> oConsThread.-Resume;
> 
> Result := oConsThread;
> end;
> 
> procedure TConsultaThread.-Execute;
> var
> oConn : TSQLConnection;
> begin
> oConn := nil;
> oConn := TSQLConnection.-Create(nil)-;
> 
> with oConn do begin
> ... parâmetros de conexão
> end;
> 
> oConn.Connected := True;
> oQuery.SQLConnectio-n := oConn;
> 
> Synchronize(-Atualiza)-;
> oCDS.Close;
> oCDS.Open;
> Sleep(20);
> 
> end;
> 
> procedure TConsultaThread.-Atualiza;
> begin
> oMontatela._-PainelStatus.-Caption := 'carregando.-..';
> end;
> 
> procedure Tmontar_tela.-ThreadTerminate(-Sender: TObject);
> begin
> _PainelStatus.-Caption := 'Pronto!...'-;
> Sleep(20);
> _PainelStatus.-Visible := False;
> Application.-ProcessMessages;
> Sender := nil;
> end;
> 
> Desculpem a quantidade código...
> 
> obrigado
> 
> Ricardo
> 
> 
> 
>  
> 
> 
> No virus found in this incoming message.
> Checked by AVG Free Edition.
> Version: 7.5.503 / Virus Database: 269.17.4/1188 - Release Date:
17/12/2007
> 14:13
> 
> 
> 
> No virus found in this outgoing message.
> Checked by AVG Free Edition. 
> Version: 7.5.503 / Virus Database: 269.17.4/1188 - Release Date:
17/12/2007
> 14:13
>  
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a