![]() |
|
|
![]()
|
|
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
ну, это не ты прогнал, а я. если ты закрываешь главную форму(т.е. приложение после этого завершается), то можешь, в принципе, вообще не беспокоиться о потоках - система грохнет все, что было порождено твоим процессом. но по правилам хорошего тона - завершать нужно. и мало того - еще и подождать в основном потоке завершения остальных. чет ты опять наворотил...
зачем ты тут флаг в цикле выставляешь, если он является механизмом внешнего воздействия на поток? |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Ну вот, только пометил, что вопрос решенный
Здесь я ставлю флаг, что бы после выполнения цикла (for) и при первом заходе сюда программа останавливалась на цикле (do... while). Вот и у меня получается, что при создании формы потоки создаются и крутятся на цикле (do... while) и ждут, когда флаг FlagQuit будет false. После этого выполняется цикл (for) и если во время выполнения, флаг FlagQuit будет принудительно сброшен в true то он снова перейдет на цикл (do... while) и все пойдет сначала. Если цикл (for) дойдет до своего конца, то что бы снова уйти в паузу, как раз и нужна эта команда FlagQuit = true. если есть более рациональное решение, то прошу пример в студию -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
||||
|
||||
| Vyacheslav |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Угу Вообще - то Я бы не стал так делать. Terminate не завершает насильно нитку подобно TerminateThread, а лишь устанавливает Terminated в true. Так что, вызов Terminate() не гарантирует, что поток завершится. Задержка может быть вызвана либо ошибкой программиста( не удосужился в Execute установить проверку флага Terminated ), либо потому, что время между проверками относительно длительное. Последнее не очень страшно, если приложение должно продолжить работу после завершения нитки и тогда FreeOnTerminate к месту, но ... если приложенин должно тут же завершиться, то могут (не обязательно, но всетаки возможно) возникнуть проблемы. Я бы на твоем месте поступил бы следующим образом . Установил бы FreeOnTerminate=false и уничтожал бы так
И еще одно. Почему не используешь внутрение средства для временной отстановки нитки Ведь вот это все
и этого
просто можно заменить одно строчкой
и нитка замрет Правда в код по уничтожению ниток придется ввести еще проверку
-------------------- С уважением, Вячеслав Ермолаев |
||||||||||
|
|||||||||||
| Bima |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
я сначала пробовал этот метод, но загвостка в том, что он ПРИОСТАНАВЛИВАЕТ поток, а потом командой m_Download[0]->Resume() его продолжает с того места откуда он остановился. А мне нужно что бы поток сбросился (но не убился) и потом его снова возобновить С НАЧАЛА. Я уже подумываю, что может лучше будет каждый раз убивать потоки и потом их снова создавать, а то инструкция:
меня сильно настораживает. Вроде как бы программа в это время не должна работать, а она постоянно отрабатыват циклы задержки (sleep) с проверкой на флаг. Что лучше в этом случае, постоянно создавать и убивать потоки или использовать цикл задержки (sleep) ???
Vyacheslav проясни еще один момент. А если поток ушел в длительную обработку информации (не как у меня в примере), допустим команда в потоке ждет информацию от устройства, а устройство умерло. Что в этом случае произойдет, при уничтожении потока, программа будет ждать пока завершиться Execute??? Я вот про это место пишу:
Я правильно помнимаю, что в этом случае, поток вообще не завершиться или нет??? -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||||||
|
|||||||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Совершенно верно.
Что бы насильно завершить поток нужно использовать АPI-шную функцию. Если это тебе нужно то в твоем MyThred напиши еще один метод Примерно так
Этот точно должен грохнуть нитку -------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Vyacheslav
а как Handle потока получить? и что передавать в exitCode??? на реальном примере как это написать??? -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Его не надо получать
exitCode - просто код возврата, что бы потом можно проанализировать с каким кодом завершился тред Если код не интересут, то
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
У меня ошибку при компиляции выдает:
[C++ Error] kod.cpp(73): E2227 Extra parameter in call to _fastcall MyTread::TerminateThread() Вроде везде все правильно объявил функцию.... даже вначале прописал: #include "winbase.h" почему не выходит не пойму -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
не выходит
ругается на ноль в конце: [C++ Error] kod.cpp(73): E2034 Cannot convert 'const unsigned int' to 'void *' -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Все заработало. Vyacheslav, спасибо за подсказки и за реализацию кода.
Vyacheslav скажи, а зачем в последнем топике нужно было приостанавливать поток???
Как я понимаю, здесь нужно именно убить поток, а если он не приостановится???? так и будет висеть в команде Suspend??? -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Приостановится он всегда. А приостановить его стоит для того, что бы не словить исключение при его уничтожении из-за того, что в момент уничтожения он продолжает крутится. Хотя вполне возможно TerminateThread сама предварительно перед уничтожением приостанавлиавент егою
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
всем спасибо. тема закрыта
-------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |