|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Подвисание форме при слипе! [HELP]
сабж, есть процедура отправки 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; Пишу программы за еду. __________________ |