![]() |
|
|
![]()
|
|
| MikhaelKreuz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Здравствуйте.У меня тут такой вопросик.Крутится у меня поток,делает своё дело.Создавал я его побилдеровски,классами.Так вот када приложение хочу закрыть начинается ругань типа "Access Violation.....". НО,не всегда!Зачастую всё закрывается прекрасно,память освобождается и т.д.
Поток зациклен следующим: void __fastcall serv01::Execute() { try { while (!Terminated) service(); } catch (...) { // do something with exceptions } } Я так понимаю понимаю дожидатся завершения потока бесполезно,т.к. он должен всегда крутиться (мне так надо).Я пробовал при закрытии формы его затормозить,а потом убить: //до конструктора serv01 *s1; (serv01- поток мой) .......... //на закрытие формы s1->Suspend(); s1->Terminate(); Подскажите как убить поток,пожалуйста. Спасибо. |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
Это:
s1->Terminate(); после этого: s1->Suspend(); не вызовется... учим мат-часть: http://forum.vingrad.ru/forum/topic-60076.html -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Сначала s1->Terminate(); , потом ждем завершения, потом закрываем программу.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
А ты поток из основного окна сам убиваешь? delete я имею в виду есть после s1->Terminate();
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
ksili, Достаточно сделать потоку ->FreeOnTerminate = true
Добавлено через 24 секунды и тогда delete не нужен |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Я понимаю. Просто если он есть, ошибка может быть как раз из-за этого.
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| MikhaelKreuz |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Каким образом ждём? Добавлено через 2 минуты и 6 секунд
Чтобы заработал FreeOnTerminate = true нужно чтоб событие OnTeminate,вызванное Terminate произрошло,но я так понимаю до этого то как раз дело и доходит. |
||||
|
|||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| MikhaelKreuz |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Если поток никак не убивать то он,ниче не писать в функции закрытия формы,то зачастую всё прекрасно завершается.Но не всегда.Я так предполагаю что мож быть касяк и в самой работе потока.Хотя не должно ж быть по логике. delete после terminate попробовал,но безполезняк. Добавлено через 2 минуты и 29 секунд
нее никак |
||||
|
|||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Я делаю завершение так:
FreeOnTerminate = true не устанавливаю -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| MikhaelKreuz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
мож прикол в том что я его создавал из под другого потока,которой в свою очередь,создавал из главной программы и который потом(после запуска этого потока) удалил при помощи Terminate
Добавлено через 2 минуты и 1 секунду
не помогло |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Да пожалуй, удалять должен тот же, кто и создал
"Я тебя породил, я тебя и убью!!!" Добавлено через 1 минуту и 39 секунд вообще без кода трудно ещё что-то сказать. я ж не телепат, а даже экстрасенсы лечат по фотографии, а не вслепую -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| MikhaelKreuz |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
ща попробую представить код
Добавлено через 7 минут и 43 секунды Вообщем в главной программе на кнопку "Пуск" вешаю начало процесса(запуск первого потока).
Этот поток выполняет процедуры initialyze(); start(); ID();потом смотрит какя вкладна выбрана на главной форме на ActivePage.И соответственно этому запускает нужный поток и сам завершает жинь самоубийством.
А вот уже этот поток крутится постоянно.
|
||||||
|
|||||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Так serv01 вообще нигде не уничтожается? Или где-то в exeserv() или ExecutePids() у него Terminate = true выставляется всё-таки?
Добавлено через 3 минуты и 9 секунд Раз уж ты ни из под какого потока память вручную не освобождаешь поставь в обоих в самом начале Execute() строку FreeOnTerminate = true. И я вообще не понимаю смысла создавать поток, который запускает другой поток и сразу же уничтожается. Ну и запускай сразу тот поток, который должен постоянно крутиться Добавлено через 12 минут и 29 секунд КСТАТИ!!!
Это ж обращение к VCL! Это надо запихивать в Synchronize. Я удивляюсь как у тебя вообще всё не висло -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| MikhaelKreuz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
для serv01 Terminate в true выставляется,только при определенных условиях,которые в свою очередь не желательны.
На счет зачем создавать поток чтоб из него запустить другой а потом уничтожить.Этот поток - это установка связи с вннешним устройством.Когда связь устанавл.его удаляем и запускаем другой для обмена байтами.Если связь теряется,то текущий поток убивается а тот первый опять осздается.В итоге в любой момент времени работает тока один поток,выполняющуй определенный вид коммуникации с внешним устройством. Я пробовал всё сделать в обном потоке,но тогда процесс забирает много процессора(до 70%),но форма не висит.Когда делаешь в основном потоке формы,то вообще форма висит и процессор занят весь. В моём же случае ресурсов забирается поминимуму(04%процессора и памяти немножко) и форма не висит.Я так понимаю что немного накуралесил,но ведь главное результат.Всё работает. |
|||
|
||||
![]()
|
| Правила форума "С++ 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. |