а чем создание потока для каждого входящего сообщения не подходит? ведь если захочется сделать ответ результатом запроса к БД или 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;