Показать сообщение отдельно
  #6  
Старый 21.10.2013, 13:00
Smallboy Smallboy вне форума
Прохожий
 
Регистрация: 16.07.2013
Сообщения: 18
Версия Delphi: Delphi XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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;
Ответить с цитированием