Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с потоком(TThread) 
:(
    Опции темы
Бегемот
Дата 25.2.2013, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

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



Здравствуйте!
Есть поток, который запускается нажатием кнопки. В потоке производится отсчет времени. Индикация производится через Synchronize.
Все работает, но только один раз. Почему поток не запускается повторно?

Код

// main.cpp
#include "main.h"
#include "TimerThread.h"
Timer *TimerThr1 = new Timer(true); 
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TimerThr1->Priority = tpNormal;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Tmr1=StrToInt(Edit3->Text);// длительность паузы
    TimerThr1->Resume();
    //TimerThr1->Start();
}
//---------------------------------------------------------------------------


Код

//TimerThread.cpp
#include "TimerThread.h"
#include "main.h"

int tmBeg=0;
int tmCur=0;
//---------------------------------------------------------------------------
__fastcall Timer::Timer(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}

//---------------------------------------------------------------------------
void __fastcall Timer::Execute()
{
    FreeOnTerminate = true;
    tmBeg = Ticks();
    while(1)
    {
        tmCur = Ticks();
        if((tmCur-tmBeg) < Form1->Tmr1)
        {
            Synchronize(sinc);
        }
        else if(Terminated) break;
    }
    tmCur=0;
    tmBeg=0;
}
//---------------------------------------------------------------------------
void __fastcall Timer::sinc()
{
    Form1->Label1->Caption =IntToStr(tmCur-tmBeg);
    Application->ProcessMessages();
}

PM MAIL   Вверх
Dem_max
Дата 26.2.2013, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Дык ты поток уничтожил строкой FreeOnTerminate = true;

Его поэтому нужно заного создавать.

НА почитай чтобы понимал что делаешь
http://rxlib.ru/WinLesson/bles2_1.htm

Это сообщение отредактировал(а) Dem_max - 26.2.2013, 03:43


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Бегемот
Дата 26.2.2013, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

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



Dem_max, убрал строку...
Код

FreeOnTerminate = true;


В FormCreate дописал...
Код

TimerThr1->FreeOnTerminate = false;


Это проблему не решило. Поток запускается один раз
PM MAIL   Вверх
Dem_max
Дата 26.2.2013, 04:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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





ДА еще Timer *TimerThr1 = new Timer(true);  перенеси в 

Код

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}


Цитата

В FormCreate дописал...

Нахрена ????


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Бегемот
Дата 26.2.2013, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

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



Перенос ничего не дал.

Дописал, что бы память не освобождалась после завершения потока. Хотя хоть пиши, хоть не пиши, поток выполняется все равно один раз!
PM MAIL   Вверх
Dem_max
Дата 26.2.2013, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ну где итоговый код ???


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Бегемот
Дата 26.2.2013, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

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



Код

// main.cpp
#include "main.h"
#include "TimerThread.h"
Timer *TimerThr1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    TimerThr1 = new Timer(true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TimerThr1->Priority = tpNormal;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Tmr1=StrToInt(Edit3->Text);// длительность паузы
    TimerThr1->Resume();
    //TimerThr1->Start();
}
//---------------------------------------------------------------------------


Код

//TimerThread.cpp
#include "TimerThread.h"
#include "main.h"
int tmBeg=0;
int tmCur=0;
//---------------------------------------------------------------------------
__fastcall Timer::Timer(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall Timer::Execute()
{
    tmBeg = Ticks();
    while(1)
    {
        tmCur = Ticks();
        if((tmCur-tmBeg) < Form1->Tmr1)
        {
            Synchronize(sinc);
        }
        else break;
    }
    tmCur=0;
    tmBeg=0;
}
//---------------------------------------------------------------------------
void __fastcall Timer::sinc()
{
    Form1->Label1->Caption =IntToStr(tmCur-tmBeg);
    Application->ProcessMessages();
}

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


Эксперт
****


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

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



Суть в том, что после того как поток отработал, его уже нельзя использовать повторно. Нужно сначала удалить его (не важно как: через delete или через FreeOnTerminate = true), а потом создать заного. Т.е. как-то так:
Код

// main.cpp
#include "main.h"
#include "TimerThread.h"
Timer *TimerThr1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TimerThr1 = new Timer(true);
    TimerThr1->FreeOnTerminate = true;
    TimerThr1->Priority = tpNormal;
    Tmr1 = StrToInt(Edit3->Text); // длительность паузы
    TimerThr1->Resume();
}
//---------------------------------------------------------------------------

Единственное, в этом случае, каждый раз при нажатии на кнопку будет создавться новый поток. Если вас это не устраивает, то нужно предусмотреть механизм, который будет следить за тем, был ли уже создан поток или нет.

Это сообщение отредактировал(а) artsb - 26.2.2013, 07:54


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

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



artsb, спасибо! Вы мне помогли! Поток у меня "самодостаточен" и для меня не критично, что всякий раз это новый поток, главное, что бы исполнялся его код.
Но! Возникает вопрос: как может быть полезна FreeOnTerminate = false? Если я правильно понял, в данном случае поток не завершается, но и не выполняется вновь. 
И еще... delete TimerThr1 и FreeOnTerminate = true - равнозначны?
PM MAIL   Вверх
artsb
Дата 26.2.2013, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Бегемот @  26.2.2013,  08:05 Найти цитируемый пост)
как может быть полезна FreeOnTerminate = false? Если я правильно понял, в данном случае поток не завершается, но и не выполняется вновь. 

По умолчанию, FreeOnTerminate = false. Это просто означает, что после завершения выполнения функции Execute, поток не будет сам себя уничтожать. Иначе - будет.

Цитата(Бегемот @  26.2.2013,  08:05 Найти цитируемый пост)
И еще... delete TimerThr1 и FreeOnTerminate = true - равнозначны? 

По сути, да. delete - это вы сами удаляете объект потока в какой-то момент. FreeOnTerminate = true - означает, что после завершения Execute() поток сам себя уничтожит.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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