Multithreading 简化VCL线程包装器代码

Multithreading 简化VCL线程包装器代码,multithreading,synchronization,c++builder,vcl,Multithreading,Synchronization,C++builder,Vcl,我使用的线程包装器检查更新VCL(也有一些参数)的函数是否从主线程调用,然后始终在主线程上下文中执行 它可以工作,但我想让它更简单。问题是,我必须在每个需要VCL同步的函数中重复这段代码,这很容易出错。有没有办法使这个包装器更简单、更可重用?请注意,此特定包装器仅使用一个参数,但可以有任意数量的参数复制到TLocalArgs并传递 当前代码: boost::scoped_ptr<TIdThreadComponent> WorkerThread; ... void TForm1::

我使用的线程包装器检查更新VCL(也有一些参数)的函数是否从主线程调用,然后始终在主线程上下文中执行

它可以工作,但我想让它更简单。问题是,我必须在每个需要VCL同步的函数中重复这段代码,这很容易出错。有没有办法使这个包装器更简单、更可重用?请注意,此特定包装器仅使用一个参数,但可以有任意数量的参数复制到
TLocalArgs
并传递

当前代码:

boost::scoped_ptr<TIdThreadComponent> WorkerThread;

...

void TForm1::SetMemoMessage(UnicodeString Msg)
{
// Check which thread called function, main thread or worker thread
if (GetCurrentThreadId() != System::MainThreadID)
    {
    struct TLocalArgs
        {
        TForm1 *Form;
        UnicodeString Msg;
        void __fastcall SetMemoMessage() // Same name as main function to make it easier to maintain
            {
            // We are in main thread now, safe to call message update directly
            Form->SetMemoMessage(Msg);
            }
        };

    // We are in worker thread, wrap into Synchronize
    TLocalArgs Args = { this, Msg };
    WorkerThread->Synchronize(&Args.SetMemoMessage);
    return;
    }

// MAIN THREAD CODE is very simple compared to wrapper above
Memo1->Text = Msg;
}
boost::限定范围的\u ptr WorkerThread;
...
void TForm1::SetMemoMessage(UnicodeString消息)
{
//检查调用函数的线程是主线程还是工作线程
如果(GetCurrentThreadId()!=System::MainThreadID)
{
结构TLocalArgs
{
TForm1*形式;
独活味精;
void _fastcall SetMemoMessage()//与主函数同名,便于维护
{
//我们现在在主线程中,可以安全地直接调用消息更新
表单->设置备忘录消息(Msg);
}
};
//我们在工作线程中,打包到同步中
TLocalArgs Args={this,Msg};
WorkerThread->同步(&Args.SetMemoMessage);
返回;
}
//与上面的包装器相比,主线程代码非常简单
备忘录1->Text=Msg;
}
TThread::Synchronize()
在内部为您检查
mainthreaid
,如果从主线程调用
Synchronize()
,则直接调用指定的过程。因此,只需无条件地调用
Synchronize()
,让它处理细节
Synchronize()
还提供了重载的静态版本,因此您甚至不需要
TThread
指针来调用它

试试这个:

void TForm1::SetMemoMessage(UnicodeString Msg)
{
    struct TLocalArgs
    {
        UnicodeString Msg;
        void __fastcall SetMemoMessage()
        {
            Form1->Memo1->Text = Msg;
        }
    };

    TLocalArgs Args;
    Args.Msg = Msg;
    TThread::Synchronize(NULL, &Args.SetMemoMessage);
}

谢谢,肯定是对我的版本有了改进。在Builder C++ 6中没有工作。[C++ +错误] Meal.CPP(100):E2247'快速调用tGoT:::同步(空隙(yFASTHOLL((OxLead)))()不能访问< /COD> @安德烈KrasutSky]改正,<代码>静态<代码>过载>代码>同步()/<代码> >在Delphi 7中添加(因此,它直到BDS 2006才出现在C++Builder中),并且非静态重载在C++Builder 6中受到
保护
,并且仅在
TThread
派生类中可用。所讨论的代码使用的是
UnicodeString
,因此RADStudio 2009或更高版本,其中非静态重载是
public