Упрощение кода оболочки потока VCL

Я использую обертку потока, которая проверяет, была ли вызвана функция, которая обновляет 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;
}

Ответы на вопрос(1)

Ваш ответ на вопрос