Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как забить THread? [D7, XP]


SamProf ©   (2005-10-26 14:45:00) 

У меня в проге есть создание потока:
hand:=BeginThread(nil,0,go,nil,0,hid);
Иногда он может подвиснуть(он качает файл из инета) и мне нужно его забить!
CloseHandle(hand); - вроде срабатывает, но через какоето время, т.е. выполнются уже следующие команды, а поток ещё работает.....
procedure EndThread(ExitCode: Integer); - как я понял нужно вызывать в самом потоке, а мне нужно из своей проги его забить или как-то дождаться, поеп он точно забьётся!
Спасибо!


Leonid Troyanovsky   (2005-10-26 15:59:00) [1]


> SamProf ©   (26.10.05 15:21) [5]

> > А если есть нужда, его можно прибить хоть TerminateProcess.

> Вроде помогло! Спасибо!


Надеюсь, что реализовано именно так, а не через TerminateThread.

--
Regards, LVT.


SamProf   (2005-10-26 15:21:00) [2]


> А если есть нужда, его можно прибить хоть TerminateProcess.

Вроде помогло! Спасибо!


SamProf   (2005-10-26 15:03:00) [3]

Вот такой вот код:
Сделано ужасно, не судите строго!

unit SamInternetU;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DB, DBTables, ExtCtrls, Grids, DBGrids, StdCtrls, Gauges,wininet;
const
 go_BUFFERSIZE = 4096;

var
  go_url,go_file:string;
  go_res,go_tall:boolean;

 function LoadFile(AUrl, Targetfile: string): Boolean;
implementation

uses MainU;

function go(p:Pointer):integer;
var
 F: file;
 hSession: HINTERNET;
 hService: HINTERNET;
 lpBuffer: array[0..go_BufferSize + 1] of Byte;
 BufferLength: DWORD;
 dwSizeOfRq, Reserved, dwByteToRead: DWORD;
 TargetFileName: string;
 fsize: DWORD;
 bact:Boolean;

begin

 go_tall:=false;
 boolstop:=false;
//  bact:=mainf.DB.Connected;
//  mainf.setDB(False);
 mainf.edit1.Text:=go_Url;
 go_Res := False;
 hSession := InternetOpen('MyApp', // Agent
   INTERNET_OPEN_TYPE_PRECONFIG, // dwAccessType
   nil, // lpszProxyName (optional)
   nil, // lpszProxyBypass (optional)
   0); // dwFlags
 mainf.memo1.lines.add('InternetOpen');
 if hSession = nil then
 begin
   mainf.memo1.lines.add('Internet session initialization failed!');
   Exit;
 end;
 hService := InternetOpenUrl(hSession,
   PChar(go_Url),
   nil,
   0,
   INTERNET_FLAG_DONT_CACHE or
   INTERNET_FLAG_PRAGMA_NOCACHE or
   INTERNET_FLAG_RELOAD,
   0);
 mainf.memo1.lines.add('InternetOpenUrl');
 if hSession = nil then
 begin
   mainf.memo1.lines.add('Internet session initialization failed!');
   InternetCloseHandle(hService);
   Exit;
 end;
 HttpQueryInfo(hService, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER,
   @dwByteToRead,
   dwSizeOfRq, Reserved);
 mainf.memo1.lines.add('HttpQueryInfo HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER');
 TargetFileName :=   go_file;
 AssignFile(F, TargetFileName);
 Rewrite(F, 1);
 if IOResult <> 0 then
 begin
   mainf.memo1.lines.add('Cannot create local file');
   InternetCloseHandle(hService);
   Exit;
 end;
 BufferLength := go_BUFFERSIZE;
 dwByteToRead := 0;
 dwSizeOfRq := 4; // BufferLength
 Reserved := 0;
 if not HttpQueryInfo(hService,
   HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER,
   @dwByteToRead,
   dwSizeOfRq,
   Reserved) then dwByteToRead := 0;

 FSize := 0;
 BufferLength := go_BUFFERSIZE;
 while (BufferLength > 0)and not (boolstop) do
 begin
   application.ProcessMessages;
   if not InternetReadFile(hService, @lpBuffer, go_BUFFERSIZE, BufferLength)
     then Break;
   if (BufferLength > 0) and (BufferLength <= go_BUFFERSIZE) then
     BlockWrite(F, lpBuffer, BufferLength);
   application.ProcessMessages;
   fsize := fsize + BufferLength;
   mainf.memo1.lines.add(inttostr(fsize) + ' / ' + inttostr(dwByteToRead) + ' bytes complete..');
   mainf.gauge1.MinValue:=0;
   mainf.gauge1.MaxValue:=dwByteToRead;
   mainf.gauge1.Progress:=fsize;
   mainf.edit2.Text:=inttostr(fsize) + ' / ' + inttostr(dwByteToRead);
   application.ProcessMessages;
   if BufferLength > 0 then go_Res := True;
 end;
 CloseFile(F);
 go_Res := True;
 mainf.memo1.lines.add('Done..');
 InternetCloseHandle(hService);
 mainf.gauge1.MaxValue:=0;
 mainf.gauge1.Progress:=0;
 mainf.edit1.Text:='';
//  mainf.SetDB(bact);
 go_tall:=true;
end;

function LoadFile;

var
 hand:integer;
 hid:cardinal;

