Главная / FAQ по Builder'у / 39 У меня в программе цикл...

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
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz