Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.03.2013, 03:33
Pcrepair
 
Сообщения: n/a
По умолчанию Как получить handle потока (TThread)?

Добрый день. Есть код потока(упрощенно)

Код:
type
  TLoader = class(TThread)
  private
     FUrl:string;
     FHtml:string;
     FIdHttp:TidHTTP;
     FThreadHandle:THandle;
  protected
    procedure Execute; override;
    procedure ShowPage; 
    function LoadHtmlPage(const Url:string):string;
  public 
    constructor Create(AStr:string);
    destructor Destroy; override;
  end;
....................

constructor TLoader.Create;
begin
  inherited Create(False);
  FIdHttp := TIdHTTP.Create(nil);
  FreeOnTerminate := True;
  Self.Priority := tpNormal;
  FUrl:=AStr;
  FThreadHandle:=(*вот тут непонятно, где взять значение дескриптора?*);
end;
..............
procedure TLoader.ShowPage;
begin
   Main.Label3.Caption:='Page Loaded';
   Main.Memo1.Lines.Add(FHtml);
   Main.Label2.Caption:=IntToStr(FThreadHandle); (*тут нужно отобразить дескриптор потока*)
end;

все чего удалось накопать это:

Код:
var 
  HandleChange: THandle;                       
begin 
  HandleChange := 
    FindFirstChangeNotification( 
      PChar(FPath),                            
      False,                                   
      FILE_NOTIFY_CHANGE_FILE_NAME +          
      FILE_NOTIFY_CHANGE_ATTRIBUTES );        //но это не то что нужно

Вопрос: откуда и как получить значение дескриптора потока?
Ответить с цитированием
  #2  
Старый 28.03.2013, 03:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну хоть бы немного сам в гугле порылся...
http://docwiki.embarcadero.com/Libra...TThread.Handle

Кстати, а нафига тебе этот хэндл? Что ты собрался с ним делать?
Ответить с цитированием
  #3  
Старый 28.03.2013, 10:23
Pcrepair
 
Сообщения: n/a
По умолчанию

полдня хуглил:
FThreadHandle:=Self.Handle;
Однако если запустить "Отладочное окно -> Потоки" то число которое получается из FThreadHandle:=Self.Handle; отличается от тех значений что видны в отладочном окне. и как это понимать?

дескриптор потока нужен для того чтобы если поток зависнет(из за ИНДИ загрузчика - такое бывает) принудительно уничтожить поток, по дескриптору
Ответить с цитированием
  #4  
Старый 28.03.2013, 11:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

оно?


так что тут не ясно? у TThread есть Handle и есть ThreadID.

еще лучше почитать статью почему не рекомендуется убивать поток.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 28.03.2013, 11:28
Pcrepair
 
Сообщения: n/a
По умолчанию

Цитата:
Сообщение от NumLock
так что тут не ясно? у TThread есть Handle и есть ThreadID.
еще лучше почитать статью почему не рекомендуется убивать поток.
неясно следующее: Handle - это то с помощью чего можно в основном потоке управлять созданным потоком(загрузчик страниц)????

когда поток зависает и когда таких потоков много то что еще можно сделать? перезагрузка программы - не вариант
Ответить с цитированием
  #6  
Старый 28.03.2013, 11:46
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
неясно следующее: Handle - это то с помощью чего можно в основном потоке управлять созданным потоком(загрузчик страниц)????
Нет, нельзя. Юзай ThreadID
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
Pcrepair (28.03.2013)
  #7  
Старый 28.03.2013, 12:26
Pcrepair
 
Сообщения: n/a
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Нет, нельзя. Юзай ThreadID

Вот так получилось заиметь дескриптор процесса

Код:
private
.........................
     //FThreadHandle:THandle; //тут непонятно что
     FThreadHandle:TThreadID; // а тут дескриптор, который совпадает с результатом в окне отладчика
.........................
procedure TLoader.Execute;
begin
   FThreadHandle:=Self.ThreadID;
.........
однако, если использовать для ликвидации процесса функцию TerminateThread(MyHosedThread.Handle, 0); это приводит к утечке памяти(что и понятно)
есть ли способ закрыть процесс без эксцессов?
Ответить с цитированием
  #8  
Старый 28.03.2013, 12:33
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А зачем кувалдой по микроскопу?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 28.03.2013, 12:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

заставь поток завершится нормально, пусть и без выполнения его задачи.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 28.03.2013, 14:26
Pcrepair
 
Сообщения: n/a
По умолчанию

Цитата:
Сообщение от NumLock
заставь поток завершится нормально, пусть и без выполнения его задачи.
что значит "заставь"?
Ответить с цитированием
  #11  
Старый 28.03.2013, 15:06
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

значит сделать так, чтобы выполнение метода Execute само закончилось.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #12  
Старый 28.03.2013, 15:29
Pcrepair
 
Сообщения: n/a
По умолчанию

само не может закончиться, поскольку одна из функций в методе не может завершить работу. и что теперь скажешь?
Ответить с цитированием
  #13  
Старый 28.03.2013, 15:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

плохая функция если ей нельзя послать сигнал завершить всю работу немедленно)))

если это про метод TIdHTTP.Get(), то можно просто закрыть сокет, чтобы он вывалился с исключением. обработать его соответствующе и тогда Execute сам завершится. а терминировать поток последнее дело.

к тому же у TIdHTTP есть таймауты.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 28.03.2013, 17:39
Pcrepair
 
Сообщения: n/a
По умолчанию

тайм ауты в некоторых ситуациях не срабатывают, собственно из за этого и все проблемы с получение дескриптора и ликвидацией потока в котором загрузчик Tidhttp.

а как можно закрыть сокет? обработка исключений там есть( в реальном коде) - все исключения ведут в EXIT.
что то приискал типа FIdHttp.Socket.Close; но никак не пойму как его подключить? так чтобы была привязка к дескриптору потока и вообще непонятно как подать сигнал в поток что пора уже FIdHttp.Socket.Close сделать
Ответить с цитированием
  #15  
Старый 28.03.2013, 19:51
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

да хоть IdHTTP сделай public'ом и из главного потока закрывай его.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:41.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025