C++ Builder 参考手册 ➙ TThread ➙ CreateAnonymousThread
头文件:#include <System.Classes.hpp>
命名空间: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<TProc> 并且重载 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<TProc>
{
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
网友评论