Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение зацикленного потока, Завершение зацикленного потока 
V
    Опции темы
MikhaelKreuz
Дата 7.9.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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();

Подскажите как убить поток,пожалуйста.
Спасибо.


PM MAIL   Вверх
_hunter
Дата 7.9.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 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...
PM ICQ   Вверх
Alexeis
Дата 7.9.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



  Сначала s1->Terminate(); , потом ждем завершения, потом закрываем программу.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ksili
Дата 7.9.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



А ты поток из основного окна сам убиваешь? delete я имею в виду есть после s1->Terminate(); 


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Lazin
Дата 7.9.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



ksili, Достаточно сделать потоку ->FreeOnTerminate = true

Добавлено через 24 секунды
и тогда delete не нужен
PM MAIL Skype GTalk   Вверх
ksili
Дата 7.9.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Я понимаю. Просто если он есть, ошибка может быть как раз из-за этого.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
MikhaelKreuz
Дата 7.9.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



Цитата

Сначала s1->Terminate(); , потом ждем завершения, потом закрываем программу.

Каким образом ждём?

Добавлено через 2 минуты и 6 секунд
Цитата

Достаточно сделать потоку ->FreeOnTerminate = true

Чтобы заработал  FreeOnTerminate = true нужно чтоб событие OnTeminate,вызванное Terminate произрошло,но я так понимаю до этого то как раз дело и доходит.
PM MAIL   Вверх
ksili
Дата 7.9.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Код

s1->WaitFor();



--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
MikhaelKreuz
Дата 7.9.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



Цитата

А ты поток из основного окна сам убиваешь? delete я имею в виду есть после s1->Terminate(); 

Если поток никак не убивать то он,ниче не писать в функции закрытия формы,то зачастую всё прекрасно завершается.Но не всегда.Я так предполагаю что мож быть касяк и в самой работе потока.Хотя не должно ж быть по логике.
delete после terminate попробовал,но безполезняк.

Добавлено через 2 минуты и 29 секунд
Цитата

s1->WaitFor();

нее никак
PM MAIL   Вверх
ksili
Дата 7.9.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Я делаю завершение так:
Код

             s1->Terminate();
             s1->WaitFor();

             delete s1;


FreeOnTerminate = true не устанавливаю



--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
MikhaelKreuz
Дата 7.9.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



мож прикол в том что я его создавал из под другого потока,которой в свою очередь,создавал из главной программы и который потом(после запуска этого потока) удалил при помощи Terminate

Добавлено через 2 минуты и 1 секунду
Цитата

 s1->Terminate();
s1->WaitFor();
 delete s1

не помогло
PM MAIL   Вверх
ksili
Дата 7.9.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Да пожалуй, удалять должен тот же, кто и создал
"Я тебя породил, я тебя и убью!!!"

Добавлено через 1 минуту и 39 секунд
вообще без кода трудно ещё что-то сказать. 
я ж не телепат, а даже экстрасенсы лечат по фотографии, а не вслепую


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
MikhaelKreuz
Дата 7.9.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



ща попробую представить код smile

Добавлено через 7 минут и 43 секунды
Вообщем в главной программе на кнопку "Пуск" вешаю начало процесса(запуск первого потока).
Код

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
mT=new mainT(false);
mT->Priority=tpNormal;
}

Этот поток выполняет процедуры initialyze();  start(); ID();потом смотрит какя вкладна выбрана на главной форме на ActivePage.И соответственно этому запускает нужный поток и сам завершает жинь самоубийством.
Код

void __fastcall mainT::Execute()
{
        try
  {
    while (!Terminated)
      Com();
 }
  catch (...)
 {
    // do something with exceptions
 }

}
//---------------------------------------------------------------------------
void __fastcall mainT::Com()
{
if (!init){
initialyze();}
       if (!startF){
       start();
       ID();
}
if (startF){
        if (Form1->PageControl1->ActivePageIndex==0){
                s01=new serv01(false);
                Terminate();
    }
}
}

А вот уже этот поток крутится постоянно.
Код

//---------------------------------------------------------------------------
void __fastcall serv01::Execute()
{
        try
  {
    while (!Terminated)
      service();

 }
  catch (...)
 {
    // do something with exceptions
 }

}
//---------------------------------------------------------------------------
void __fastcall serv01::service()
{
if (Form1->PageControl1->ActivePageIndex==0){

        if (!ready)
        exeserv();
        if (ready)
        ExecutePids();
}
}

PM MAIL   Вверх
ksili
Дата 7.9.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Так serv01 вообще нигде не уничтожается? Или где-то в exeserv() или ExecutePids() у него Terminate = true выставляется всё-таки?

Добавлено через 3 минуты и 9 секунд
Раз уж ты ни из под какого потока память вручную не освобождаешь поставь в обоих в самом начале Execute() строку FreeOnTerminate = true.

И я вообще не понимаю смысла создавать поток, который запускает другой поток и сразу же уничтожается. Ну и запускай сразу тот поток, который должен постоянно крутиться

Добавлено через 12 минут и 29 секунд
КСТАТИ!!!
Код

Form1->PageControl1->ActivePageIndex==0

Это ж обращение к VCL! Это надо запихивать в Synchronize. Я удивляюсь как у тебя вообще всё не висло


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
MikhaelKreuz
Дата 10.9.2007, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.9.2007

Репутация: нет
Всего: нет



для serv01 Terminate в true выставляется,только при определенных условиях,которые в свою очередь не желательны.
На счет зачем создавать поток чтоб из него запустить другой а потом уничтожить.Этот поток - это установка связи с вннешним устройством.Когда связь устанавл.его удаляем и запускаем другой для обмена байтами.Если связь теряется,то текущий поток  убивается а тот первый опять осздается.В итоге в любой момент времени работает тока один поток,выполняющуй определенный вид коммуникации с внешним устройством.
Я пробовал всё сделать в обном потоке,но тогда процесс забирает много процессора(до 70%),но форма не висит.Когда делаешь в основном потоке формы,то вообще форма висит и процессор занят весь.
В моём же случае ресурсов забирается поминимуму(04%процессора и памяти немножко) и форма не висит.Я так понимаю что немного накуралесил,но ведь главное результат.Всё работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.