![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| lamper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 не помог, может кто поможет ламеру? |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
а подождите... зачем в неблокирующем режиме выполнение в отдельных потоках?!
-------------------- There are always someone smarter than you... |
|||
|
||||
| lamper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 9.9.2006 Репутация: нет Всего: нет |
Приложение многопоточное, любой из потоков может загрузить данные.
С режимом описался, режим - bmBlocking; |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
странно... давай пример приложения для проверки этого косяка...
-------------------- There are always someone smarter than you... |
|||
|
||||
| lamper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 9.9.2006 Репутация: нет Всего: нет |
Вот примерчик, отражающий суть дела (на форме одна TButton и две TLabel, последние показывают сколько байт загружено каждым из тредов). Как я ни пыхтел, а пока один тред своё не догрузит (причём 10 страниц подряд) - другой либо вообще не загружает либо, если повезёт, очень медленно работает.
============================================================================ Убрал длинный листинг, дабы не засорять сервер, ниже ссылка на файл с исходниками. ========================================================================== Система - Windows XP, компилятор - Delphi 7, процессор - 900 МГц P.S. Думал, что я - ламер, оказывается до ламера ещё дорасти придётся. Это сообщение отредактировал(а) lamper - 20.3.2007, 18:46 |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
ай, мой мозг...
дай плз пример приложения запакованный в аттаче. чтоб можно было распаковать и скомпилить... стоп. подождите ка. а ты как думал это работать будет?! на однопроцессорной системе так и должно происходить... в один момент выполняется только один поток. тем более по приведенному коду нельзя сделать выводы о том, что система не переключает потоки в процессе их выполнения... Это сообщение отредактировал(а) MetalFan - 20.3.2007, 09:28 -------------------- There are always someone smarter than you... |
|||
|
||||
| lamper |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 9.9.2006 Репутация: нет Всего: нет |
Я думал, что тред - по определению нужен для того, чтобы система сама распределяла процессорное время между тредами, давая им работать параллельно (образно говоря, конечно, на самом деле передавая управление то одному то другому треду на короткие промежутки времени). Как накодить, чтоб "система переключала потоки в процессе их выполнения" ???! (или где почитать поподробнее). Здесь файлик с компилируемым прожектом : http://www.electrostat.narod.ru/images/1.rar Это сообщение отредактировал(а) lamper - 20.3.2007, 18:41 |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
Многопоточность - как это делается в Дельфи
чуть позже гляну, что там за "прожект") делфи доустановлю -------------------- There are always someone smarter than you... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |