Главная страница
    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.043 c
5-1110621175
alkmas
2005-03-12 12:52
2005.11.13
Сохранение свойств компонента в текстовом виде


2-1129571918
Pasha L
2005-10-17 21:58
2005.11.13
_filetime в searchrec


2-1130172359
Dudee
2005-10-24 20:45
2005.11.13
TString


2-1129313241
картограф
2005-10-14 22:07
2005.11.13
StringGrid


3-1127990038
1g0r
2005-09-29 14:33
2005.11.13
подключение через dbExpress SYS AS SYSDBA





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский