![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как забить 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.