Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1126628734
begin...end
2005-09-13 20:25
2005.11.13
Значения описателей объектов ядра


14-1130062668
Nikolay M.
2005-10-23 14:17
2005.11.13
Никому не нужны программы на 5 25 для Spectrum?


10-1107329735
Мыкола Бондаренко
2005-02-02 10:35
2005.11.13
WinFax Pro


3-1128368821
ALEX_T
2005-10-03 23:47
2005.11.13
Многопользоватльская прога


3-1128083929
isasa
2005-09-30 16:38
2005.11.13
MS SQL server и подключение пользовательских функций





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский