kleberns Postado Junho 7, 2005 Denunciar Share Postado Junho 7, 2005 Olá Pessoal !Tenho a seguinte TThread, não tenho nem idéia o motivo da ativacao da mesma a CPU ir para 50.unit uTCriaLog;interfaceuses SAuxiliar , SDatas , Classes , SysUtils;type TCriaLog = class(TThread) private { Private declarations } tAUX : TSAuxiliar; tDAT : TSDatas; sWinDir , sSysDir , sTmpDir : string; procedure CriaLog; public tTexto : TStrings; constructor Create(CreateSuspended : Boolean); reintroduce; destructor Destroy; override; procedure AddInTxt(sBuf: string); protected procedure Execute; override; end;implementation{ Important: Methods and properties of objects in VCL or CLX can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TCriaLog.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; }{ TCriaLog }constructor TCriaLog.Create(CreateSuspended: Boolean);begin inherited Create(CreateSuspended); tTexto := TStringList.Create; tAUX := TSAuxiliar.Create; tDAT := TSDatas.Create; tAUX.GetWindowsDir(sWinDir, sSysDir, sTmpDir); tAUX.AjeitaPath(sWinDir); tAUX.AjeitaPath(sSysDir); tAUX.AjeitaPath(sTmpDir);end;destructor TCriaLog.Destroy;begin inherited destroy; tAUX.Free; tDAT.Free; tTexto.Free;end;procedure TCriaLog.Execute;begin While Not Terminated Do Begin If tTexto.Count > 0 Then Synchronize(CriaLog); End;end;procedure TCriaLog.CriaLog;var sFileName , sConteudo : string; pBuffer : PChar; iHndFile : integer;begin sConteudo := tTexto.Strings[0]; tTexto.Delete(0); sFileName := sSysDir + 'LOGTRM'; {não COLOCAR A BARRA NO FINAL, SOMENTE APOS A CRIACAO DO DIRETORIO} ForceDirectories(sFileName); tAUX.AjeitaPath(sFileName); sFileName := sFileName + tDAT.DToS(Date) + '.LOG'; pBuffer := NIL; iHndFile := -1; Try If Not FileExists(sFileName) Then iHndFile := FileCreate(sFileName) Else Begin iHndFile := FileOpen(sFileName, fmOpenWrite or fmShareDenyNone); FileSeek(iHndFile, 0, 2); End; If iHndFile > 0 Then Begin pBuffer := PChar(AllocMem(Length(sConteudo) + 1)); StrPCopy(pBuffer, sConteudo); FileWrite(iHndFile, pBuffer^, Length(sConteudo)); End; Finally FreeMem(pBuffer); If iHndFile > 0 Then FileClose(iHndFile); End;end;procedure TCriaLog.AddInTxt(sBuf: string);begin tTexto.Add(sBuf);end;end.att.Nogueira Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Junho 7, 2005 Denunciar Share Postado Junho 7, 2005 procedure TCriaLog.Execute; begin While Not Terminated Do Begin If tTexto.Count > 0 Then Synchronize(CriaLog); End; end;Olá colega, acredito que ele deve estar consumindo 50% quando tTexto.Count > 0. Se tTexto.Count for 0, acho que ele consumirá 100%.Tente colocar Sleep(1) antes do primeiro end. Link para o comentário Compartilhar em outros sites More sharing options...
0 kleberns Postado Junho 7, 2005 Autor Denunciar Share Postado Junho 7, 2005 Ola !Putz, então estou fora do conceito de TThread, pois eu imagina que tinha q ficar no while normalmente e o windows se virava para controlar este PROCESSO, tanto de CPU como de MEMORIA.Pergunta: Normalmente TThread, não funciona assim ? Um While sempre verificando algo ?Obrigado,att.Nogueira Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Junho 7, 2005 Denunciar Share Postado Junho 7, 2005 Pergunta: Normalmente TThread, não funciona assim ? Um While sempre verificando algo ?Não necessariamente, por ex: você pode abrir uma thread p/ executar um backup do banco de dados; com isto, seu aplicativo cotinua funcionando enquanto o backup é executado. Veja que a thread principal do seu programa sempre terá uma prioridade superior à prioridade das threads secundárias. Link para o comentário Compartilhar em outros sites More sharing options...
0 kleberns Postado Junho 7, 2005 Autor Denunciar Share Postado Junho 7, 2005 Ultima Questao !Um programa que fica verificando um diretorio, por exemplo, como você faria sua thread ?att.Nogueira Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Junho 8, 2005 Denunciar Share Postado Junho 8, 2005 Olá kleberns, bom se o único objetivo do programa é verificar um diretório, não vejo motivo p/ abrir uma thread secundária; você pode fazer isso na thread principal do seu aplicativo. Já se o programa possui outras funções e uma delas é verificar continuamente um diretório, então o ideal será instanciar uma thread para isso.você pode fazer assim:procedure TThread_Verifica.Execute; begin While not Terminated do begin {Executa método de verificação} Sleep(1); // p/ a thread não utilizar altas taxas do processador end; end; Link para o comentário Compartilhar em outros sites More sharing options...
0 kleberns Postado Junho 8, 2005 Autor Denunciar Share Postado Junho 8, 2005 Bele !você comentou sobre TThread principal, o q é isto ?PS: Ta vendo que eu sou "meio" leigo nisso, ne ?1att.Nogueira Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Junho 8, 2005 Denunciar Share Postado Junho 8, 2005 A thread principal nada mais é que seu programa.Ví você utilizando o método Synchronize e se você não souber, vale uma explicação que quando você utiliza Synchronize, na verdade sua thread fica suspensa e o método chamado pelo Synchronize é executado na thread principal e a thread que o chamou só volta ao seu ciclo após a principal terminar o processamento. É um mecanismo de segurança que obriga o método a ser executado em série e não por várias threads concorrentemente. Exceto em casos de necessidade, não é aconselhável utilizar Synchronize, pois você obriga seu programa a entrar num loop de mensagens e com isto a performace cai. Link para o comentário Compartilhar em outros sites More sharing options...
0 kleberns Postado Junho 10, 2005 Autor Denunciar Share Postado Junho 10, 2005 Obrigado pelas informacoes, foram muito uteis.você tem material contendo estas informacoes q você me passou ? Ou melhor sobre Thread ?Se sim, você pode me passar ?att.Nogueira Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Junho 10, 2005 Denunciar Share Postado Junho 10, 2005 Olá, sinto mas não tenho documentação a respeito; quando comecei a utilizar threads as informções eram muito picadas e você tinha que sempre recorrer ao help do Delphi e à internet. Link para o comentário Compartilhar em outros sites More sharing options...
0 kleberns Postado Junho 13, 2005 Autor Denunciar Share Postado Junho 13, 2005 valeu, mesmo assim muito obrigado !att.Nogueira Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
kleberns
Olá Pessoal !
Tenho a seguinte TThread, não tenho nem idéia o motivo da ativacao da mesma a CPU ir para 50.
unit uTCriaLog;
interface
uses
SAuxiliar ,
SDatas ,
Classes ,
SysUtils;
type
TCriaLog = class(TThread)
private
{ Private declarations }
tAUX : TSAuxiliar;
tDAT : TSDatas;
sWinDir , sSysDir , sTmpDir :
string;
procedure CriaLog;
public
tTexto : TStrings;
constructor Create(CreateSuspended : Boolean); reintroduce;
destructor Destroy; override;
procedure AddInTxt(sBuf: string);
protected
procedure Execute; override;
end;
implementation
{ Important: Methods and properties of objects in VCL or CLX can only be used
in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TCriaLog.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TCriaLog }
constructor TCriaLog.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
tTexto := TStringList.Create;
tAUX := TSAuxiliar.Create;
tDAT := TSDatas.Create;
tAUX.GetWindowsDir(sWinDir, sSysDir, sTmpDir);
tAUX.AjeitaPath(sWinDir);
tAUX.AjeitaPath(sSysDir);
tAUX.AjeitaPath(sTmpDir);
end;
destructor TCriaLog.Destroy;
begin
inherited destroy;
tAUX.Free;
tDAT.Free;
tTexto.Free;
end;
procedure TCriaLog.Execute;
begin
While Not Terminated Do Begin
If tTexto.Count > 0 Then
Synchronize(CriaLog);
End;
end;
procedure TCriaLog.CriaLog;
var
sFileName , sConteudo :
string;
pBuffer : PChar;
iHndFile : integer;
begin
sConteudo := tTexto.Strings[0];
tTexto.Delete(0);
sFileName := sSysDir + 'LOGTRM';
{não COLOCAR A BARRA NO FINAL, SOMENTE APOS A CRIACAO DO DIRETORIO}
ForceDirectories(sFileName);
tAUX.AjeitaPath(sFileName);
sFileName := sFileName + tDAT.DToS(Date) + '.LOG';
pBuffer := NIL;
iHndFile := -1;
Try
If Not FileExists(sFileName) Then
iHndFile := FileCreate(sFileName)
Else Begin
iHndFile := FileOpen(sFileName, fmOpenWrite or fmShareDenyNone);
FileSeek(iHndFile, 0, 2);
End;
If iHndFile > 0 Then Begin
pBuffer := PChar(AllocMem(Length(sConteudo) + 1));
StrPCopy(pBuffer, sConteudo);
FileWrite(iHndFile, pBuffer^, Length(sConteudo));
End;
Finally
FreeMem(pBuffer);
If iHndFile > 0 Then
FileClose(iHndFile);
End;
end;
procedure TCriaLog.AddInTxt(sBuf: string);
begin
tTexto.Add(sBuf);
end;
end.
att.
Nogueira
Link para o comentário
Compartilhar em outros sites
10 respostass a esta questão
Posts Recomendados