Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TThread: как узнать что поток унижтожен? 
:(
    Опции темы
Alca
Дата 18.3.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



TThread: как узнать что поток уничтожен?
Метод Terminated закрытый  smile 
Код

protected:
    __property bool Terminated = {read=FTerminated, nodefault};



--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 18.3.2009, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



с помощью Wait*** функции
PM MAIL Skype GTalk   Вверх
Anikmar
Дата 18.3.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

TThread: как узнать что поток уничтожен?
Метод Terminated закрытый   


Оберните Tthread своим классом - и получите доступ к полю
PM MAIL ICQ   Вверх
Alca
Дата 18.3.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Мне надо что-то вроде этого:
Код

//...
m_pMainThread->FreeOnTerminate = true; 
//...
void __fastcall TfrmMain::btnTerminateClick(TObject *Sender) {
    if (false == m_pMainThread->Terminated) {
        m_pMainThread->Terminate();
    }
}


Это сообщение отредактировал(а) Alca - 18.3.2009, 17:05


--------------------
PM WWW ICQ Skype Jabber   Вверх
Anikmar
Дата 18.3.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну и создайте свой класс:

Код

class MyTThread : public TThread
{
public:
bool GetTerminated(void) { return Terminated; };
};

И уже проверяйте у себя так:
Код

//...
m_pMainThread->FreeOnTerminate = true; 
//...
void __fastcall TfrmMain::btnTerminateClick(TObject *Sender) {
    if (!m_pMainThread->GetTerminated()) {
        m_pMainThread->Terminate();
    }
}


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Anikmar, скорее всего из этого ничего не выйдет. Terminate() и Terminated служат для безболезненного завершения потока. Т.е. Terminate() сама по себе ничего не делает, кроме как взводит флаг Terminated. А Terminated используется в главной функции (Execute):
Код

...
TStringList *mylist;
TMemoryStream *mystream;
mylist = new TStringList();
... // бла бла
if(Terminated)
{
  mylist->Free();
  // ещё что-нибудь делаем
  return; // завершаем работу
}
mystream = TMemoryStream();
... // бла бла
if(Terminated)
{
  mylist->Free();
  mystream->Free();
  // ещё что-нибудь делаем
  return; // завершаем работу
}
// бла бла
mylist->Free();
mystream->Free();


ЗЫ покрайней мере, об этом писалось в книге...


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
mrbrooks
Дата 19.3.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Все это частности. Самый дельный ответ дал как всегда Lazin
Тем более у TThread есть свой метод WaitFor() - ожидающий прекращения потока.
PM MAIL   Вверх
Alca
Дата 19.3.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Тем более у TThread есть свой метод WaitFor() - ожидающий прекращения потока.

Куда его втулить? smile 

Это сообщение отредактировал(а) Alca - 19.3.2009, 10:26


--------------------
PM WWW ICQ Skype Jabber   Вверх
ksili
Дата 19.3.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Alca, по-моему класс TThread напрямую не используют, надо делать свой класс-наследник от TThread.
Код

MyThread->Terminate();
MyThread->WaitFor();   // ждем пока не завершится поток
.....
// работаем дальше



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


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(Alca @  19.3.2009,  10:24 Найти цитируемый пост)
Куда его втулить?

в хелпе к 2009 есть пример  smile 
Цитата(ksili @  19.3.2009,  10:42 Найти цитируемый пост)
Alca, по-моему класс TThread напрямую не используют, надо делать свой класс-наследник от TThread.

с этим никто не спорит.


Цитата(ksili @  19.3.2009,  10:42 Найти цитируемый пост)
Выделить всёкод C++ Builder    
MyThread->Terminate();
MyThread->WaitFor();   // ждем пока не завершится поток
.....
// работаем дальше

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


Эксперт
****


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

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



Код

Alca, по-моему класс TThread напрямую не используют, надо делать свой класс-наследник от TThread.

Я так и сделал.

Добавлено через 34 секунды
Код

class CMainThread: public TThread {


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

Цитата(ksili @  19.3.2009,  10:42 )
Код

MyThread->Terminate();
MyThread->WaitFor();   // ждем пока не завершится поток
.....
// работаем дальше

так делать нельзя.

Чего?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 19.3.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alca @  19.3.2009,  10:24 Найти цитируемый пост)
Куда его втулить?

я не в курсе как там это сделано в TThread
вот обычный паттерн
  • - запускаем поток
  • - ...
  • - говорим потоку что пора-бы и завершиться
  • - ждем пока завершится
Код

volatile LONG run_ = 1;

unsigned thread_fn(void*)
{
  while( InterlockedCompareExchange(&run_, 0, 0) )
  {
    ..do work.. 
  }
}


int main()
{
   DWORD threadid = 0;
   HANDLE hthread = (HANDLE)_beginthreadex(NULL, 0, &thread_fn, NULL, 0, &threadid );
   ...do work
   InterlockedExchange(&run_, 0);//сообщаем потоку о том, что нужно завершиться
   //ждем завершения потока
   DWORD wresult = WaitForSingleObject(hthread, 10000);
   if (wresult != WAIT_OBJECT_0)
   {
      std::cerr << "thread dedlocked" << std::endl;
   } 
   else
   {
      std::cout << "поток нормально остановлен" << std::endl;
   }
}

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


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(Alca @  19.3.2009,  10:46 Найти цитируемый пост)
Чего? 


сначало вызов Terminate():
затем WaitFor();

блин смотрите хелп!

Добавлено через 8 минут и 51 секунду
Цитата(Lazin @  19.3.2009,  10:56 Найти цитируемый пост)
я не в курсе как там это сделано в TThread

как всегда несколько проще

Код

volatile long flag;
void __fastcall Thread::Execute()
{
 while (!flag)
 {
    Synchronize(Work);
    Sleep(100);
 }
 flag = 0;
}
void __fastcall Thread::WaitStop()
{
  InterlockedIncrement(&flag);
  this->WaitFor();
}

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


Эксперт
****


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

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



Цитата

сначало вызов Terminate():
затем WaitFor();

А если поток уже отработал, то:
Код

System Error.  Code: 6.
Неверный дескриптор.






--------------------
PM WWW ICQ Skype Jabber   Вверх
mrbrooks
Дата 19.3.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(Alca @  19.3.2009,  12:34 Найти цитируемый пост)
А если поток уже отработал, то:

разумеется. я же писал - так делать нельзя. тут уже надо определиться - либо рубим поток через Terminate(), либо ждем пока он сам завершится через WaitFor() - вместе эти два метода не используются.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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