Thread para execução..Pq ?

Delphi

29/07/2005

Galerinha meu problema de ontem acertei...
Agora to com outro, minha thread começa a ser executada...
no execute, chamo um metodo importar, onde ele le um arquivo texto
e adiciona em um clientdataset, bom o aplicativo começa a rodar legal,
a thread funciona , e ela vai gravando em um outro arquivo o que já foi importado,mas de uma hora para outra ele para de ler e grava no outro arquivo e naum faz mais nada, é como se a thread parasse... alguém tem uma ideia do que possa ser ?

constructor Timporta.Create;
begin
  inherited Create(True);
  Priority := tpNormal;
  FreeOnTerminate := True;
  Resume;
end;

procedure Timporta.Execute;
begin
  inherited;
  DmImportacao.Importar;
end;


como vcs podem ver o codigo da thread é simples e o metodo importar
lê um arquivo e joga pro client e grava outro arquivo do que foi importado até o momento...


Alexandre_sbo

Alexandre_sbo

Curtidas 0

Respostas

Massuda

Massuda

29/07/2005

O método DmImportacao.Importar funciona sem parar ou tem alguma condição de fim sob seu controle?

Como a thread é criada com FreeOnTerminate = True e o método Timporta.Execute não é um loop (ou coisa parecida), quando DmImportacao.Importar termina a thread é automaticamente destruída.


GOSTEI 0
Alexandre_sbo

Alexandre_sbo

29/07/2005

ele funciona sem parar ....

  {ve se tem informações pra carregar na stringlist}
  CarregaStringList;
  {le todos a valores de todos os campos}
  while not (eof) do
    begin
      if bimpArq then
        begin
          {verifica se a informação já existe}
          with cds do
            begin
              cds.Close;
              with Params do
                begin
                  {passa os parametros--> geralmentE os campos chave}
                  for i := low(Parametros) to high(Parametros) do
                    ParamByName(Parametros[i]).Value := FieldValue(Parametros[i]);
                end; { <- with }
              Open;
              if RecordCount = 0 then
                Append
              else
                Edit;
              {Passa valor para os campos}
              try
                for i := 0 to FCountCampo do
                  if not (FindField(campos[i].Campo) = nil) then
                    FieldByName(campos[i].Campo).AsVariant := FieldValue(i);
                Post;
                if ApplyUpdates(0) > 0 then
                  raise Exception.Create(´Erro ao gravar registro!´);

                {passa informações importadas}
                FsqlArqImport.Add(Flinhas);
              except
                on e: Exception do
                  begin
                    FsqlArqErro.Add(Flinhas);
                    FsqlArqErro.Text := FsqlArqErro.Text + e.Message;
                    FsqlArqErro.Add(´-----------------------------------------------------------------------------------´);
                    Cancel;
                  end;
              end;
              SaveLog;
            end; { <-- with }
        end;
      Self.ReadLine;
    end; { <-- While}
  self.Close;



o codigo de importação é +- isso, essa é parte de importação propriamente dita, fora isso só tem a parte de configuração....
esse codigo é uma classe de importação que fiz, esse código é a parte de
atualização...


GOSTEI 0
Dopi

Dopi

29/07/2005

O metodo DmImportacao.Importar; não deveria ser chamado dentro de um Syncronize() ?

Sei que para pintar canvas e componentes visuais isso é necessário... Não tenho certeza que isso seja necessário para acesso a arquivos...

Mas acredito que sim, pois como o Delphi agiria quando 2 Threads distintas (a sua Thread e o Application) tentassem acessar o mesmo DataSet ?


GOSTEI 0
Massuda

Massuda

29/07/2005

O metodo DmImportacao.Importar; não deveria ser chamado dentro de um Syncronize() ?
Provavelmente você razão... eu tento minimizar (até evito usar) acesso a banco de dados dentro de threads porque na maioria dos casos as bibliotecas de acesso ao BD não suportam multithread (por exemplo, dbExpress).

Talvez usar Synchronize resolva, mas não dá para afirmar isso porque parece ter outras iterações no código que não estão visíveis.

Por exemplo, parece que tem um (ou mais) StringList compartilhado entre threads diferentes... isso significa que teria que ter um mecanismo para serializar o acesso ao StringList (um critical section?).


GOSTEI 0
Ivanh

Ivanh

29/07/2005

Eu tive sucesso com threads e dbExpress :!:
Mas tem um detalhe importante :!:
Na query usada dentro da thread, eu seto o SQLConnection da seguinte forma:

  FSQLQry.SQLConnection := SEUSQLConnection.CloneConnection;


Eu não gosto de usar ClientDataSet nas threads, sempre tive problemas absurdos.


GOSTEI 0
Fausto.malheiros

Fausto.malheiros

29/07/2005

qual a função do CloneConnection?


GOSTEI 0
POSTAR