Форум: "Начинающим";
Текущий архив: 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) но только уже из другого потока
а выполняется он очень просто пишется в ThreadProcEndThread(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