Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поток. Как "убить себя" ?


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]


> Необходимо завершить поток из этого же потока


> При такой попытке у меня всё виснет.


При какой?


Наверх

Титульная страница Поиск, карта сайта Написать письмо