子執行緒直接 `StringGrid->Cells[c][r] = value`,主視窗按鈕點不動、介面假死。
**VCL/FMX 不是執行緒安全的**。UI 控件只能在**建立它們的執行緒(主執行緒)中存取**。子執行緒直接操作控件屬性會導致:訊息佇列阻塞、內部狀態損毀、死鎖、繪製異常。
// 執行緒類別
class TUpdateThread : public TThread {
StringGrid* grid; int row, col; AnsiString text;
protected:
void __fastcall Execute() {
// 背景運算...
Synchronize(&UpdateUI); // 切回主執行緒執行 UpdateUI
}
void __fastcall UpdateUI() {
grid->Cells[col][row] = text;
}
};
Queue([=](){ grid->Cells[col][row] = text; }); // Lambda 丟回主執行緒佇列
// 定義訊息
#define WM_UPDATE_GRID (WM_USER + 100)
// 子執行緒
PostMessage(Form1->Handle, WM_UPDATE_GRID, row, (LPARAM)new AnsiString(text));
// 主視窗訊息處理
MESSAGE void __fastcall OnUpdateGrid(TMessage &Msg) {
int row = Msg.WParam;
AnsiString* txt = (AnsiString*)Msg.LParam;
StringGrid1->Cells[1][row] = *txt;
delete txt;
}
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_UPDATE_GRID, TMessage, OnUpdateGrid)
END_MESSAGE_MAP(Form1)
**子執行緒絕對不能直接碰 UI 控件**。C++ Builder 用 `Synchronize` (阻塞)、`Queue` (非阻塞)、或 `PostMessage` 自訂訊息,將 UI 更新動作**封送回主執行緒**執行。介面凍結即因違反單執行緒 UI 規則。