Uproszczenie kodu owijania nici VCL

Używam wrappera wątku, który sprawdza, czy funkcja aktualizująca VCL (która ma również pewne argumenty) została wywołana z głównego wątku lub nie, a następnie zawsze wykonuje się w kontekście wątku głównego.

To działa, ale chcę to uprościć. Problem polega na tym, że muszę powtórzyć ten kod w każdej funkcji, która wymaga synchronizacji VCL, która jest podatna na błędy. Czy istnieje sposób na uproszczenie i ponowne wykorzystanie tego opakowania? Zauważ, że ten konkretny opakowanie używa tylko jednego parametru, ale może być dowolna liczba parametrów, które są kopiowaneTLocalArgs i przekazał dalej.

Aktualny kod:

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;
}

questionAnswers(1)

yourAnswerToTheQuestion