begin
    go_url:=AUrl;
    go_file:=Targetfile;
    hand:=BeginThread(nil,0,go,nil,0,hid);
    while (not boolstop)and(not go_tall) do
          begin
          application.ProcessMessages;
          end;
    CloseHandle(hand);
    result:=go_res;
end;

end.


SamProf   (2005-10-26 15:03:00) [4]

Вот такой вот код:
Сделано ужасно, не судите строго!

unit SamInternetU;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DB, DBTables, ExtCtrls, Grids, DBGrids, StdCtrls, Gauges,wininet;
const
 go_BUFFERSIZE = 4096;

var
  go_url,go_file:string;
  go_res,go_tall:boolean;

 function LoadFile(AUrl, Targetfile: string): Boolean;
implementation

uses MainU;

function go(p:Pointer):integer;
var
 F: file;
 hSession: HINTERNET;
 hService: HINTERNET;
 lpBuffer: array[0..go_BufferSize + 1] of Byte;
 BufferLength: DWORD;
 dwSizeOfRq, Reserved, dwByteToRead: DWORD;
 TargetFileName: string;
 fsize: DWORD;
 bact:Boolean;

begin

 go_tall:=false;
 boolstop:=false;
//  bact:=mainf.DB.Connected;
//  mainf.setDB(False);
 mainf.edit1.Text:=go_Url;
 go_Res := False;
 hSession := InternetOpen('MyApp', // Agent
   INTERNET_OPEN_TYPE_PRECONFIG, // dwAccessType
   nil, // lpszProxyName (optional)
   nil, // lpszProxyBypass (optional)
   0); // dwFlags
 mainf.memo1.lines.add('InternetOpen');
 if hSession = nil then
 begin
   mainf.memo1.lines.add('Internet session initialization failed!');
   Exit;
 end;
 hService := InternetOpenUrl(hSession,
   PChar(go_Url),
   nil,
   0,
   INTERNET_FLAG_DONT_CACHE or
   INTERNET_FLAG_PRAGMA_NOCACHE or
   INTERNET_FLAG_RELOAD,
   0);
 mainf.memo1.lines.add('InternetOpenUrl');
 if hSession = nil then
 begin
   mainf.memo1.lines.add('Internet session initialization failed!');
   InternetCloseHandle(hService);
   Exit;
 end;
 HttpQueryInfo(hService, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER,
   @dwByteToRead,
   dwSizeOfRq, Reserved);
 mainf.memo1.lines.add('HttpQueryInfo HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER');
 TargetFileName :=   go_file;
 AssignFile(F, TargetFileName);
 Rewrite(F, 1);
 if IOResult <> 0 then
 begin
   mainf.memo1.lines.add('Cannot create local file');
   InternetCloseHandle(hService);
   Exit;
 end;
 BufferLength := go_BUFFERSIZE;
 dwByteToRead := 0;
 dwSizeOfRq := 4; // BufferLength
 Reserved := 0;
 if not HttpQueryInfo(hService,
   HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER,
   @dwByteToRead,
   dwSizeOfRq,
   Reserved) then dwByteToRead := 0;

 FSize := 0;
 BufferLength := go_BUFFERSIZE;
 while (BufferLength > 0)and not (boolstop) do
 begin
   application.ProcessMessages;
   if not InternetReadFile(hService, @lpBuffer, go_BUFFERSIZE, BufferLength)
     then Break;
   if (BufferLength > 0) and (BufferLength <= go_BUFFERSIZE) then
     BlockWrite(F, lpBuffer, BufferLength);
   application.ProcessMessages;
   fsize := fsize + BufferLength;
   mainf.memo1.lines.add(inttostr(fsize) + ' / ' + inttostr(dwByteToRead) + ' bytes complete..');
   mainf.gauge1.MinValue:=0;
   mainf.gauge1.MaxValue:=dwByteToRead;
   mainf.gauge1.Progress:=fsize;
   mainf.edit2.Text:=inttostr(fsize) + ' / ' + inttostr(dwByteToRead);
   application.ProcessMessages;
   if BufferLength > 0 then go_Res := True;
 end;
 CloseFile(F);
 go_Res := True;
 mainf.memo1.lines.add('Done..');
 InternetCloseHandle(hService);
 mainf.gauge1.MaxValue:=0;
 mainf.gauge1.Progress:=0;
 mainf.edit1.Text:='';
//  mainf.SetDB(bact);
 go_tall:=true;
end;

function LoadFile;

var
 hand:integer;
 hid:cardinal;

begin
    go_url:=AUrl;
    go_file:=Targetfile;
    hand:=BeginThread(nil,0,go,nil,0,hid);
    while (not boolstop)and(not go_tall) do
          begin
          application.ProcessMessages;
          end;
    CloseHandle(hand);
    result:=go_res;
end;

end.


Digitman   (2005-10-26 14:56:00) [5]


> он качает файл из инета


какими инстр.средставами ?

хэндл кл.гнезда доступен ?


Leonid Troyanovsky   (2005-10-26 14:51:00) [6]


> SamProf ©   (26.10.05 14:45)  

> Иногда он может подвиснуть(он качает файл из инета) и мне
> нужно его забить!


Сделай закачку в отдельном процессе.
Сообщить об окончании он может, например, путем SendMessage.
А если есть нужда, его можно прибить хоть TerminateProcess.

--
Regards, LVT.


Наверх

Титульная страница Поиск, карта сайта Написать письмо