Я вернулся с другим вопросом, касающимся потоков и синхронизации. Представьте себе серверное приложение, которое должно выполнять длительную операцию, и клиент хочет, чтобы его графический интерфейс оставался отзывчивым, пока он ожидает ответа сервера. Я подумал о следующей схеме:
TMonitor.Enter (FTCPClient);
try
WorkerThread := TWorkerThread.Create (SomeLengthyServerOperation);
while (not WorkerThread.Ready) do
Application.ProcessMessages;
DoSometingWithResults (WorkerThread.Result);
WorkerThread.Free;
finally
TMonitor.Exit (FTCPClient);
end;
WorkerThread - это простой класс, производный от TThread, который выполняет функцию, переданную его конструктору, а затем завершается (с Ready = True и результатом в Result). Представленный код выполняется при каждом нажатии кнопки.
Теперь к моему вопросу: если я нажимаю кнопку дважды очень быстро, я получаю некоторые странные ошибки, которые выглядят так, как будто связь между сервером и клиентом каким-то образом искажена, чего я хотел избежать, блокируя объект FTCPClient. В каком потоке обрабатываются обработчики событий после Application.ProcessMessages? Является ли блокировка TMonitor на поток? Означает ли это, что блокировка не работает, если я использую Application.ProcessMessages?
Я не могу объяснить это лучше в данный момент. Я надеюсь, что кто-то поймет мою точку зрения. Если нет, не стесняйтесь задавать вопросы.
РЕДАКТИРОВАТЬ: Для отключения и включения кнопки: я ничего не знаю о клиентском коде. Может быть обработчик события кнопки, может быть что-то еще. В основном я хочу скрыть блокировку от клиентского кода.