Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.05 c
2-1190379982
Kolan
2007-09-21 17:06
2007.10.14
Почему Free не делает nil объекту?


4-1176143482
pit94
2007-04-09 22:31
2007.10.14
Как определить перемен.окружения?


2-1190294052
voe
2007-09-20 17:14
2007.10.14
Глюки в IBQuery1.ExecSQL


15-1189784352
Чайник
2007-09-14 19:39
2007.10.14
UpperCase для кириллицы


2-1190259799
Mery
2007-09-20 07:43
2007.10.14
Ehlib для EhlibIBX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский