Работа с потоками в Borland C++ Builder 6 (класс TThread, фишки с Terminate, Terminated и Synchronize)

Гобелен - кликните для возврата на главную

Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.

Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Жладимира Вольфовича Жириновского.

Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.

Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.

Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!

104 549 руб.

Описание товара

Ранее я писал статью на тему использование TThread и Synchronize в Delphi, решил привести аналогичный пример на языке C++.

Ещё один рабочий пример(проверено) работы с потоками в Borland C++ Builder 6.

Файл Unit1.h


Ссылка на видео на видеохостинге YouTube: https://www.youtube.com/watch?v=hauM6wuHmgU

C++
    
#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
      
class TProgressThread : public TThread
{
protected:
    void __fastcall Execute();
    void __fastcall UpdateProgress();
    void __fastcall ResetProgress();  // Добавляем новый метод
public:
    __fastcall TProgressThread(bool CreateSuspended);
};
      
class TForm1 : public TForm
{
__published:
    TProgressBar *ProgressBar1;
    TButton *Button1;
    TButton *Button2;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:
    TProgressThread *Thread;
public:
    __fastcall TForm1(TComponent* Owner);
};
      
extern PACKAGE TForm1 *Form1;
#endif

  

Файл Unit1.cpp

C++
    
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
      
// Реализация методов потока
__fastcall TProgressThread::TProgressThread(bool CreateSuspended) 
    : TThread(CreateSuspended)
{
    FreeOnTerminate = true;
}
      
void __fastcall TProgressThread::ResetProgress()
{
    Form1->ProgressBar1->Position = 0;
}
      
void __fastcall TProgressThread::UpdateProgress()
{
    Form1->ProgressBar1->Position = Form1->ProgressBar1->Position + 1;
}
      
void __fastcall TProgressThread::Execute()
{
    // Сбрасываем прогресс в ноль через Synchronize
    Synchronize(ResetProgress);
      
    // Основной цикл потока
    while(!Terminated && 
          Form1->ProgressBar1->Position < Form1->ProgressBar1->Max)
    {
        Sleep(100);
        if(Terminated) break;
        Synchronize(UpdateProgress);
    }
}
      
// Остальная часть файла Unit1.cpp без изменений
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    Thread = NULL;
}
      
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(Thread == NULL)
    {
        Thread = new TProgressThread(true);
        Thread->Resume();
        Button1->Caption = "Stop";
    }
    else
    {
        Thread->Terminate();
        Thread = NULL;
        Button1->Caption = "Start";
    }
}
      
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    ShowMessage("Main thread is working!");
}
      
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    if(Thread != NULL)
    {
        Thread->Terminate();
    }
}

  

Вариант с разбиением кода по нескольким Unit файалм

Файл Unit1.h

C++
    
// Unit1.h
#ifndef Unit1H
#define Unit1H
      
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
      
class TForm1 : public TForm
{
__published:
    TProgressBar *ProgressBar1;
    TButton *Button1;
    TButton *Button2;
    
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    
private:
    class TProgressThread *Thread;  // Предварительное объявление
    
public:
    __fastcall TForm1(TComponent* Owner);
};
      
extern PACKAGE TForm1 *Form1;
      
#endif

  

Файл Unit1.cpp

C++
    
// Unit1.cpp
#include <vcl.h>
#pragma hdrstop
      
#include "Unit1.h"
#include "ProgressThread.h"  // Подключаем наш модуль потока
      
#pragma package(smart_init)
#pragma resource "*.dfm"
      
TForm1 *Form1;
      
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    Thread = NULL;
}
      
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(Thread == NULL)
    {
        Thread = new TProgressThread(true);
        Thread->Resume();
        Button1->Caption = "Stop";
    }
    else
    {
        Thread->Terminate();
        Thread = NULL;
        Button1->Caption = "Start";
    }
}
      
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    ShowMessage("Main thread is working!");
}
      
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    if(Thread != NULL)
    {
        Thread->Terminate();
    }
}

  

Файл ProgressThread.h

C++
    
#ifndef ProgressThreadH
#define ProgressThreadH
      
#include <Classes.hpp>
      
class TProgressThread : public TThread
{
protected:
    void __fastcall Execute();
    void __fastcall UpdateProgress();
    void __fastcall ResetProgress();
    
public:
    __fastcall TProgressThread(bool CreateSuspended);
};
      
#endif

  

Файл ProgressThread.cpp

C++
    
// ProgressThread.cpp
#include <vcl.h>
#pragma hdrstop
      
#include "ProgressThread.h"
#include "Unit1.h"  // Для доступа к Form1
      
#pragma package(smart_init)
      
__fastcall TProgressThread::TProgressThread(bool CreateSuspended) 
    : TThread(CreateSuspended)
{
    FreeOnTerminate = true;
}
      
void __fastcall TProgressThread::ResetProgress()
{
    Form1->ProgressBar1->Position = 0;
}
      
void __fastcall TProgressThread::UpdateProgress()
{
    Form1->ProgressBar1->Position = Form1->ProgressBar1->Position + 1;
}
      
void __fastcall TProgressThread::Execute()
{
    Synchronize(ResetProgress);
    
    while(!Terminated && 
          Form1->ProgressBar1->Position < Form1->ProgressBar1->Max)
    {
        Sleep(100);
        if(Terminated) break;
        Synchronize(UpdateProgress);
    }
}

  

Предыдущий вариант кода

Файл Unit1.h

C++
    
#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include "Unit2.h"
      
class TForm1 : public TForm
{
__published:
    TProgressBar *ProgressBar1;
    TButton *Button1;
    TButton *Button2;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:
    TProgresso *tpg;
public:
    __fastcall TForm1(TComponent* Owner);
};
      
extern PACKAGE TForm1 *Form1;
#endif

  

Файл Unit1.cpp

C++
    
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
      
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    tpg = NULL;
}
      
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if (tpg == NULL)
    {
        tpg = new TProgresso(true);
        tpg->FreeOnTerminate = true;
        tpg->Resume();
    }
}
      
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    if (tpg != NULL)
    {
        tpg->Terminate();
    }
}
      
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    if (tpg != NULL)
    {
        tpg->Terminate();
    }
}

  

Файл Unit2.h

C++
    
#ifndef Unit2H
#define Unit2H
#include <Classes.hpp>
      
class TProgresso : public TThread
{
protected:
    void __fastcall UpdateProgressBar();
    void __fastcall Execute();
public:
    __fastcall TProgresso(bool CreateSuspended);
};
      
#endif

  

Файл Unit2.cpp

C++
    
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
      
__fastcall TProgresso::TProgresso(bool CreateSuspended) : TThread(CreateSuspended)
{
}
      
void __fastcall TProgresso::UpdateProgressBar()
{
    Form1->ProgressBar1->Position = Form1->ProgressBar1->Position + 1;
}
      
void __fastcall TProgresso::Execute()
{
    Form1->ProgressBar1->Position = 0;
    while (!Terminated && Form1->ProgressBar1->Position < Form1->ProgressBar1->Max)
    {
        Sleep(100);
        if (Terminated) break;
        Synchronize(UpdateProgressBar);
    }
}

  

Другие товары

Вы так же можете прочитать следующие статьи: