Конференция "Сети" » Многопоточность в Indy
 
  • Pavel (29.01.10 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 разные.
  • Медвежонок Пятачок © (29.01.10 10:59) [1]
    нельзя работать с вцл из вторичных потоков.
    ты работаешь с вцл (мемо) из вторичного потока (TForm1.IdHTTPServer1CommandGet выполняется в контексте вторичного потока)
  • Pavel (29.01.10 11:08) [2]
    А как правильно сделать, чтобы дынные в Memo1 и Memo2, были одинаковыми?
  • Медвежонок Пятачок © (29.01.10 11:14) [3]
    чтобы дынные в Memo1 и Memo2, были одинаковыми?

    memo1.lines.text := memo2.lines.text
  • Медвежонок Пятачок © (29.01.10 11:17) [4]
    Memo1.Lines.Add(us);
    ...
    Delete(us, 1, p1);
    Memo2.Lines.Add(us);


    а с чего они вообще должны быть одинаковыми при таком раскладе?
  • Pavel (29.01.10 11:23) [5]
    Сори, но проблема не много другая. Как Сделать, чтобы занчение переменной us не изменялось в пределах выплнения одного запроса.
    Т. е. нужно следующее, поступает HTTP-запрос, получаем значение переменной us, затем выполняем с полученным знкачением некий набор действий, и результат действий должен соответствовать именно тому значению переменнй us, которое прочитали в данном запросе.
  • Медвежонок Пятачок © (29.01.10 11:29) [6]
    значение переменной us у тебя меняется твоим же кодом
    четыре раза
    Delete(us, 1, p1);

    в рамках обработки одного и того же запроса
  • Медвежонок Пятачок © (29.01.10 11:31) [7]
    причем в связи с тем, что переменная глобальная, то ее меняет обработка каждого нового гет запроса.
    то есть каждый запрос меняет значение us четыре раза.
  • Медвежонок Пятачок © (29.01.10 11:33) [8]
    даже не четыре, а пять раз с учетом:

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

    Delete(us, 1, p1); //два
    ...
    Delete(us, 1, p1); //три
    ...
    Delete(us, 1, p1); //четыре
    ...
    Delete(us, 1, p1); //пять
    ...
  • Pavel (29.01.10 12:29) [9]
    Спасибо! Разобрался.
  • Anatoly Podgoretsky © (29.01.10 15:01) [10]
    > Pavel  (29.01.2010 11:08:02)  [2]

    Зачем тогда два мемо
 
Конференция "Сети" » Многопоточность в Indy
Есть новые Нет новых   [134438   +31][b:0][p:0.001]