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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.08.2013, 18:40
ValeryB ValeryB вне форума
Прохожий
 
Регистрация: 09.05.2013
Сообщения: 15
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию Не работает TerminateThread

Есть процедура в отдельном потоке

Код:
Procedure DoNothing;
begin
while true do;
end;
MAD: !!!!! >:-(

Я хочу её убить TerminateThread
Как не странно, но она не убивается этой функцией.


В описании написано, что
Windows NT: The handle must have THREAD_TERMINATE access. For more information, see Thread Objects.

Но ни в помощи, ни в гугле нет ни единого примера. Может кто подсказать ?

Последний раз редактировалось M.A.D.M.A.N., 26.08.2013 в 21:17.
Ответить с цитированием
  #2  
Старый 26.08.2013, 18:47
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ваш код покажите, пожалуйста.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 26.08.2013, 18:53
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а еще в писании сказано:
Цитата:
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Поток кто создает?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 26.08.2013, 18:59
ValeryB ValeryB вне форума
Прохожий
 
Регистрация: 09.05.2013
Сообщения: 15
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию

Поток создаёт WinAPI
CreateThread(nil,0,@DoNothing,nil,0,ConnectThreadI D);

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

это не константа:
Цитата:
The thread handle returned by the CreateThread and CreateProcess functions has THREAD_TERMINATE access, so any caller holding one of these handles can terminate your thread.
и что все-таки с GetLastError ? и почему бы не завершить поток корректно, без утечки ресурсов?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 26.08.2013, 20:52
ValeryB ValeryB вне форума
Прохожий
 
Регистрация: 09.05.2013
Сообщения: 15
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию

Всё, разобрался. Моя ошибка.
SysErrorMessage = Неверный дескриптор.

Надо было делать так:

Код:
Hndle:= CreateThread(nil,0,@DoNothing,nil,0,ThreadHandle);
TerminateThread(Hndle,0);
MAD: оформляем код, блин

Просто в описании ф-ции CreateThread написано, что
LPDWORD lpThreadId // pointer to returned thread identifier
И то, что дескриптор должен обладать признаком THREAD_TERMINATE
Вообщем, тогда я не понимаю что это всё значит.

Ну и пару встречных вопросов:
1. А как можно правильно завершить поток выполняющий while true do; ?
2. Можно как нибудь избавиться от утечки ресурсов в бесклассовом треде завершённым таким образом(через ThreadTerminate) ?

Последний раз редактировалось M.A.D.M.A.N., 26.08.2013 в 21:21.
Ответить с цитированием
  #7  
Старый 26.08.2013, 21:49
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Использовать какой-либо флаг завершения. В классовом варианте это
Код:
while not Terminated do ...

А вообще упоротость - писать на ООП-языке без ООП. Вы бы ещё на ассемблере писали в блоке asm ... end;
Для таких извращений есть Си (без плюсов) и подобные языки.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 26.08.2013 в 21:52.
Ответить с цитированием
  #8  
Старый 26.08.2013, 22:08
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Вы бы ещё на ассемблере писали в блоке asm ... end;
Challenge accepted.
Цитата:
А как можно правильно завершить поток выполняющий while true do; ?
Цитата:
Использовать какой-либо флаг завершения.
Для понятности, как пример:
Код:
// thread:
while not myStopFlag do ;
...
// main thread:
myStopFlag := false;
CreateThread(...., @myStopFlag, ...); // parameter passed to thread
myStopFlag := true;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 26.08.2013, 22:19
ValeryB ValeryB вне форума
Прохожий
 
Регистрация: 09.05.2013
Сообщения: 15
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию

Ну вообще про флаги я в курсе...

А если надо вызвать функцию из DLL в отдельном потоке ?
Например какую-нибудь функцию шифрования из внешней DLL ?
DLL - не будет смотреть на флаги. Этот поток либо терминировать либо дожидаться окончания.

EBFE!
Ответить с цитированием
  #10  
Старый 26.08.2013, 22:26
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

DLL, я так понимаю, не очень самописная? Если своя - то будет и ещё как, если её заставить это делать А если чужая - то фиг знает. Можно использовать внешний "менеджер памяти" для потока - перед созданием треда выделять ему необходимые ресурсы, после смерти (или убийства) - освобождать в основной программе. Тогда утечек не будет.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #11  
Старый 27.08.2013, 08:54
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

+ Borland рекомендовал использовать BeginThread / EndThread вместо CreateThread / ExitThread.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter