|
39 У меня в программе цикл, пока он работает никакие внешние действия не обрабатываются, хотелось бы сделать возможность выхода из цикла во время его работы. Как можно это сделать?
Посмотри \Examples\Apps\Threads и вот ещё:
Создайте новое приложение: Форма, три Button и один Label.
Добавьте нужный код:
-= BEGIN UNIT1.CPP =-
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
pThread->Terminate(); // Остановка.
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
pThread->Suspend(); // Пауза.
}
void __fastcall TBorm1::Button3Click(TObject *Sender)
{
pThread->Resume(); // Продолжение.
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Создать поток (не приостановленный режим):
pThread = new TCheckThread(FALSE);
pThread->AssignLabel(Label1);
}
-= END UNIT1.CPP =-
-= BEGIN UNIT1.H =-
#ifndef Unit1H
#define Unit1H
#include <vcl\Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>
#include "Unit2.h"
class TForm1 : public TForm
{
__published:// IDE-managed Components
TLabel *Label1;
TButton *Button1;
TButton *Button2;
TButton *Button3;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
TCheckThread *pThread; // Указатель на поток.
public: // User declarations
virtual __fastcall TForm1(TComponent* Owner);
};
extern TForm1 *Form1;
#endif
-= END UNIT1.H =-
Выбирите File->New...->Thread Object
В Class Name введите: TCheckThread
Потоковый класс, сгенерированный мастером, описан весьма полно. Он ничего не
делает, но готов к работе. Чтобы он что-то делал, Вам нужно написать код в
методе Execute. Добавьте нужный код:
-= BEGIN UNIT2.CPP =-
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit2.h"
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall TCheckThread::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
__fastcall TCheckThread::TCheckThread(bool CreateSuspended)
: TThread(CreateSuspended) // Конструктор класса.
{
pLabel = NULL;
nCount = 0;
}
void __fastcall TCheckThread::UpdateLabel(void) // Делает всю работу.
{
if (pLabel)
{
pLabel->Caption = nCount;
}
if (nCount < 10000)
{
nCount++;
}
else
{
nCount = 0;
}
}
void __fastcall TCheckThread::Execute()
{
while ( !Terminated )
{
// Метод Synchronize предоставляет возможность избежать проблем,
// связанных с многопоточностью, когда один и тот же объект
// пытаются изменить из разных потоков в приложении.
Synchronize(UpdateLabel);
}
MessageBox(NULL, "Все сделано!", "Информация", MB_OK);
}
void __fastcall TCheckThread::AssignLabel(TLabel *pL)
{
pLabel = pL;
}
-= END UNIT2.CPP =-
-= BEGIN UNIT2.H =-
#include <vcl\Classes.hpp>
class TCheckThread : public TThread
{
private:
TLabel *pLabel;
int nCount;
protected:
void __fastcall Execute();
void __fastcall UpdateLabel(void);
public:
virtual __fastcall TCheckThread(bool CreateSuspended);
virtual void __fastcall AssignLabel(TLabel *pLabel);
};
#endif
-= END UNIT2.H =-
Valeriy Filchenkov 2:5045/78.78
Предыдущий вопрос
|
|
Следующий вопрос
источник
by jenyok
|
|
|