Показать сообщение отдельно
  #14  
Старый 23.03.2011, 09:31
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а чем создание потока для каждого входящего сообщения не подходит? ведь если захочется сделать ответ результатом запроса к БД или RSS ленте (web-серверу), к примеру, то время подготовки ответа может занять длительное время. не висеть же остальным "ответам" в ожидании своей очереди:
Код:
type
  TICQMessageThread = class(TThread)
  private
    FSender: TICQClient;
    FMsg, FUIN: String;
  protected
    procedure Execute; override;
  public
    constructor Create(Sender: TICQClient; Msg, UIN: String);
    procedure SendMessage;
  end;

implementation

constructor TICQMessageThread.Create(Sender: TICQClient; Msg, UIN: String);
begin
  inherited Create(True);
  FreeOnTerminate:=True;
  // запомним их
  FSender:=Sender;
  FMsg:=Msg;
  FUIN:=UIN;
  Resume;
end;

procedure TICQMessageThread.Execute;
begin
  // Sleep по теме :)
  Sleep(1000);
  // готовим ответ и записываем его туда,
  // где было входящее сообщение, т.е. в FMsg
  FMsg:='привет клиентик '+FUIN;
  // а отправлять будем в основном потоке  
  Synchronize(SendMessage);
end;

procedure TICQMessageThread.SendMessage;
begin
  // вызываем SendMessage у TICQClient
  FSender.SendMessage(FMsg, FUIN);
end;

сам обработчик входящего сообщения компонента icq:
Код:
procedure TForm1.ICQMessage(Sender: TObject; Msg, UIN: String);
begin
  TICQMessageThread.Create(icq, Msg, UIN);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием