Fórum Thread para execução..Pq ? #289967
29/07/2005
0
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
Curtir tópico
+ 0Posts
29/07/2005
Massuda
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
29/07/2005
Alexandre_sbo
{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
31/07/2005
Dopi
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
01/08/2005
Massuda
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
01/08/2005
Ivanh
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
17/09/2009
Fausto.malheiros
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)