Главная страница
    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.037 c
2-1190198322
Василий
2007-09-19 14:38
2007.10.14
Как изменить внешний вид


11-1173682470
vampir_infernal
2007-03-12 09:54
2007.10.14
ThreadTerminate


1-1185882922
oxffff
2007-07-31 15:55
2007.10.14
Статический вызов виртуального метода.


3-1181237949
AlexDav
2007-06-07 21:39
2007.10.14
Из Access в InterBase


6-1171481886
malyar
2007-02-14 22:38
2007.10.14
отправка http запросов post get head через сокет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский