Threads x Funções recursivas
Pessoal, estou tendo o seguinte problema:
Fiz um programa que utiliza alguns processos demorados, então criei uma thread para ele, dentro da minha thread eu chamo uma função, nesta função existem alguns códigos e chamadas p/outras funções, uma destas funções é recursiva. Em uma simulação que eu fiz rodando a função principal fora da thread, o programa levou em torno de 10 segundos p/me apresentar o resultado, com a thread ele parece ter se perdido lá dentro. Detalhe, se eu chamo funções normais funciona legal, apenas a thread com função recursiva está dando problema, alguém sabe o que pode estar acontecendo e tem uma solução ou dica para este problema?
Att,
PhenomenoM
Fiz um programa que utiliza alguns processos demorados, então criei uma thread para ele, dentro da minha thread eu chamo uma função, nesta função existem alguns códigos e chamadas p/outras funções, uma destas funções é recursiva. Em uma simulação que eu fiz rodando a função principal fora da thread, o programa levou em torno de 10 segundos p/me apresentar o resultado, com a thread ele parece ter se perdido lá dentro. Detalhe, se eu chamo funções normais funciona legal, apenas a thread com função recursiva está dando problema, alguém sabe o que pode estar acontecendo e tem uma solução ou dica para este problema?
Att,
PhenomenoM
Phenomenom
Curtidas 0
Respostas
Vanius
11/11/2003
Como utilizo threads?
Vc pode me enviar um exemplo?
grato,
Vanius Girodo
vaniusg@terra.com.br
Vc pode me enviar um exemplo?
grato,
Vanius Girodo
vaniusg@terra.com.br
GOSTEI 0
Aroldo Zanela
11/11/2003
Colega,
Coloca um fragmento do código pra gente avaliar melhor.
Coloca um fragmento do código pra gente avaliar melhor.
GOSTEI 0
Phenomenom
11/11/2003
Eu criei uma thread com o nome ´suiteThread´ em uma unit para threads à parte.
No evento onclick do meu programa eu coloquei o seguinte código:
begin
suiteThread.FreeOnTerminate:= true;
suiteThread.Resume;
end;
Dentro da unit de threads no ´execute´ coloquei o código para roda uma função:
var
quantidadesuite:integer;
begin
QuantidadeSuite:=ExportacaoForm.fnExportarSuite;
end;
Se a função executasse apenas o código normal como as outras threads que criei, funcionaria normal, mas dentro desta função é chamada outra função, ou melhor, uma procedure e esta é recursiva, o código da procedure é este:
procedure GetAllFiles(mask: string);
var
search: TSearchRec;
directory: string;
begin
directory := ExtractFilePath(mask);
if FindFirst(mask, $23, search) = 0 then
begin
repeat
Form1.ListBox1.Items.Add(directory + search.Name);
Inc(Count);
until FindNext(search) <> 0;
end;
if FindFirst(directory + ´*.*´, faDirectory, search) = 0 then
begin
repeat
if ((search.Attr and faDirectory) = faDirectory) and (search.Name[1] <> ´.´) then
GetAllFiles(directory + search.Name + ´\´ + ExtractFileName(mask));
until FindNext(search) <> 0;
FindClose(search);
end;
end;
Eu notei que se comentar a chamada da procedure dentro dela mesma, o programa chega no final.
No evento onclick do meu programa eu coloquei o seguinte código:
begin
suiteThread.FreeOnTerminate:= true;
suiteThread.Resume;
end;
Dentro da unit de threads no ´execute´ coloquei o código para roda uma função:
var
quantidadesuite:integer;
begin
QuantidadeSuite:=ExportacaoForm.fnExportarSuite;
end;
Se a função executasse apenas o código normal como as outras threads que criei, funcionaria normal, mas dentro desta função é chamada outra função, ou melhor, uma procedure e esta é recursiva, o código da procedure é este:
procedure GetAllFiles(mask: string);
var
search: TSearchRec;
directory: string;
begin
directory := ExtractFilePath(mask);
if FindFirst(mask, $23, search) = 0 then
begin
repeat
Form1.ListBox1.Items.Add(directory + search.Name);
Inc(Count);
until FindNext(search) <> 0;
end;
if FindFirst(directory + ´*.*´, faDirectory, search) = 0 then
begin
repeat
if ((search.Attr and faDirectory) = faDirectory) and (search.Name[1] <> ´.´) then
GetAllFiles(directory + search.Name + ´\´ + ExtractFileName(mask));
until FindNext(search) <> 0;
FindClose(search);
end;
end;
Eu notei que se comentar a chamada da procedure dentro dela mesma, o programa chega no final.
GOSTEI 0