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

Thread (sec Plz) Ahuahu


Daninho

Pergunta

opa

belezinha

Sec fio, eu vi num tópico q você respondeu ajudando o cara a criar um thread só q infelizmente acho q o tópico tomo delete depois dos problemas q deu no fórum...

assim, você poderia me ensinar o básico pra se criar um thread?

ou alguém que saiba ahahua

seria assim, tipo pra criar um timeout em algo exemplo, executa algo, e se em 15 segundos não terminar o thread finaliza explicando melhor vo postar o codigo

Tem a biblioteca Wininet não é? do IE, tem um esquema q da pra fazer download de arquivos, só q se não conecta, ou net ta lenta ela fica travada e não tem timeout fica travado ate conectar, se não conecta o programa já era só no control alt del auhah

mas isso é um bug q é ate dito pela microsoft, então acho q criando um thread eu conseguiria fazer um timeout

falando a respeito do bug: http://support.microsoft.com/kb/q176420/

função é essa

uses Wininet;

function DownloadURL(aUrl, Dest: String): Boolean;

var

hSession: HINTERNET;

hService: HINTERNET;

lpBuffer: array[0..1024 + 1] of Char;

dwBytesRead: DWORD;

Stream : TMemoryStream;

begin

Result := False;

// hSession := InternetOpen( 'MyApp', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);

hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

try

if Assigned(hSession) then

begin

hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);

if Assigned(hService) then

try

Stream := TMemoryStream.Create;

while True do

begin

dwBytesRead := 1024;

InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);

if dwBytesRead = 0 then break;

lpBuffer[dwBytesRead] := #0;

Stream.Write(lpBuffer, dwBytesRead);

Application.ProcessMessages;

end;

Result := True;

Stream.Position := 0;

Stream.SaveToFile(Dest);

finally

InternetCloseHandle(hService);

Stream.Free;

end;

end;

finally

InternetCloseHandle(hSession);

end;

end;

hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

Até ai tudo bem, o problema ta em

hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);

O programa inteiro fica congelado até que ele consiga abrir o URL

Por thread é possivel fazer um timeout, sendo q eu defino algo como

um timer sei lá q conta até X e se não passo desse InternetOpenURL então eu dou um InternetCloseHandle(hService) ou seja irá finalizar ali

seria algo q em depois desse InternetOpenURL eu coloco vamos supor

var

done: boolean;

....

hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);

if assigned(hservice) then

begin

done := true;

....

e no thread eu faço q se em tanto tempo não tiver done = true então ele da um close no handle do InternetOpenURL

alguém saberia me ajuda?

abraços wink.gif

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

fiz o seguinte, como nem tudo vem de mão beijada ahuahua

criei um thread object usando o menu File > New > Thread Object

criei uma variavel de Timer na Unit do Thread Object

Timeout = class(TThread)

private

{ Private declarations }

timer: ttimer;

procedure TimerOntimer(Sender: TObject);

...

procedure Timeout.TimerOntimer(Sender: TObject);

begin

timer.Enabled := false;

if ( not (assigned(hopenurl))) then InternetCloseHandle(hopenUrl);

end;

procedure Timeout.Execute;

begin

{ Place thread code here }

timer := TTimer.Create(nil);

timer.Enabled := false;

timer.Interval := 15000;

timer.OnTimer := TimerOntimer;

timer.Enabled := true;

end;

ta certo? ou não pode por ai, ou timers não são recomendáveis por em uma thread ou esse execute ta sendo executado varias vezes e vai dar um estouro de memória?

auhahua

procedure Timeout.TimerOntimer(Sender: TObject);

begin

timer.Enabled := false;

if ( not (assigned(hopenurl))) then InternetCloseHandle(hopenUrl);

end;

no OnTimer do Timer que ta dentro da Thread eu fiz q se hopenurl não for maior do que nil ou seja nada, então ele fecha o Handle assim para o processo...

e na Unit q ta a funcao eu fiz assim, variavel global

var

_timeout: Timeout;

...

hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

try

if Assigned(hSession) then

begin

_timeout := Timeout.Create(false);

hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);

if Assigned(hService) then

begin

_timeout.Terminate;

...

Ta errado, ta certo?

auhaau abraços ai wink.gif

Link para o comentário
Compartilhar em outros sites

  • 0

cara totalmente errado ...

type
TThr = Class(TThread)
public
  Url: String;
protected
  procedure Execute; override;
end;

...

var
  thr: TThr;

Procedure TForm1.GetDownload;
begin
  thr := TThr.create(true);
  thr.url := '....';
  thr.resume;
  timer1.enabled := true;
  // o timer vai verificar dps de 15 sec se a thr.Suspended = True, se sim termino o download 
end;

procedure TThr.Execute;
begin
  ... Código de download, não xame o Form1 de nenhum jeito
  Suspend;
end;

end;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

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