Форум: "Начинающим";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизКак забить THread? Найти похожие ветки
← →
SamProf © (2005-10-26 14:45) [0]У меня в проге есть создание потока:
hand:=BeginThread(nil,0,go,nil,0,hid);
Иногда он может подвиснуть(он качает файл из инета) и мне нужно его забить!
CloseHandle(hand); - вроде срабатывает, но через какоето время, т.е. выполнются уже следующие команды, а поток ещё работает.....
procedure EndThread(ExitCode: Integer); - как я понял нужно вызывать в самом потоке, а мне нужно из своей проги его забить или как-то дождаться, поеп он точно забьётся!
Спасибо!
← →
Leonid Troyanovsky © (2005-10-26 14:51) [1]
> SamProf © (26.10.05 14:45)
> Иногда он может подвиснуть(он качает файл из инета) и мне
> нужно его забить!
Сделай закачку в отдельном процессе.
Сообщить об окончании он может, например, путем SendMessage.
А если есть нужда, его можно прибить хоть TerminateProcess.
--
Regards, LVT.
← →
Digitman © (2005-10-26 14:56) [2]
> он качает файл из инета
какими инстр.средставами ?
хэндл кл.гнезда доступен ?
← →
SamProf © (2005-10-26 15:03) [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) [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.
← →
SamProf © (2005-10-26 15:21) [5]
> А если есть нужда, его можно прибить хоть TerminateProcess.
Вроде помогло! Спасибо!
← →
Leonid Troyanovsky © (2005-10-26 15:59) [6]
> SamProf © (26.10.05 15:21) [5]
> > А если есть нужда, его можно прибить хоть TerminateProcess.
> Вроде помогло! Спасибо!
Надеюсь, что реализовано именно так, а не через TerminateThread.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c