Цитата:
Сообщение от Aristarh Dark
Предроложим что:
BusyFlag - глобальная переменная в рамках данного модуля
TCheckRequestThread - поток который обрабатывает запрос на внешнем устройстве, после обработки данных он самоуничтожается.
Код:
if ServerSocket.Socket.ActiveConnections = 1 then
begin
//тут читаем параметры запроса
if not BusyFlag then
begin
BusyFlag:=True;
TCheckRequestThread.Create; //запускаем поток (возможно, и даже скорее всего,
// в конструктор нужно быдет передать некоторые параметры)
// CheckRequest; // обрабатывает запрос (15-20 секунд);
end
else
begin
//тут отклоняем запросы пользователей
end;
GetParam:='';
exit;
end
else
begin
ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections-1].SendText('Сервер не доступен');
Application.ProcessMessages;
Buffer.Lines.Insert(0,'Отключаем лишний коннект');
Application.ProcessMessages;
ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections-1].Close;
Application.ProcessMessages;
ConNum;
end;
на событие OnTerminate потока вешаешь обработчик который отправляет результаты обработки данных нужному пользователю и снимает BusyFlag
|
Понял. Спасибо попробую. Сейчас читаю про потоки. Возник вопрос:
Вот стандартный пример для обращения из потока к свойствам vcl компонент
Код:
procedure MyThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
procedure MyThread.Execute;
begin
Synchronize(UpdateCaption);
end;
возможно ли через процедуру Synchronize обращаться напрямую к процедурам объекта TForm
например есть вот такое
Код:
procedure TForm1.UpdateCaption;
begin
Caption := 'Updated in a thread';
end;
как можно вызвать эту процедуру в потоке? Это будет верно?
Код:
procedure MyThread.Execute;
begin
Synchronize(TForm1.UpdateCaption);
end;