Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2011, 15:01   #1
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию (IdHTTPServer + Timer) не запускается таймер по получению запроса на IdHTTPServer

В общем ситуация следующая:
Делаем событие для IdHTTPServer на получение запроса, при выполнении которого запускается таймер. То есть получили запрос на IdHTTPServer - запустили Timer. Событие на таймере пусть будет например подсчет секунд в лабеле.
Грабли в следующем - после получения запроса таймер запускается, но события, которые висят на onTimer не выполняются.

Вот полный исходник примера:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdCustomTCPServer,
  IdCustomHTTPServer, IdHTTPServer, ExtCtrls, IdContext;

type
  TForm1 = class(TForm)
    IdHTTPServer1: TIdHTTPServer;
    Label1: TLabel;
    Timer1: TTimer;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  timer: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if timer1.Enabled then
timer1.Enabled := false else
timer1.Enabled := true;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
idhttpserver1.Active := false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
timer:= 0;
idhttpserver1.DefaultPort := 12345;
idhttpserver1.Active := true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
idhttpserver1.Active := false;
end;

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
timer1.Enabled := true;
//Showmessage('Runned');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer:= timer + 1;
Label1.Caption:=inttostr(timer);
end;

end.
Добавил так-же кнопку для запуска/остановки таймера в ручном режиме для уверенности что он работает.
Итак, делаем запрос и видим что запрос получен, но отсчет в лабеле не пошел. Нажимаем кнопку и ничего не происходит (это таймер останавливается), нажимаем еще раз и отсчет пошел.

А теперь хочу обратить внимание на один момент - в коде закомментирован Showmessage. Он появляется после получения запроса и запуска таймера. Снимаем коммент, и наблюдаем следующую картину - делаем запрос, стартует таймер, появляется Showmessage, и если его не закрыть то таймер работает, стоит только нажать "Ок", и все, таймер снова застопорился.

Что это за чудеса такие? Как решить проблему?
Jetro вне форума Ответить с цитированием
Старый 10.05.2011, 16:15   #2
Usov
Форумчанин
 
Аватар для Usov
 
Регистрация: 29.09.2009
Сообщений: 228
По умолчанию

Так это ж понятно - вывод мессаги останавливает основную прогу. Выход - не используй модальное окно, выводи сообщения в лог типа в мемо поле.

Последний раз редактировалось Usov; 10.05.2011 в 16:19.
Usov вне форума Ответить с цитированием
Старый 10.05.2011, 16:40   #3
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию

Ты меня не совсем понял - там месседж вообще не нужен, его в программе вообще не будет. Проблема в том что таймер не выполняет код, который я на него повесил, а если туда вцепить еще и месседж, то пока он будет висеть на переднем плане - программа будет работать как надо, а если я его закрою, то все снова зависнет.
Jetro вне форума Ответить с цитированием
Старый 10.05.2011, 21:48   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Обработчик события OnCommandGet вызывается в дополнительном кодовом потоке. Со всеми вытекающими последствиями.
mss вне форума Ответить с цитированием
Старый 11.05.2011, 17:07   #5
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Обработчик события OnCommandGet вызывается в дополнительном кодовом потоке. Со всеми вытекающими последствиями.
Ага, теперь стало все понятно. Спасибо.
Обошел проблему, правда быдлокод писать пришлось, но для своего личного использования прокатит .
Тему можно закрыть.
Jetro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение картинок idhttpserver bookkc Помощь студентам 11 27.12.2011 17:40
IdHttpServer Cookies postal2 Работа с сетью в Delphi 7 09.09.2009 15:23
IdHttpServer - по какому ip идти? postal2 Работа с сетью в Delphi 9 08.09.2009 17:46
вопрос по IdHTTPServer CraZZy RabbIt Работа с сетью в Delphi 2 24.07.2009 12:59
IdHTTPServer lukash Работа с сетью в Delphi 2 26.09.2007 02:26