Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

Поток. Как "убить себя" ?   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2007.10.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
3-1181379653
Девушка
2007-06-09 13:00
2007.10.14
странное поведение interbase?


2-1189951828
Serega99
2007-09-16 18:10
2007.10.14
sleep( )


2-1189697851
Ezorcist
2007-09-13 19:37
2007.10.14
Проверить является ли строка числом?


2-1190004580
GeLLeR
2007-09-17 08:49
2007.10.14
Сообщение нажатия кнопки


2-1190119267
artem779
2007-09-18 16:41
2007.10.14
Internet Explorer