![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EndThread - закрывается приложение. Почему? [D7, WinXP]
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?