美文网首页
TThread::CreateAnonymousThread -

TThread::CreateAnonymousThread -

作者: 玄坴 | 来源:发表于2020-05-27 12:06 被阅读0次

    C++ Builder 参考手册TThreadCreateAnonymousThread


    头文件:#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 表达式

    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 表达式,并且在线程里面同步执行一个窗体的成员函数

    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。

    运行结果

    参考:


    C++ Builder 参考手册TThreadCreateAnonymousThread

    相关文章

      网友评论

          本文标题:TThread::CreateAnonymousThread -

          本文链接:https://www.haomeiwen.com/subject/gthlohtx.html