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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2012, 15:13   #1
stasones
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 13
По умолчанию Delphi 7 idhttpServer и TMemoryStream

Использую в своей программе компонент idhhtpserver. В событии CommandGet для загрузки изображений прописаны такие строки:
Код:
AResponseInfo.ContentType:='image/jpeg';
TimerMonitoring.Enabled:=false;
        if cams[strtoint(ARequestInfo.Document[6])-1].StreamImg<>nil then
           AResponseInfo.ContentStream:=cams[strtoint(ARequestInfo.Document[6])-1].StreamImg;
TimerMonitoring.Enabled:=true;
Смысл в том, что cams это массив record-ов, у которого есть переменная StreamImg типа TMemoryStream, хранящая последнее изображение в jpeg формате. В таймере может начаться перезапись StreamImg, поэтому я его отключаю на время выполнения операции.

Проблема в том, что при частом обновлении страницы(т.е фактически обращению к StreamImg) вылетает Access Violation без указания на строку ошибки. При обновлении не чаще, чем раз в пару секунд ошибок не возникает.

В чем может быть проблема и как ее устранить?
stasones вне форума Ответить с цитированием
Старый 30.06.2012, 15:37   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

обернуть событие таймера и код выше одной критической секцией
дизейблить таймер бессмысленно
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 30.06.2012, 20:58   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

а с чего вы взяли, что
Код:
ARequestInfo.Document[6]
существует? Включите отладчик и смотрите что просходит а лучше, пишите в лог.
Человек_Борща вне форума Ответить с цитированием
Старый 01.07.2012, 01:16   #4
stasones
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
а с чего вы взяли, что
Код:
ARequestInfo.Document[6]
существует? Включите отладчик и смотрите что просходит а лучше, пишите в лог.
Существует однозначно. Там выше проверки идут, просто я решил, что не обязательно их сюда выкладывать. Вот более полный код:
Код:
...
else if pos('jpg', ARequestInfo.Document)<>0 then
  begin
  aresponseinfo.ContentType:='image/jpeg';
  if pos('temp', ARequestInfo.Document)<>0 then
       begin
       if (runtime>=15) and (strtoint(ARequestInfo.Document[6])-1>=0)
                                  and ((strtoint(ARequestInfo.Document[6])<=CamsCount))then
        begin

        TimerMonitoring.Enabled:=false;
        if cams[strtoint(ARequestInfo.Document[6])-1].StreamImg<>nil then
           AResponseInfo.ContentStream:=cams[strtoint(ARequestInfo.Document[6])-1].StreamImg;
        TimerMonitoring.Enabled:=true;
        end;
       end
...
А в отладчике естественно ловил этот момент. При возникновении этой ошибки весь код в обработчике выполняется без ошибок, а за обработчиком, видимо при отправке, уже вылазит Access Violation.

upd
При полной остановке таймера, ничего не изменилось.
Как работаю со стримом в таймере:
Код:
...
   jpg1:= TJPEGImage.Create;
   jpg2:= TJPEGImage.Create;
   jpg1.Assign(Image1.Picture.Bitmap);
   jpg2.Assign(Image2.Picture.Bitmap);
   stream:=TMemoryStream.Create;
   jpg1.SaveToStream(stream);
   size1:=stream.Size;
   stream.Free;
   stream:=TMemoryStream.Create;
   jpg2.SaveToStream(stream);
   size2:=stream.Size;
   jpg1.Free;
   cams[i].StreamImg:=TMemoryStream.Create;
   jpg2.SaveToStream(cams[i].StreamImg);
   ...

Последний раз редактировалось stasones; 01.07.2012 в 01:47. Причина: upd
stasones вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(IdHTTPServer + Timer) не запускается таймер по получению запроса на IdHTTPServer Jetro Работа с сетью в Delphi 4 11.05.2011 17:07
IdHttpServer Cookies postal2 Работа с сетью в Delphi 7 09.09.2009 15:23
вопрос по IdHTTPServer CraZZy RabbIt Работа с сетью в Delphi 2 24.07.2009 12:59
IdHTTPServer lukash Работа с сетью в Delphi 2 26.09.2007 02:26