Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Многопоточность в Indy   Найти похожие ветки 

 
Pavel   (2010-01-29 10:34) [0]

Использую компонент IdHTTPServer1.
С толкнулся с проблемой, что при обработке нескольких потоков выходные данные потока не соответствуют входным.
Вот пример кода:


procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
 ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
 us := ARequestInfo.RawHTTPCommand;

 p := Pos("img", us);
 if p > 0 then
 begin
   Memo1.Lines.Add(us);

   p1 := Pos("_", us);
   Delete(us, 1, p1);
   p1 := Pos("_", us);
   z := Copy(us, 1, p1 - 1);
   Delete(us, 1, p1);
   p1 := Pos("_", us);
   x := Copy(us, 1, p1 - 1);
   Delete(us, 1, p1);
   p1 := Pos(".", us);
   y := Copy(us, 1, p1 - 1);
   Delete(us, 1, p1);

   Memo2.Lines.Add(us);

 end;
end;


В результате работы процедуры данные, в Memo1 и Memo2 разные.


 
Медвежонок Пятачок ©   (2010-01-29 10:59) [1]

нельзя работать с вцл из вторичных потоков.
ты работаешь с вцл (мемо) из вторичного потока (TForm1.IdHTTPServer1CommandGet выполняется в контексте вторичного потока)


 
Pavel   (2010-01-29 11:08) [2]

А как правильно сделать, чтобы дынные в Memo1 и Memo2, были одинаковыми?


 
Медвежонок Пятачок ©   (2010-01-29 11:14) [3]

чтобы дынные в Memo1 и Memo2, были одинаковыми?

memo1.lines.text := memo2.lines.text


 
Медвежонок Пятачок ©   (2010-01-29 11:17) [4]

Memo1.Lines.Add(us);
...
Delete(us, 1, p1);
Memo2.Lines.Add(us);


а с чего они вообще должны быть одинаковыми при таком раскладе?


 
Pavel   (2010-01-29 11:23) [5]

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


 
Медвежонок Пятачок ©   (2010-01-29 11:29) [6]

значение переменной us у тебя меняется твоим же кодом
четыре раза
Delete(us, 1, p1);

в рамках обработки одного и того же запроса


 
Медвежонок Пятачок ©   (2010-01-29 11:31) [7]

причем в связи с тем, что переменная глобальная, то ее меняет обработка каждого нового гет запроса.
то есть каждый запрос меняет значение us четыре раза.


 
Медвежонок Пятачок ©   (2010-01-29 11:33) [8]

даже не четыре, а пять раз с учетом:

us := ARequestInfo.RawHTTPCommand; //раз

Delete(us, 1, p1); //два
...
Delete(us, 1, p1); //три
...
Delete(us, 1, p1); //четыре
...
Delete(us, 1, p1); //пять
...


 
Pavel   (2010-01-29 12:29) [9]

Спасибо! Разобрался.


 
Anatoly Podgoretsky ©   (2010-01-29 15:01) [10]

> Pavel  (29.01.2010 11:08:02)  [2]

Зачем тогда два мемо



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.073 c
2-1342077313
AAsdr
2012-07-12 11:15
2013.03.22
MOuseMove и ширина понели на StatusBar


15-1347628130
Л.Е
2012-09-14 17:08
2013.03.22
Хинты. Обрезается строка, столкнувшись с символом |


6-1261121043
BioHEX
2009-12-18 10:24
2013.03.22
Определение mac-адреса


15-1330763551
Дмитрий
2012-03-03 12:32
2013.03.22
Добавление компонент на форму


2-1330094823
Сергей
2012-02-24 18:47
2013.03.22
Как отменить сообщения компилятора?