|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не работает TerminateThread
Есть процедура в отдельном потоке
Код:
Procedure DoNothing; begin while true do; end; Я хочу её убить 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
|
||||
|
||||
Ваш код покажите, пожалуйста.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#3
|
||||
|
||||
а еще в писании сказано:
Цитата:
Пишу программы за еду. __________________ |
#4
|
|||
|
|||
Поток создаёт WinAPI
CreateThread(nil,0,@DoNothing,nil,0,ConnectThreadI D); И такой константы THREAD_TERMINATE нет. |
#5
|
||||
|
||||
это не константа:
Цитата:
Пишу программы за еду. __________________ |
#6
|
|||
|
|||
Всё, разобрался. Моя ошибка.
SysErrorMessage = Неверный дескриптор. Надо было делать так: Код:
Hndle:= CreateThread(nil,0,@DoNothing,nil,0,ThreadHandle); TerminateThread(Hndle,0); Просто в описании ф-ции 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
|
||||
|
||||
Использовать какой-либо флаг завершения. В классовом варианте это
Код:
while not Terminated do ... А вообще упоротость - писать на ООП-языке без ООП. Вы бы ещё на ассемблере писали в блоке asm ... end; Для таких извращений есть Си (без плюсов) и подобные языки. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 26.08.2013 в 21:52. |
#8
|
||||
|
||||
Цитата:
Цитата:
Цитата:
Код:
// 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
|
|||
|
|||
Ну вообще про флаги я в курсе...
А если надо вызвать функцию из DLL в отдельном потоке ? Например какую-нибудь функцию шифрования из внешней DLL ? DLL - не будет смотреть на флаги. Этот поток либо терминировать либо дожидаться окончания. EBFE! |
#10
|
||||
|
||||
DLL, я так понимаю, не очень самописная? Если своя - то будет и ещё как, если её заставить это делать А если чужая - то фиг знает. Можно использовать внешний "менеджер памяти" для потока - перед созданием треда выделять ему необходимые ресурсы, после смерти (или убийства) - освобождать в основной программе. Тогда утечек не будет.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#11
|
||||
|
||||
+ Borland рекомендовал использовать BeginThread / EndThread вместо CreateThread / ExitThread.
Пишу программы за еду. __________________ |