TThread::CreateAnonymousThread - C++ Builder

C++ Builder 参考手册 ➙ TThread ➙ CreateAnonymousThread


头文件:#include
命名空间:System::Classes
类:TThread
访问权限:public:
函数原型:

static TThread * __fastcall CreateAnonymousThread(
    const System::Sysutils::_di_TProc ThreadProc);

CreateAnonymousThread 是 System::Classes::TThread 的成员函数,创建一个匿名的线程。

参数:

ThreadProc:匿名函数 (lambda 表达式) 或 System::Sysutils::_di_TProc 类型的对象;

返回值:

线程对象指针。

  • 参数 ThreadProc 为 lambda 表达式,也支持 System::Sysutils::_di_TProc 类型的对象 (TProc 类型的函数) 【注】;
  • CreateAnonymousThread 返回的线程对象为线程挂起状态,这个线程对象只能调用 Start 方法开始执行线程,线程结束之后,这个线程对象自动销毁;

【注】如果使用老版本的编译器,不支持 lambda 表达式,可以使用 TProc 类型的函数 (当然新版本编译器也可以,如果不嫌麻烦):即继承 TCppInterfacedObject 并且重载 Invoke 方法,Invoke 的参数与返回值要和 TProc 相同,这个 Invoke 即线程函数,这个类的对象指针 new 出来之后,传递给 ThreadProc 参数,线程结束之后,这个对象会自动销毁,后面的例2演示了这个 TProc 参数的用法。


例1:点击 Button1 按钮,执行一段在线程里面运行的代码,使用 lambda 表达式,并且在线程里面同步执行一个 lambda 表达式

  • 由于线程里面不能处理显示,所以用 TThread::Synchronize 显示线程执行的进度;
  • 由于匿名线程不在线程类里面,所以用 TThread::CurrentThread 获取当前的线程对象。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TThread::CreateAnonymousThread([this](){
        for(int i=0; i<10; i++)
        {
            TThread::Synchronize(TThread::CurrentThread, [this](){
                Label1->Caption = StrToIntDef(Label1->Caption, 0) + 1;
            });
            Sleep(200);
        }
    })->Start();
}

例2:点击 Button1 按钮,执行一段在线程里面运行的代码,使用 lambda 表达式,并且在线程里面同步执行一个窗体的成员函数

  • 由于线程里面不能处理显示,所以用 TThread::Synchronize 显示线程执行的进度;
  • 由于匿名线程不在线程类里面,所以用 TThread::CurrentThread 获取当前的线程对象。
void __fastcall TForm1::ShowProgress(void)
{
    Label1->Caption = StrToIntDef(Label1->Caption, 0) + 1;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TThread::CreateAnonymousThread([this](){
        for(int i=0; i<10; i++)
        {
            TThread::Synchronize(TThread::CurrentThread, ShowProgress);
            Sleep(200);
        }
    })->Start();
}

例3:点击 Button1 按钮,创建线程 TMyThreadProc,不使用 lambda 表达式。

  • 重载 Invoke 方法是必须的,这是线程函数;
  • ShowProgress 方法是用来显示 iProgress 到 Form1->Label1;
  • 由于线程里面不能处理显示,所以用 TThread::Synchronize 显示线程执行的进度;
  • 由于匿名线程不在线程类里面,所以用 TThread::CurrentThread 获取当前的线程对象。
class TMyThreadProc : public TCppInterfacedObject
{
private:
    int iProgress;
    void __fastcall ShowProgress(void)
    {
        Form1->Label1->Caption = iProgress;
    }
public:
    void __fastcall Invoke(void)
    {
        for(iProgress=1; iProgress<=10; iProgress++)
        {
            TThread::Synchronize(TThread::CurrentThread, ShowProgress);
            Sleep(200);
        }
    }
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TThread::CreateAnonymousThread(new TMyThreadProc)->Start();
}
测试程序:Form1 上放一个 Label1 和一个按钮 Button1

运行结果:

点击 Button1 按钮,Label1 显示的文字显示从 1 变到 10。

运行结果

参考:

  • System::TCppInterfacedObject
  • System::Sysutils::_di_TProc
  • System::Classes::TThread::Current
  • System::Classes::TThread::CurrentThread
  • System::Classes::TThread::Synchronize
  • System::Classes::TThread
  • System::TObject
  • VCL 类继承关系

C++ Builder 参考手册 ➙ TThread ➙ CreateAnonymousThread

你可能感兴趣的:(TThread::CreateAnonymousThread - C++ Builder)