Ir para conteúdo
Fórum Script Brasil
  • 0

Class Tthread


kleberns

Pergunta

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

  • 0

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

  • 0

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

  • 0
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

  • 0

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

  • 0

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

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...