![]() |
| ||
|
|
Новости |
Поиск |
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 18:07:00) [1]>Сергей М. © (27.02.08 17:48) [32]
-) абезательна пачитаю!
ктому-же, по сравнению с тем, что я читал на форумах на этом сайте, мои сообщения - детский лепет...
"туса"- а откуда вы такие славечки знаете -)))
тут ведь так - или все или никто... я за! Больше каверкать небуду.
Сергей М. (2008-02-27 17:48:00) [2]Еще букварь какой-нить по великому-могучему не забудь почитать, наберись ума-разума и больше не коверкай слова - тут же тебе не пацанская пивная "туса")
tytus (2008-02-27 17:44:00) [3]>Palladin © (27.02.08 17:20) [29]
не... ну яж не утверждал что если на сях, то это критично... Просто, говорю, привык читать текст, а иже с ним и примеры на делфи... Абезательно пачитаю.
>Сергей М. © (27.02.08 17:21) [30]
пока что ничего сказать немогу... могу предпалажить, что массив останется в памяти, после того как поток умрет..
Пачитаю Рихтера, наберусь ума-разуму и абезательно напишу. -)
Сергей М. (2008-02-27 17:21:00) [4]
> tytus
Дарю грабли, познакомься с ними поближе:
function MyRakeFunc(..): Integer;
var
arr: array of SomeType;
begin
SetLength(arr, 1);
EndThread(SomeCode);
end;
Palladin (2008-02-27 17:20:00) [5]
> tytus (27.02.08 17:14) [26]
при чем тут C ? он тебе описывает что и как происходит, а на C это или на чем то другом, абсолютно по барабану, потому что это все на WinAPI, а он для всех одинаковый и названия функций и соглашения о типах и вызовах поддерживаются любой средой разработки для Win32... ну акромя самых дубовых... я таких даже не знаю
tytus (2008-02-27 17:16:00) [6]>Palladin © (27.02.08 17:11) [25]
а мне сия ф-я (функция) панравилась в паре с ShellExecuteEx, когда нужно подождать выполнение другой программы (например я юзал WinRar с передачей параметров извлечения файлов...)
Сергей М. (2008-02-27 17:16:00) [7]
> после WaitFor SingleObject писать CloseHandle(hThread);
> и все?
> Поток корректно убъецца?
Поток корректно "умирает", когда штатно завершилось (или принудительно терминировано) выполнение поточной функции и закрыты все хендлы, ассоциированные с созданным потоком.
Корректность же с т.з. ресурсов, использованных потоком в ходе выполнения поточной ф-ции, - это отдельная песня.
> EndThread в моем примере ненужен?
В твоем точно не нужен).. Но на то он и пример, а не реальный "боевой" код)
tytus (2008-02-27 17:14:00) [8]>Palladin © (27.02.08 17:10) [24]
а рихтер по-моему написал для Си...
У меня есть его книга
Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows
в формате chm, зокачал аткуда-то... но что-то неинтересно вникать когда код неродной -)
Если есть Рихтер на Delphi- скинь сцылку, плз.
Palladin (2008-02-27 17:11:00) [9]так же узнаешь, что кроме WaitForSingleObject, существует другая масса вкусных функций синхронизации, а точнее объектов ядра для синхронизации и контроля потоков
Palladin (2008-02-27 17:10:00) [10]чесс слово, хочешь узнать побольше о потоках на низком уровне, почитай Рихтера, узнаешь очень много полезного и масса вопросов сразу исчезнет, это не тот случай что бы ставить эксперименты
tytus (2008-02-27 17:06:00) [11]>Сергей М. © (27.02.08 16:32) [21]
так что, после WaitFor SingleObject писать CloseHandle(hThread); и все?
Поток корректно убъецца?
причем с завидным ослиным упрямством
так что, EndThread в моем примере ненужен?
>Palladin © (27.02.08 16:37) [22]
твоей хотелки
тут форум программистов, а не улица, папрашу... =) ...
всем спасибо исче раз, объяснили .
Palladin (2008-02-27 16:37:00) [12]а чего ты хотел? никто тебе здесь полного решения твоей хотелки и не давал вообщето, тебе лишь объясняли что такое EndThread и GetThreadExitCodeThread, так что не понятно какие могут быть претензии
Сергей М. (2008-02-27 16:32:00) [13]
> Что в Result писать 2 (без EndThread), что в EndThread писать
> 2 (без Result) -один хрен, возвращает 2
Я не про возврат)
То что "один хрен возвращает", то и ежу понятно)
Я про бездумное использование EndThread. Пока ты демонстрируешь именно оное, причем с завидным ослиным упрямством при этом)
> про WaitForSingleObject наверное умолчали
А кому он интересен ?)
В твоем вопросе не было ни намека на синхронизацию, речь зашла про "в чем тут дело" и логику/правильность использования ф-ции EndThread)
tytus (2008-02-27 16:27:00) [14]>Palladin © (27.02.08 15:54) [19]
GetExitCodeThread(hThread,ExitCode)
ты получишь в ExitCode свое 2 или 3 которое указал в EndThread
нихрена , батенька, всегда вазвращает STILL_ACTIVE;
а чтоб сего небыло, нужна написать:
Флажок:=false;//или true, кому как нравиццо
while WaitForSingleObject(hThread,50)<>WAIT_OBJECT_0 do
Application.ProcessMessages;
а уже потом GetExitCodeThread, тогда только мы получим 2или 3
Вообщето, всем списибо. Я немного нето думал. Точнее что GetExitCodeThread нужна чтобы потом ExitCode использовать в EndThread.
А оказалось, что GetExitCodeThread - нужна всего лишь для получения результата выполнения ф-ции потока. А EndThread нужно вызывать в процедуре потока, и передавать в нее нужное.
>Сергей М. © (27.02.08 15:52) [18]
function ThreadProc(параметр): Integer;
begin
while not Флажок do
begin
end;
Result := КодВозврата;//2
EndThread(2);
end;
Что в Result писать 2 (без EndThread), что в EndThread писать 2 (без Result) -один хрен, возвращает 2. Так что, писать так:
Result := 2;//для GetExitCodeThread
EndThread(2);//чтобы поток убился.
>All
про WaitForSingleObject наверное умолчали, чтобы потом добить меня основательно...
Palladin (2008-02-27 15:54:00) [15]нет, я так не могу :) держите меня семеро!
> и как же без ExitCode выполнить EndThread в процедуре потока
еще раз объясняю, EndThread завершает поток в контексте которого он выполняется!!!!и параметром ему передается чиселко которое ты потом получишь с помощью процедуры GetExitCodeThread(hThread,ExitCode)но только уже из другого потока
а выполняется он очень просто пишется в ThreadProc
EndThread( 2Или 3);
а потом уже в Button2Click
при помощи вызова
GetExitCodeThread(hThread,ExitCode)
ты получишь в ExitCode свое 2 или 3 которое указал в EndThread
если ты и сейчас не понял, то я уже не знаю что с тобой делать, только что за метлой послать
Сергей М. (2008-02-27 15:52:00) [16]
> хотел разобратся с BeginThread и EndThread
Скажу тебе по великому секрету - если ты собрался использовать BeginThread, то EndThread, как правило, нафиг не нужен, и даже опасен в ряде ситуаций.
Вот шаблон поточной ф-ции, которым можно обойтись во многих (но не в любой) ситуациях:
functionThreadProc(параметр): Integer;
begin
while not Флажок do
begin
end;
Result := КодВозврата;
end;
tytus (2008-02-27 15:50:00) [17]>Palladin © (27.02.08 15:42) [15]
вот только это бред...
пачему бред... только об этом говорили...
и как же без ExitCode выполнить EndThread в процедуре потока?!!!
> хотя есть и другой вариант
это что - PostMessage(hThread, CX_МойМессаг,0,0) - так что-ли...
Если да, тогда зачем услажнять жизнь самому себе..?
Palladin (2008-02-27 15:43:00) [18]
> да в том то и дело, что хотел разобратся с BeginThread и
> EndThread.
так а в чем проблеммы, идешь и изучаешь TThread...
Palladin (2008-02-27 15:42:00) [19]
> GetExitCodeThread(hThread,ExitCode);
вот только это бред...
хотя есть и другой вариант, организовать в ThreadProc цикл обработки сообщений
Palladin (2008-02-27 15:40:00) [20]
> tytus (27.02.08 15:38) [13]
от именно, такой и будет
> Вывешивать флажки - не очень мне нравится, разве для моего
> случая это панацея?
это не панацея, а правильноерешение