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