Упрощение кода оболочки потока 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;
}