![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поток. Как "убить себя" ?
DevilDevil © (2007-02-27 12:52:00)Второй раз сталкиваюсь с проблемой, не могу найти решения. Необходимо завершить поток из этого же потока. При такой попытке у меня всё виснет.
Если это возможно, то как?
заранее, Спасибо.
Leonid Troyanovsky (2007-04-17 11:04:00) [1]
> DevilDevil © (27.02.07 13:20) [3]
> а при попытке закрыть (из callback-функции), опять виснет:
В этих колбеках, IMHO, очень ограниченный набор разрешенных
для вызова функций. Подробности см. в msdn.
--
Regards, LVT.
Riply (2007-04-17 09:44:00) [2]>[11] DevilDevil © (27.02.07 16:55)
>хмм... в каком тогда случае всё зависает?
Например, если дело не доходит до ExitThread()
dreamse (2007-04-17 03:50:00) [3]> Как "убить себя" ?
Об стену :)
Яаду можешь хлебнуть :)
Leonid Troyanovsky (2007-02-27 18:16:00) [4]
> Сергей М. © (27.02.07 17:15) [13]
> > в каком тогда случае всё зависает?
> "все" это что ?
Видимо, все, что дорого автору.
Обычное преувеличение, IMHO.
--
Regards, LVT.
Сергей М. (2007-02-27 17:15:00) [5]
> в каком тогда случае всё зависает?
"все" это что?
Джо (2007-02-27 17:12:00) [6]> [11] DevilDevil © (27.02.07 16:55)
> хмм... в каком тогда случае всё зависает?
В твоем :)
DevilDevil (2007-02-27 16:55:00) [7]хмм... в каком тогда случае всё зависает?
Сергей М. (2007-02-27 16:27:00) [8]
> DevilDevil © (27.02.07 16:22) [9]
> если вызвать ExitThread() из этого же потока, поток завершится
> и не повесится?
Совершенно верно. В точном соответствии с msdn.
DevilDevil (2007-02-27 16:22:00) [9]> Сергей М. © (27.02.07 14:50) [8]
Иными словами, если вызвать ExitThread() из этого же потока, поток завершится и не повесится? ... вроде бы именно так я и делал...
Сергей М. (2007-02-27 14:50:00) [10]
> разве не надо вызывать какой-нибудь ужас типа KillThread()
> ?
Нет, конечно.
Для этого есть другой "ужас" - ExitThread, это штатный "ужас" для корректного завершения работы потока из произвольного места в теле поточной функции.
Следующие примеры завершения потока абсолютно корректны и эквивалентны :
function MyThreadFunc(...): Integer;
begin
end; //<-- здесь
function MyThreadFunc(...): Integer;
begin
..
Exit; //<-- здесь
..
end;
function MyThreadFunc(...): Integer;
begin
..
ExitThread(..); //<-- здесь
..
end;
Джо (2007-02-27 14:42:00) [11]> [6] DevilDevil © (27.02.07 14:40)
> "А разве не надо вызывать какой-нибудь ужас типа KillThread()
> ?"
Не надо. Если есть возможность (а почему бы ее не обеспечить?) обычного выхода из ThreadProc.
DevilDevil (2007-02-27 14:40:00) [12]> Сергей М. © (27.02.07 13:23) [5]
Я, честно говоря, с потоками вообще недавно столкнулся... поэтому задаю тупые вопросы типа этого, сильно не пинайте:
"А разве не надо вызывать какой-нибудь ужас типа KillThread() ?"
Сергей М. (2007-02-27 13:23:00) [13]
> DevilDevil © (27.02.07 13:20) [3]
function MyThreadFunc(...): Integer;
begin
while SomeCondition do SomeThing;
end;
Как только SomeCondition станет равным False, поток (точнее - поточная ф-ция) тут же завершится.
Сергей М. (2007-02-27 13:20:00) [14]
> trubin © (27.02.07 13:07) [2]
Какой TThread ?!
WinAPI же)
DevilDevil (2007-02-27 13:20:00) [15]ууу, нет... у меня подругому :)
в первом случае у меня был (есть) обычный виндусовый поток, который декодирует треккерную музыку в в wave буффер и при необходимости воспроизводит его. Так вот в этом потоке я могу отловить, кончился трек или нет. Делаю соответсвующее событие (по окночании трека). А в этом событии с треком можно делать что угодно: "нажать на стоп", "нажать на плей", ... дык вот при методе Stop мой поток должен завершаться... и виснет при такой попытке. Вот!
Сейчас другая проблема, но Очень похожая:
Res := waveOutOpen(@WaveOutData.WaveHandle, WAVE_MAPPER, @WaveFormat, Cardinal(@WaveProc), Cardinal(Self), CALLBACK_FUNCTION);
<-- это тоже вроде поток создаётся ...
а при попытке закрыть (из callback-функции), опять виснет:
Res := waveOutReset(WaveOutData.WaveHandle);
trubin (2007-02-27 13:07:00) [16]
> Необходимо завершить поток из этого же потока.
Просто выйти из метода TThread.Execute.
Если еще установать TThread.FreeOnTerminate = True, то и объект уничтожится автоматически.
Сергей М. (2007-02-27 12:57:00) [17]
> Необходимо завершить поток из этого же потока
> При такой попытке у меня всё виснет.
При какой?