Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.03.2011, 21:06
arach arach вне форума
Прохожий
 
Регистрация: 17.06.2010
Сообщения: 39
Репутация: 10
По умолчанию Подвисание форме при слипе! [HELP]

сабж, есть процедура отправки icq сообщения:

PHP код:
procedure Tform1.ICQMessage(SenderTObjectMsgUINString);
begin
 inc
(get);
 
sleep(1000);
 
ICQ.SendMessage(StrToInt(UIN), 'Testing TimeOut ^_^');
end

Дело в том, что при вызывании слипа форма приложения виснет на время этого самого слипа (в данном случае 1 секунда). Можно ли как-то избежать этого? Выносил всю работу в отдельный поток - итог тот же, ибо слипа не может быть в экзекуте.
Ответить с цитированием
  #2  
Старый 21.03.2011, 21:09
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Да хоть так.
Код:
procedure Delay(const AMilliseconds: Cardinal); 
var 
  SaveTickCount: Cardinal; 
begin 
  SaveTickCount := GetTickCount; 
  repeat 
    Application.ProcessMessages; 
  until 
    GetTickCount - SaveTickCount > AMilliseconds; 
end;
Вместо sleep.
__________________
Помогаю за Спасибо
Ответить с цитированием
  #3  
Старый 21.03.2011, 21:26
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

а если тебе постоянно надо так вот будет делать задержку то таймер используй
Ответить с цитированием
  #4  
Старый 21.03.2011, 21:29
arach arach вне форума
Прохожий
 
Регистрация: 17.06.2010
Сообщения: 39
Репутация: 10
По умолчанию

Задержка нужна постоянно, использовать таймер - невозможно. Точнее возможно, форма не подвисает, но я не могу в нем прописать, что UIN - это именно переменная входящего сообщения. А если городить через присваивание переменных - оно получается и работает, но если напишут одновременно 2 человека на этот номер - то 1 номер перезапишет другой и не получится..
Ответить с цитированием
  #5  
Старый 21.03.2011, 21:32
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

ты не случаем задержку к боту делаешь? я например в боте делал задержку через таймеры, все отлично работает
Ответить с цитированием
  #6  
Старый 21.03.2011, 21:51
arach arach вне форума
Прохожий
 
Регистрация: 17.06.2010
Сообщения: 39
Репутация: 10
По умолчанию

менно задержка на отправку сообщения! Можешь показать пример работы с таймером в боте?
Ответить с цитированием
  #7  
Старый 21.03.2011, 22:01
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Какой принцип действия?
Написал человек, задержка, сообщение отправляем,
или же между отправкой сообщений которые забиваются в очередь нужна задержка?
или же определенным людям через каждыые Н сек отправлять сообщение

Последний раз редактировалось ALexandr555, 21.03.2011 в 22:05.
Ответить с цитированием
  #8  
Старый 21.03.2011, 22:18
arach arach вне форума
Прохожий
 
Регистрация: 17.06.2010
Сообщения: 39
Репутация: 10
По умолчанию

написал - задержка - отправил
Ответить с цитированием
  #9  
Старый 21.03.2011, 22:53
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

мне кажется подход не верный у тебя, что ты делаешь? бот? Искуственный интелект? чат?
Ответить с цитированием
  #10  
Старый 22.03.2011, 19:00
arach arach вне форума
Прохожий
 
Регистрация: 17.06.2010
Сообщения: 39
Репутация: 10
По умолчанию

Никакой ни искуственный интелект! Просто задержка отправки для разгрузки, в бота пишут много человек одновременно, таймаут в 1 секунду спасает от бана. При слипе форма виснет, а это не очень хорошо.
Ответить с цитированием
  #11  
Старый 22.03.2011, 19:19
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

в ИИ нет ничего плохого) не воспринимай это как "спам" или "подборщик паролей"
Да задержка нужна, но она нужна между самой отправкой команд, ибо напишут тебе 6 человек одновременно и через 1 секунду всем 6 и отправится.
сейчас тебе кое что кину
Ответить с цитированием
  #12  
Старый 22.03.2011, 19:21
arach arach вне форума
Прохожий
 
Регистрация: 17.06.2010
Сообщения: 39
Репутация: 10
По умолчанию

Давай! Вот я потому и думаю, что нужен еще код.. Но продумать пока не могу, ибо с тасику клиентом только начал работать..
Ответить с цитированием
  #13  
Старый 22.03.2011, 19:27
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Код:
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  
Старый 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;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter