Thread para execução..Pq ?
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 ?
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...
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
Curtidas 0
Respostas
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.
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
29/07/2005
ele funciona sem parar ....
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...
{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
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 ?
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
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
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:
Eu não gosto de usar ClientDataSet nas threads, sempre tive problemas absurdos.
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
29/07/2005
qual a função do CloneConnection?
GOSTEI 0