Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TThread: удалять ли указатель на объект потока? 
V
    Опции темы
Alca
Дата 17.3.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



TThread: удалять ли указатель на объект потока? (C++Builder 6.0)
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "uCXThread.h"

//#include "Units\..."
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TfrmMain *frmMain;
const int MAX_THREADS = 4;
CXThread *pT[4];
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner) {

}
//---------------------------------------------------------------------------
__fastcall TfrmMain::~TfrmMain() {
    //>>>>>>>>> надо ли такое делать???? <<<<<<<<<<<
    for (int i = 0; i < MAX_THREADS; i ++) {
        //pT[i]->WaitFor();
        if (NULL != pT[i]) {
            delete pT[i];  pT[i] = NULL;
        }
    }

    /*LOG*/Memo1->Lines->Add("--- Деструктор ~TfrmMain ---");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnRunClick(TObject *Sender) {
    Memo1->Clear();

    for (int i = 0; i < MAX_THREADS; i ++) {
        pT[i] = new CXThread(true);
        pT[i]->iThreadIndex    = i;
        pT[i]->FreeOnTerminate = true;
        pT[i]->Resume();
    }

    /*LOG*/Memo1->Lines->Add("--- Треды запущены ---");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnTerminateClick(TObject *Sender) {
    for (int i = 0; i < MAX_THREADS; i ++) {
        if (NULL != pT[i]) {
            if (pT[i]->Suspended) {pT[i]->Resume();}

            pT[i]->Terminate();
        }
    }

    /*LOG*/Memo1->Lines->Add("--- Треды уничтожаются ---");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnSuspendClick(TObject *Sender) {
    for (int i = 0; i < MAX_THREADS; i ++) {
        if (NULL != pT[i]) {
            pT[i]->Suspend();
        }
    }

    /*LOG*/Memo1->Lines->Add("--- Треды приостановлены ---");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnResumeClick(TObject *Sender) {
    for (int i = 0; i < MAX_THREADS; i ++) {
        if (NULL != pT[i]) {
            pT[i]->Resume();
        }
    }

    /*LOG*/Memo1->Lines->Add("--- Треды возобновлены ---");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnExitClick(TObject *Sender) {
    Close();
}
//---------------------------------------------------------------------------


Это сообщение отредактировал(а) Alca - 17.3.2009, 13:03


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


Эксперт
****


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

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



Удалять

Только ещё их в конструкторе формы следует заNULLить

Добавлено через 1 минуту и 18 секунд
попробуй включить Code Guard и посмотри, выскочит ли его сообщение, если не освобождать эти указатели


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


Эксперт
****


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

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



Жму кнопки "btnRun" -> "btnTerminate" -> "btnExit", получаю:
Код

Access violation at address 00000000. Read of address 00000000.



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


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


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

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



Alca, в принципе в деструкторе формы можно и не удалять - если потоки будут жить всю программу. VCL сама все подчистит. Система поможет. 
Другое дело что они тебе не нужны- память выделена, прога работает - здесь уже могут быть утечки памяти.

Добавлено через 5 минут и 22 секунды
Покажи реализацию метода Execute() для потоков
PM MAIL   Вверх
Alca
Дата 17.3.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Чищу вручную:
Код

void __fastcall TfrmMain::btnDeletePointersClick(TObject *Sender) {
    //надо ли такое делать????
    for (int i = 0; i < MAX_THREADS; i ++) {
        //pT[i]->WaitFor();
        if (NULL != pT[i]) {
            delete pT[i];  pT[i] = NULL;
        }
    }
}

Результат:
Код

Access violation at address 00000000. Read of address 00000000.


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

Покажи реализацию метода Execute() для потоков

Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "uCXThread.h"
#include "Unit1.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall CXThread::CXThread(bool CreateSuspended) : TThread(CreateSuspended) {

}
__fastcall CXThread::~CXThread() {
   Synchronize(UpdateMemo2);
}
//---------------------------------------------------------------------------
void __fastcall CXThread::Execute() {
    for (;;) {
        if (this->Terminated) {
            break;
        }
        Sleep(150);
        
        Synchronize(UpdateMemo);
    }

}
//---------------------------------------------------------------------------
void __fastcall CXThread::UpdateMemo() {
    frmMain->Memo1->Lines->Add("Работает поток_" + IntToStr(iThreadIndex));
}
//---------------------------------------------------------------------------
void __fastcall CXThread::UpdateMemo2() {
    frmMain->Memo1->Lines->Add("Деструктор потока_" + IntToStr(iThreadIndex));
}
//---------------------------------------------------------------------------



Это сообщение отредактировал(а) Alca - 17.3.2009, 13:21


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


Эксперт
****


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

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



непонятно как может быть ноль, если проверяешь на не-ноль


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


Эксперт
****


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

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



Вот исходники

Добавлено через 2 минуты и 15 секунд
Валиться на:
Код

delete pT[i];


Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  Project.Test.template.zip 4,24 Kb


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


Эксперт
****


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

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



сейчас у меня нету под рукой Билдера. Но ты скажи всё-таки, на какой строке ошибка? 

И ты так и не инициализируешь указатели нулями, как я писал.


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


Эксперт
****


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

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



Цитата

И ты так и не инициализируешь указатели нулями, как я писал.

Код

//---------------------------------------------------------------------------
TfrmMain *frmMain;
const int MAX_THREADS = 4;
CXThread *pT[4];
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner) {
    for (int i = 0; i < MAX_THREADS; i ++) {
        pT[i] = NULL;
    }
}
//---------------------------------------------------------------------------



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


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


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

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



Цитата(Alca @  17.3.2009,  13:28 Найти цитируемый пост)
Валиться на:

а потоки при этом работают?
PM MAIL   Вверх
Alca
Дата 17.3.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот лог с Memo:
Код

--- Треды запущены ---
Работает поток_3
Работает поток_0
Работает поток_1
Работает поток_2
Работает поток_2
Работает поток_1
Работает поток_0
Работает поток_3
--- Треды уничтожаются ---
Работает поток_3
Работает поток_0
Работает поток_1
Работает поток_2
Деструктор потока_2
Деструктор потока_1
Деструктор потока_0
Деструктор потока_3
здесь вываливаеться мсжбокс "Access violation at address 00000000. Read of address 00000000."


Добавлено @ 13:38
Цитата

а потоки при этом работают?

В таскменеджере 1 поток (до терминейта было 5)

Это сообщение отредактировал(а) Alca - 17.3.2009, 13:39


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


Эксперт
****


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

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



валится всегда после 4-го деструктора? или бывает раньше?


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


Эксперт
****


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

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



Цитата

Валится всегда после 4-го деструктора? или бывает раньше?

Всегда на 1-ом 

Это сообщение отредактировал(а) Alca - 17.3.2009, 13:49


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


Эксперт
****


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

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



Цитата(Alca @  17.3.2009,  17:48 Найти цитируемый пост)
Всегда на 1-ом 

у тебя же в логе - на 4-ом...


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


Эксперт
****


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

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



Цитата

у тебя же в логе - на 4-ом...

Код

Вот лог с Memo:Код

--- Треды запущены ---
Работает поток_3
Работает поток_0
Работает поток_1
Работает поток_2
Работает поток_2
Работает поток_1
Работает поток_0
Работает поток_3
--- Треды уничтожаются ---
Работает поток_3
Работает поток_0
Работает поток_1
Работает поток_2
Деструктор потока_2
Деструктор потока_1
Деструктор потока_0
Деструктор потока_3

Дальше жму кнопку "btnDeletePointers" 
и дальше вываливаеться мсжбокс "Access violation at address 00000000. Read of address 00000000."
и валиться на 1-ом делете




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


--------------------
PM WWW ICQ Skype Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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