Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

EndThread - закрывается приложение. Почему? [D7, WinXP]


Страницы:   1 2

tytus ©   (2008-02-27 14:55:00) 

Доброго дня всем. Написал простейшую программку для разбора полетов с потоками. Создаю поток:

hThread:THandle;
ThreadID:Cardinal;
...
Button1Click
 hThread:=BeginThread(nil,0,@ThreadProc,nil,THREAD_QUERY_INFORMATION,ThreadID);

Button2Click
вот так убиваю поток:
var
 ExitCode:Cardinal;
GetExitCodeThread(hThread,ExitCode);
EndThread(ExitCode);

Программка закрываеться. В чем тут дело...


tytus   (2008-02-27 15:38:00) [21]

>Palladin ©   (27.02.08 15:32) [12]
да в том то и дело, что хотел разобратся с BeginThread и EndThread.
Так что велик я не изабретаю.-)
Вывешивать флажки  - не очень мне нравится, разве для моего случая это панацея?
Тогда вид процедуры потока будет такой
procedure ThreadProc;
var
 ExitCode:Cardinal;
begin
while not Флажок do
begin

end;
GetExitCodeThread(hThread,ExitCode);
EndThread(ExitCode);
end;

так пожалуй....


Palladin   (2008-02-27 15:32:00) [22]

хочешь адекватно прерывать свой поток извне, заводи для него флаг убиения, и опрашивай его значение по мере выполнения ThreadProc, аккуратно на него реагируя и вызывая в ThreadProcEndThread когда это необходимо, а можешь не изобретать велосипед, а воспользоваться классом TThread, в котором это уже все сделано


Сергей М.   (2008-02-27 15:30:00) [23]


> tytus   (27.02.08 15:23) [7]


> как же убить поток?


Дай ему умереть самому)

Просто скажи ему тем или иным образом "умри !"  - и пусть он застрелит себя сам, как только завершит дела свои скорбные)

Вот уж когда он откажется (или глухой/слепой/немой он от рождения), вот тогда и убийство средствами TerminateThread может быть оправдано.


Palladin   (2008-02-27 15:29:00) [24]

Да потому что TerminateThread принимает в параметрах кого надо убивать!!!


tytus   (2008-02-27 15:28:00) [25]

>Palladin ©   (27.02.08 15:25) [8]
угу... значит и убивает он какой поток?
должен убивать hThread - а не основной поток.
А почему тогда TerminateThread(hThread) - убивает того, кого надо?!!

хотя судя по
вот отдуда и непонятки TerminateThread и EndThread...


Palladin   (2008-02-27 15:25:00) [26]


> выполняется в главном потоке, тоесть в потоке программы,
>  тоесть
> не в ThreadProc.

угу... значит и убивает он какой поток? хотя судя по


> согласен. Дак как же убить поток? TerminateThread помогает,
>  но весде пишется что сей метод не годится, правильнее EndThread.
>

ты нифига не понял...


tytus   (2008-02-27 15:23:00) [27]

>Palladin ©   (27.02.08 15:19) [6]
выполняется в главном потоке, тоесть в потоке программы, тоесть
не в ThreadProc.

>Сергей М. ©   (27.02.08 15:08) [4]
согласен. Дак как же убить поток? TerminateThread помогает, но весде пишется что сей метод не годится, правильнее EndThread.


Palladin   (2008-02-27 15:19:00) [28]

фу, млин, Button2Click тоесть...


Palladin   (2008-02-27 15:18:00) [29]


> вот что-то читал в MSDN, по поводу EndThread, там как раз
> шла речь о процедуре потока...

в MSDN нет ничего про EndThread, не документируют MSсовцы system.pas делфовый, от гады... EndThread завершает тот поток (посредством ExitThread) в контексте которого он вызывается... чего не понятного? как ты думаешь в контексте какого потока исполняется Button1Click ?


Сергей М.   (2008-02-27 15:08:00) [30]


> Наверное нужно передавать hThread в процедуру потока


За каким лешим ?)

Ты где-нибудь средим параметров ф-ции EndThread видишь хоть что-либо отдаленно напоминающее хэндл чего-то там ?


tytus   (2008-02-27 15:06:00) [31]

так, с конфиренцией согласен..=)
>Сергей М. ©   (27.02.08 14:58) [1]
да, вы правы.. Наверное нужно передавать hThread в процедуру потока
ThreadProc и там делать EndThread.

>Palladin ©   (27.02.08 14:58) [2]
вот что-то читал в MSDN, по поводу EndThread, там как раз шла речь о процедуре потока...


Сергей М.   (2008-02-27 14:58:00) [32]


> В чем тут дело


В том что EndThread() выполняется не в контексте потока, о котором ты думаешь и хэндл которого лежит в hThread.


Palladin   (2008-02-27 14:58:00) [33]

а чего ты удивляешься, справку то читал про EndThread?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо