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 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]

от именно, такой и будет


> Вывешивать флажки  - не очень мне нравится, разве для моего
> случая это панацея?

это не панацея, а правильноерешение


Страницы:   1 2

Наверх

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