![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
сабж, есть процедура отправки icq сообщения:
PHP код:
Дело в том, что при вызывании слипа форма приложения виснет на время этого самого слипа (в данном случае 1 секунда). Можно ли как-то избежать этого? Выносил всю работу в отдельный поток - итог тот же, ибо слипа не может быть в экзекуте. |
|
#2
|
||||
|
||||
|
Да хоть так.
Код:
procedure Delay(const AMilliseconds: Cardinal);
var
SaveTickCount: Cardinal;
begin
SaveTickCount := GetTickCount;
repeat
Application.ProcessMessages;
until
GetTickCount - SaveTickCount > AMilliseconds;
end; |
|
#3
|
||||
|
||||
|
а если тебе постоянно надо так вот будет делать задержку то таймер используй
|
|
#4
|
|||
|
|||
|
Задержка нужна постоянно, использовать таймер - невозможно. Точнее возможно, форма не подвисает, но я не могу в нем прописать, что UIN - это именно переменная входящего сообщения. А если городить через присваивание переменных - оно получается и работает, но если напишут одновременно 2 человека на этот номер - то 1 номер перезапишет другой и не получится..
|
|
#5
|
||||
|
||||
|
ты не случаем задержку к боту делаешь? я например в боте делал задержку через таймеры, все отлично работает
|
|
#6
|
|||
|
|||
|
менно задержка на отправку сообщения! Можешь показать пример работы с таймером в боте?
|
|
#7
|
||||
|
||||
|
Какой принцип действия?
Написал человек, задержка, сообщение отправляем, или же между отправкой сообщений которые забиваются в очередь нужна задержка? или же определенным людям через каждыые Н сек отправлять сообщение Последний раз редактировалось ALexandr555, 21.03.2011 в 22:05. |
|
#8
|
|||
|
|||
|
написал - задержка - отправил
|
|
#9
|
||||
|
||||
|
мне кажется подход не верный у тебя, что ты делаешь? бот? Искуственный интелект? чат?
|
|
#10
|
|||
|
|||
|
Никакой ни искуственный интелект! Просто задержка отправки для разгрузки, в бота пишут много человек одновременно, таймаут в 1 секунду спасает от бана. При слипе форма виснет, а это не очень хорошо.
|
|
#11
|
||||
|
||||
|
в ИИ нет ничего плохого) не воспринимай это как "спам" или "подборщик паролей"
Да задержка нужна, но она нужна между самой отправкой команд, ибо напишут тебе 6 человек одновременно и через 1 секунду всем 6 и отправится. сейчас тебе кое что кину |
|
#12
|
|||
|
|||
|
Давай! Вот я потому и думаю, что нужен еще код.. Но продумать пока не могу, ибо с тасику клиентом только начал работать..
|
|
#13
|
||||
|
||||
|
Код:
procedure TForm1.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String); begin PK1.Add(UIN+'='+Msg); end; Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
uin,msg,send: string;
begin
if PK1.Count>0 then begin
UIN:=copy(pk1.strings[0],1,pos('=',pk1.strings[0])-1);
Msg:=copy(pk1.strings[0],pos('=',pk1.strings[0])+1,length(pk1.strings[0]));
PK1.Delete(0);
//у меня тут он посылается в обработку (функции) и там уже отправляется
//но если тебе сразу ответ надо то вот
send:='Привет человечек';
ICQClient1.SendMessage(StrToInt(UIN),send);
end;Вот при приходе соообщение добавляется в pk1 (TStringList) а таймер например ежесекундно если ктото оставил сообщение берет и обрабатывает его. (естественно удаляя из списка) у меня все работает на ура, сообщения отправляться будут не чаще интервала в таймере. Последний раз редактировалось ALexandr555, 22.03.2011 в 19:33. |
|
#14
|
||||
|
||||
|
а чем создание потока для каждого входящего сообщения не подходит? ведь если захочется сделать ответ результатом запроса к БД или 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; |