Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Как забить 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
3-1128394079
npr2
2005-10-04 06:47
2005.11.13
Запись картинки с Image в БД Access


3-1128326194
Os
2005-10-03 11:56
2005.11.13
Удаленные записи


4-1126705615
Новичоккк
2005-09-14 17:46
2005.11.13
Определение заголовка окна по PID


14-1130002151
БарЛог
2005-10-22 21:29
2005.11.13
Хорошее выражение, но...


14-1129729150
lightix
2005-10-19 17:39
2005.11.13
QuickReport у не нравится лазерный принтер samsung