![]() |
|
|
![]()
|
|
| Bima |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Взял пример для реализации потока. Я переделал его под 3 потока, но не могу остановить потоки, когда они запущены.
вот пример:
Заголовочный файл:
на форме 4 кнопки и 3 лайбела. первые три кнопки запускают потоки, 4 кнопкой я пытаюсь их все остановить. Как мне сделать, что бы это все выполнялось правильно??? -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||
|
|||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Слушай, я в билдере не очень силен, но ты почитай темы сперва про потоки в разделе API, там очень много про это. А что касательно твоего кода, то вообще то ты знаешь, что обозначает флаг MDownload[0]->FlagExit(true);? Ты ведь для каждого потока его вызываешь при создании формы, а затем я так понял и по кнопке 4. То есть ты его сперва останавливаешь, а потом ещё раз? Может ты знаешь про потоки больше меня, может нет, но все таки ты должен знать, что поток - это отдельня фукнция, в которой ты и работаешь, когда ты говоришь о выходе из потока, ты просто выходишь из этой функции, обратного захода без порождения нового потока нету. Вообще-то дождись конечно билдеристов, но пока тебе не помогли, почитай раздел форума по API и используй прямо от туда все API - билдер ведь их поддерживает по умолчанию, а уже потом начинай со временем применять билдеровские классы. мне кажется, так будет проще. Да, кстати, хорошо описано в Мешков, Тихомиров книга про MFC, не раз в форуме упоминалась, точное название не помню(давно уже ничего толком не программировал, книга эта настольная была всегда)
удачи -------------------- я не гольфист - я хоккеист |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Вначале я вызываю эту функцию MDownload[i]->FlagExit(true) для того, что бы поток не запустился сразу и инициализирую переменную FlagQuit для каждого потока.
А потом запускаю поток командой MDownload[i]->Resume(); Причем, если я нажимаю несколько раз на первую кнопку, то столько раз запускается первый поток. но пока поток работает, я остановить его не могу Это сообщение отредактировал(а) Bima - 7.12.2006, 08:42 -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
достаточно того, что ты создаешь с флагом CreateSuspended. так чуть правильней:
|
||||
|
|||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
вот переделанный код:
потоки работают нормально, претензий нет, но при нажатии на кнопку 4 (процедура Button4Click), я не могу остановить потоки... счетчики работают -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
кстати, а чем тебе не угодило свойство Terminated из TThread? - его вполне достаточно. зачем тебе FlagQuit твой? |
|||
|
||||
| Bima |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Этот код тоже не работает!!!
если я пишу в коде на 4 кнопке следущее:
то после нажатия на нее (все потоки предварительно запустил), происходит останавливание 3 потока, но при повторном запуске его (нажать на кнопку 3) выскакивает ошибка! -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||||
|
|||||||
| GL_basik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 5.9.2006 Репутация: нет Всего: нет |
Terminate будет работать если установить в процедуре execute пердусмотреть выход по свойтву Terminated. Например
Поток завершается только тогда, когда прекращается выполнение Execute. Кроме того есть жесткое завршние потока с помощью API функции TerminateThread. Что касается ошибки. То уствнови свойство FreeOnTerminate=false. Иначе для повторного запуска поток нужно завново инициальзировать. Только не забудь очистить память, после завершния прораммы. Это сообщение отредактировал(а) GL_basik - 7.12.2006, 10:54 |
|||
|
||||
| Bima |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Переписывание цикла "до".... ничего не даст, так как программа туда заходит только один раз при инициализации, потом она туда не заходит. Ставил там breakPoint и проверял. почему это происходит не знаю Terminate завершает поток, отсюда и ошибка выскакивает, так как я пытаюсь использовать поток, который завершился.
пытался я так делать, но в этом случае поток все равно завершается, и не запускается, хотя в этом случае ошибку не выдает. Хотя так и должно быть, так как поток завершен, в памяти он остался, но не запущен. пока задача не решена Добавлено @ 10:58 Что бы было понятнее, я напишу, что я хочу сделать. Есть программа в которой есть несколько задач. Эти задачи могут выполнятся длительное время и они должны выполнятся параллельно. По истечении определенного времени(TimeOut), если задача не выполнена, задача должна быть завершена (Это реализуется легко, если знать, как корректно завершить задачу). Есть еще одно условие в програме - задачи должны через определенное время перезапускаться. Из всего написаного я сделал вывод, что нужно использовать потоки, которые будут запускаться по таймеру. Постоянно создовать потоки нет смысла и выгружать их из памяти тоже, поэтому я решил, что лучше создать все потоки при создании программы и убить их все во время завершения программы. Для эмуляции задачи написал простой счетчик (см. код программы), который хочу остановить по нажатию кнопки. Дальше при реализации завершения потока быду вставлять таймеры и двигаться от простого к сложному. Вот вроде и вся реализация, которою я надумал. -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||
|
|||||
| GL_basik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 5.9.2006 Репутация: нет Всего: нет |
Судя по приведенному коду, после инициализации она уходит в цикл с параметром и естественно проверки условия завершния не происходит. Пока не завершится этот цикл. |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
что разве в этом коде нет проверки условия?
я думал, что после выполнения коменд внутри цикла (Synchronize и Sleep) управление передается на проверку условия (достигло ли i значения 1000 и нет ли флагов FlagQuit, Terminated) или я не прав??? -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
Bima,
фор надо было так сделать:
а если тебе нужно притормаживать потоки с возможностью их продолжения, то так и надо было говорить. в таком случае тебе нельзя выходить из Execute. для приостановки пользоваться либо Suspend(тут торможение происходит в любом месте цикла, что зачастую неприемлимо), либо доп.флагом. например так:
|
||||
|
|||||
| Bima |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Виноват, прогнал dumb спасибо за подсказку. Реализовал я примерно так, как ты написал. Вроде работает так как я хотел. Вот код:
Остался последний вопрос. я при закрытии формы убиваю потоки так:
Стоит ли это делать? Вроде я поставил FreeOnTerminate=true, но все равно сомневаюсь, освободится ли память после потоков или нет? -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||||
|
|||||||
| GL_basik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 5.9.2006 Репутация: нет Всего: нет |
Память после потоков освободится. Я проверял. Это нормальное завершение потока. При выходе из процедуры Execute, объект уничтожается. |
|||
|
||||
| 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. |