Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];

Вниз

EndThread - закрывается приложение. Почему?   Найти похожие ветки 

 
tytus   (2008-02-27 14:55) [0]

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

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

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

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


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


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


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


 
Palladin ©   (2008-02-27 14:58) [2]

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


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

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

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


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


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


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

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


 
Palladin ©   (2008-02-27 15:18) [5]


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

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


 
Palladin ©   (2008-02-27 15:19) [6]

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


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

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

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


 
Palladin ©   (2008-02-27 15:25) [8]


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

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


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

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


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

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

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


 
Palladin ©   (2008-02-27 15:29) [10]

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


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


> tytus   (27.02.08 15:23) [7]


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


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

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

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


 
Palladin ©   (2008-02-27 15:32) [12]

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


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

>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:40) [14]


> tytus   (27.02.08 15:38) [13]

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


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

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


 
Palladin ©   (2008-02-27 15:42) [15]


> GetExitCodeThread(hThread,ExitCode);

вот только это бред...

хотя есть и другой вариант, организовать в ThreadProc цикл обработки сообщений


 
Palladin ©   (2008-02-27 15:43) [16]


> да в том то и дело, что хотел разобратся с BeginThread и
> EndThread.

так а в чем проблеммы, идешь и изучаешь TThread...


 
tytus   (2008-02-27 15:50) [17]

>Palladin ©   (27.02.08 15:42) [15]
вот только это бред...
пачему бред... только об этом говорили...
и как же без ExitCode выполнить EndThread в процедуре потока?!!!

>хотя есть и другой вариант
это что - PostMessage(hThread, CX_МойМессаг,0,0) - так что-ли...
Если да, тогда зачем услажнять жизнь самому себе..?


 
Сергей М. ©   (2008-02-27 15:52) [18]


> хотел разобратся с BeginThread и EndThread


Скажу тебе по великому секрету - если ты собрался использовать BeginThread, то EndThread, как правило, нафиг не нужен, и даже опасен в ряде ситуаций.

Вот шаблон поточной ф-ции, которым можно обойтись во многих (но не в любой) ситуациях:
function ThreadProc(параметр): Integer;
begin
 while not Флажок do
 begin

 end;
 Result := КодВозврата;
end;


 
Palladin ©   (2008-02-27 15:54) [19]

нет, я так не могу :) держите меня семеро!


> и как же без ExitCode выполнить EndThread в процедуре потока

еще раз объясняю, EndThread завершает поток в контексте которого он выполняется!!!! и параметром ему передается чиселко которое ты потом получишь с помощью процедуры GetExitCodeThread(hThread,ExitCode) но только уже из другого потока

а выполняется он очень просто пишется в ThreadProc
EndThread(2 Или 3);

а потом уже в Button2Click
при помощи вызова
GetExitCodeThread(hThread,ExitCode)
ты получишь в ExitCode свое 2 или 3 которое указал в EndThread

если ты и сейчас не понял, то я уже не знаю что с тобой делать, только что за метлой послать


 
tytus   (2008-02-27 16:27) [20]

>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 наверное умолчали, чтобы потом добить меня основательно...


 
Сергей М. ©   (2008-02-27 16:32) [21]


> Что в Result писать 2 (без EndThread), что в EndThread писать
> 2 (без Result) -один хрен, возвращает 2


Я не про возврат)

То что "один хрен возвращает", то и ежу понятно)

Я про бездумное использование EndThread. Пока ты демонстрируешь именно оное, причем с завидным ослиным упрямством при этом)


> про WaitForSingleObject наверное умолчали


А кому он интересен ?)

В твоем вопросе не было ни намека на синхронизацию, речь зашла про "в чем тут дело" и логику/правильность использования ф-ции EndThread)


 
Palladin ©   (2008-02-27 16:37) [22]

а чего ты хотел? никто тебе здесь полного решения твоей хотелки и не давал вообщето, тебе лишь объясняли что такое EndThread и GetThreadExitCodeThread, так что не понятно какие могут быть претензии


 
tytus   (2008-02-27 17:06) [23]

>Сергей М. ©   (27.02.08 16:32) [21]
так что, после WaitFor SingleObject писать CloseHandle(hThread); и все?
Поток корректно убъецца?
причем с завидным ослиным упрямством
так что, EndThread в моем примере ненужен?

>Palladin ©   (27.02.08 16:37) [22]
твоей хотелки
тут форум программистов, а не улица, папрашу... =) ...

всем спасибо исче раз, объяснили .


 
Palladin ©   (2008-02-27 17:10) [24]

чесс слово, хочешь узнать побольше о потоках на низком уровне, почитай Рихтера, узнаешь очень много полезного и масса вопросов сразу исчезнет, это не тот случай что бы ставить эксперименты


 
Palladin ©   (2008-02-27 17:11) [25]

так же узнаешь, что кроме WaitForSingleObject, существует другая масса вкусных функций синхронизации, а точнее объектов ядра для синхронизации и контроля потоков


 
tytus   (2008-02-27 17:14) [26]

>Palladin ©   (27.02.08 17:10) [24]
а рихтер по-моему написал для Си...
У меня есть его книга
Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows

в формате chm, зокачал аткуда-то... но что-то неинтересно вникать когда код неродной -)
Если есть Рихтер на Delphi - скинь сцылку, плз.


 
Сергей М. ©   (2008-02-27 17:16) [27]


> после WaitFor SingleObject писать CloseHandle(hThread);
> и все?
> Поток корректно убъецца?


Поток корректно "умирает", когда штатно завершилось (или принудительно терминировано) выполнение поточной функции и закрыты все хендлы, ассоциированные с созданным потоком.

Корректность же с т.з. ресурсов, использованных потоком в ходе выполнения поточной ф-ции, - это отдельная песня.


> EndThread в моем примере ненужен?


В твоем точно не нужен).. Но на то он и пример, а не реальный "боевой" код)


 
tytus   (2008-02-27 17:16) [28]

>Palladin ©   (27.02.08 17:11) [25]
а мне сия ф-я (функция) панравилась в паре с ShellExecuteEx, когда нужно подождать выполнение другой программы (например я юзал WinRar с передачей параметров извлечения файлов...)


 
Palladin ©   (2008-02-27 17:20) [29]


> tytus   (27.02.08 17:14) [26]

при чем тут C ? он тебе описывает что и как происходит, а на C это или на чем то другом, абсолютно по барабану, потому что это все на WinAPI, а он для всех одинаковый и названия функций и соглашения о типах и вызовах поддерживаются любой средой разработки для Win32... ну акромя самых дубовых... я таких даже не знаю


 
Сергей М. ©   (2008-02-27 17:21) [30]


> tytus


Дарю грабли, познакомься с ними поближе:

function MyRakeFunc(..): Integer;
var
 arr: array of SomeType;
begin
 SetLength(arr, 1);
 EndThread(SomeCode);
end;


 
tytus   (2008-02-27 17:44) [31]

>Palladin ©   (27.02.08 17:20) [29]
не... ну яж не утверждал что если на сях, то это критично... Просто, говорю, привык читать текст, а иже с ним и примеры на делфи... Абезательно пачитаю.

>Сергей М. ©   (27.02.08 17:21) [30]
пока что ничего сказать немогу... могу предпалажить, что массив останется в памяти, после того как поток умрет..
Пачитаю Рихтера, наберусь ума-разуму и абезательно напишу. -)


 
Сергей М. ©   (2008-02-27 17:48) [32]

Еще букварь какой-нить по великому-могучему не забудь почитать, наберись ума-разума и больше не коверкай слова - тут же тебе не пацанская пивная "туса")


 
tytus   (2008-02-27 18:07) [33]

>Сергей М. ©   (27.02.08 17:48) [32]
-) абезательна пачитаю!
ктому-же, по сравнению с тем, что я читал на форумах на этом сайте, мои сообщения - детский лепет...

"туса" - а откуда вы такие славечки знаете -)))

тут ведь так - или все или никто... я за! Больше каверкать небуду.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.419 c
15-1202959283
Slider007
2008-02-14 06:21
2008.03.30
С днем рождения ! 14 февраля 2008 четверг


2-1204542062
NewSer
2008-03-03 14:01
2008.03.30
Помогите сформулировать SQL запрос: where поле дата - пустое!


3-1194552532
БарЛог
2007-11-08 23:08
2008.03.30
Помогите составить SQL-запрос


2-1204193124
Washington
2008-02-28 13:05
2008.03.30
Вопрос про директивы условной компиляции


15-1203260546
Dark
2008-02-17 18:02
2008.03.30
nmhttp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский