Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TTCPClient упорно ссорятся в потоках 
:(
    Опции темы
lamper
Дата 18.3.2007, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.9.2006

Репутация: нет
Всего: нет



TTCPClient замечательно работает при загрузке файла по HTTP, но при попытке заставить два TTCPClient'a работать в отдельных потоках грузит только один поток, второй останавливается.

Режим - nonBlocking.
Метод - SendStream.

procedure THTTP_Thread.LoadFromRemoteServer(MS: TMemoryStream; Host, Port: String);
var
 C: TTcpClient;
 P: PChar;
 RecLen: Integer;
begin
  C:=TTcpClient.Create(nil);
  C.RemoteHost:=Host;
  C.RemotePort:=Port;
  try
     if C.Connect
     then
      begin
       MS.Position := 0;
       C.SendStream(MS);
       MS.Clear;
       P := GetMemory(256);
       RecLen := C.ReceiveBuf(P^, 256);
       while RecLen > 0 do
        begin
         MS.Write(P^, RecLen);
         RecLen := C.ReceiveBuf(P^, 256);
        end;
      FreeMemory(P);
     end;
  finally
    C.Free;
  end;
end;

LoadFromRemoteServer вызывается из процедуры Execute потока THTTP_Thread.

Два дня кряхтел и Google не помог,  может кто поможет ламеру?
PM MAIL   Вверх
MetalFan
Дата 18.3.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



а подождите... зачем в неблокирующем режиме выполнение в отдельных потоках?!


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
lamper
Дата 19.3.2007, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.9.2006

Репутация: нет
Всего: нет



Приложение многопоточное, любой из потоков может загрузить данные.
С режимом описался, режим - bmBlocking;
PM MAIL   Вверх
MetalFan
Дата 19.3.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



странно... давай пример приложения для проверки этого косяка...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
lamper
Дата 20.3.2007, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.9.2006

Репутация: нет
Всего: нет



Вот примерчик, отражающий суть дела (на форме одна TButton и две TLabel, последние показывают сколько байт загружено каждым из тредов). Как я ни пыхтел, а пока один тред своё не догрузит (причём 10 страниц подряд) - другой либо вообще не загружает либо, если повезёт, очень медленно работает.

============================================================================

Убрал длинный листинг, дабы не засорять сервер, ниже ссылка на файл с исходниками.

==========================================================================

Система - Windows XP, компилятор - Delphi 7, процессор - 900 МГц
P.S. Думал, что я - ламер, оказывается до ламера ещё дорасти придётся.

Это сообщение отредактировал(а) lamper - 20.3.2007, 18:46
PM MAIL   Вверх
MetalFan
Дата 20.3.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



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

Цитата(lamper @  18.3.2007,  06:19 Найти цитируемый пост)
TTCPClient замечательно работает при загрузке файла по HTTP, но при попытке заставить два TTCPClient'a работать в отдельных потоках грузит только один поток, второй останавливается.

стоп. подождите ка. а ты как думал это работать будет?!
на однопроцессорной системе так и должно происходить... в один момент выполняется только один поток.

тем более по приведенному коду нельзя сделать выводы о том, что система не переключает потоки в процессе их выполнения...

Это сообщение отредактировал(а) MetalFan - 20.3.2007, 09:28


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
lamper
Дата 20.3.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.9.2006

Репутация: нет
Всего: нет



Цитата(MetalFan @ 20.3.2007,  09:13)
на однопроцессорной системе так и должно происходить... в один момент выполняется только один поток.

тем более по приведенному коду нельзя сделать выводы о том, что система не переключает потоки в процессе их выполнения...


Я думал, что тред - по определению нужен для того, чтобы система сама распределяла процессорное время между тредами, давая им работать параллельно (образно говоря, конечно, на самом деле передавая управление то одному то другому треду на короткие промежутки времени).

Как накодить, чтоб "система переключала потоки в процессе их выполнения" ???! (или где почитать поподробнее).

Здесь файлик с компилируемым прожектом : http://www.electrostat.narod.ru/images/1.rar

Это сообщение отредактировал(а) lamper - 20.3.2007, 18:41
PM MAIL   Вверх
MetalFan
Дата 21.3.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Многопоточность - как это делается в Дельфи
чуть позже гляну, что там за "прожект") делфи доустановлю


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1041 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.