Привет у меня есть проблема, это остановило мой прогресс
Мне нужно, чтобы начать 200 секунд до 0 (обратный отсчет в заголовке), нажав на кнопку, у меня 48 кнопок, которые являются таймерами
На Google я нашел некоторые темы, но не знаю, как его использовать
timer_01.cpp:
__fastcall timer_01::timer_01(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
void __fastcall timer_01::Execute(TButton* buton)
{
if(buton->Caption=="Flash"){
for(int i=flash_time;i>0;i--){
buton->Caption=i;
Sleep(1000);
};
}
}
//---------------------------------------------------------------------------
и моя кнопка в main_program.cpp
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Execute(Button4);
}
и включить в main_program.cpp
#include "timer_01.h"
мой конструктор main_program.h я добавил:
void __fastcall Execute(TButton* buton);
Ваш код — абсолютно неправильный способ использования TThread
, Попробуйте что-то более похожее на это:
timer_01.h:
class timer_01 : public TThread
{
private:
TButton *fButton;
String fValue;
String __fastcall GetButtonCaption();
void __fastcall DoGetButtonCaption();
void __fastcall SetButtonCaption(const String &AValue);
void __fastcall DoSetButtonCaption();
protected:
void __fastcall Execute();
public:
__fastcall timer_01(TButton *AButton);
};
timer_01.cpp:
__fastcall timer_01::timer_01(TButton *AButton)
: TThread(true), fButton(AButton)
{
FreeOnTerminate = true;
}
void __fastcall timer_01::Execute()
{
if (GetButtonCaption() == "Flash")
{
for(int i = flash_time; (i > 0) && (!Terminated); --i)
{
SetButtonCaption(i);
if (!Terminated)
Sleep(1000);
}
}
}
String __fastcall timer_01::GetButtonCaption()
{
Synchronize(&DoGetButtonCaption);
return fValue;
}
void __fastcall timer_01::DoGetButtonCaption()
{
fValue = fButton->Caption;
}
void __fastcall timer_01::SetButtonCaption(const String &AValue)
{
fValue = AValue;
Synchronize(&DoSetButtonCaption);
}
void __fastcall timer_01::DoSetButtonCaption()
{
fButton->Caption = fValue;
}
main_program.cpp
#include "timer_01.h"
timer_01 *timer = NULL;
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if (timer)
{
timer->Terminate();
do
{
CheckSynchronize();
Sleep(10);
}
while (timer);
}
timer = new timer_01(Button4);
timer->OnTerminate = &TimerTerminated;
timer->Resume();
}
void __fastcall TForm1::TimerTerminated(TObject *Sender)
{
timer = NULL;
}
С учетом сказанного вам на самом деле не нужно TThread
за такой простой таймер. TTimer
будет работать так же хорошо:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Timer1->Interval = 1000;
Timer1->Tag = flash_time;
Timer1->Enabled = true;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (Timer1->Tag > 0)
{
Button4->Caption = Timer1->Tag;
Timer1->Tag = Timer1->Tag - 1;
}
else
Timer1->Enabled = false;
}
Других решений пока нет …