![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день. Есть код потока(упрощенно)
Код:
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
|
|||
|
|||
![]() Ну хоть бы немного сам в гугле порылся...
http://docwiki.embarcadero.com/Libra...TThread.Handle Кстати, а нафига тебе этот хэндл? Что ты собрался с ним делать? |
#3
|
|||
|
|||
![]() полдня хуглил:
FThreadHandle:=Self.Handle; Однако если запустить "Отладочное окно -> Потоки" то число которое получается из FThreadHandle:=Self.Handle; отличается от тех значений что видны в отладочном окне. и как это понимать? дескриптор потока нужен для того чтобы если поток зависнет(из за ИНДИ загрузчика - такое бывает) принудительно уничтожить поток, по дескриптору |
#4
|
||||
|
||||
![]() оно?
![]() так что тут не ясно? у TThread есть Handle и есть ThreadID. еще лучше почитать статью почему не рекомендуется убивать поток. Пишу программы за еду. __________________ |
#5
|
|||
|
|||
![]() Цитата:
когда поток зависает и когда таких потоков много то что еще можно сделать? перезагрузка программы - не вариант |
#6
|
||||
|
||||
![]() Цитата:
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
Pcrepair (28.03.2013)
|
#7
|
|||
|
|||
![]() Цитата:
Вот так получилось заиметь дескриптор процесса Код:
private ......................... //FThreadHandle:THandle; //тут непонятно что FThreadHandle:TThreadID; // а тут дескриптор, который совпадает с результатом в окне отладчика ......................... procedure TLoader.Execute; begin FThreadHandle:=Self.ThreadID; ......... есть ли способ закрыть процесс без эксцессов? |
#8
|
||||
|
||||
![]() А зачем кувалдой по микроскопу?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#9
|
||||
|
||||
![]() заставь поток завершится нормально, пусть и без выполнения его задачи.
Пишу программы за еду. __________________ |
#10
|
|||
|
|||
![]() Цитата:
|
#11
|
||||
|
||||
![]() значит сделать так, чтобы выполнение метода Execute само закончилось.
Пишу программы за еду. __________________ |
#12
|
|||
|
|||
![]() само не может закончиться, поскольку одна из функций в методе не может завершить работу. и что теперь скажешь?
|
#13
|
||||
|
||||
![]() плохая функция если ей нельзя послать сигнал завершить всю работу немедленно)))
если это про метод TIdHTTP.Get(), то можно просто закрыть сокет, чтобы он вывалился с исключением. обработать его соответствующе и тогда Execute сам завершится. а терминировать поток последнее дело. к тому же у TIdHTTP есть таймауты. Пишу программы за еду. __________________ |
#14
|
|||
|
|||
![]() тайм ауты в некоторых ситуациях не срабатывают, собственно из за этого и все проблемы с получение дескриптора и ликвидацией потока в котором загрузчик Tidhttp.
а как можно закрыть сокет? обработка исключений там есть( в реальном коде) - все исключения ведут в EXIT. что то приискал типа FIdHttp.Socket.Close; но никак не пойму как его подключить? так чтобы была привязка к дескриптору потока и вообще непонятно как подать сигнал в поток что пора уже FIdHttp.Socket.Close сделать |
#15
|
||||
|
||||
![]() да хоть IdHTTP сделай public'ом и из главного потока закрывай его.
Пишу программы за еду. __________________ |