![]() |
Модераторы: Snowy, Poseidon, MetalFan |
![]() ![]() ![]() |
|
SilverShield |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 22.8.2007 Репутация: нет Всего: нет |
Приветствую! Уважаемые, помогите пожалуйста советом! Проблема следующая:
Организован обмен между одним компьютером-сервером и множеством компьютеров-клиентов. На компе-сервере (для сокращения ксер) запущена программа с компонентом TIdServer, на компах-клиентах (для сокращения ккл) соответственно TIdClient. Обмен организован так: на ксер делаю TIdClient.Connect(300) и читаю ответ (TIdClient.Readln). Если пришло установленное слово, то передаю ккл запросы (командой TIdClient.Writeln), а он в соответствии с ними присылает нужную информацию. В т.ч. среди запросов к ккл есть запрос на получение файлов. В этом случае на ккл делаю WriteStream, а на стороне ксер делаю ReadStream. В общем случае первым файлом запрашиваю файл-каталог, в котором содержится список файлов, которые имеются на ккл, а затем не закрывая соединение читаю содержимое этого файла и запрашиваю все остальные файлы из этого каталога. Вся эта схема работает достаточно стабильно при однопоточном режиме обмена, когда использую на ксер компоненты TIdClient созданные в дизайн-тайм. Для оптимизации обмена реализовал многопоточность: создаю несколько тридов, в каждом из которых динамически создаю сокет и произвожу обмен. По завершению обмена вызываю Event "OnComplete", закрываю сокет и разрушаю его. Трид должен разрушаться самостоятельно по завершению своей работы. Суть проблемы в следующем: в ряде случаев (не всегда, но часто) поток может не завершиться (не вызывается мой евент OnComplete). Предполагаю что это из-за зависания сокета, т.к. больше в триде нет ничего что могло бы глючить. На какой стадии обмена происходит зависание определить не удалось. Пытался бороть уже по-всякому. Для сокета установлен ReadTimeout. Пытался заводить отдельно таймер, который по своему таймауту будет производить disconnect для сокета. Но пока все безрезультатно. Буду чрезмерно благодарен за советы. Ниже привожу часть кода: Создание трида
Основная часть:
Получение файлов происходит так:
PS: AntiFreeze стоит на главной форме приложения. Отдельно в каждом потоке я его не создаю. Хотя такой эксперимент тоже ставил - не помагает. Тем более что зависает то не целиком программа, а только отдельный поток обмена. |
||||||
|
|||||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
1. зачем антифриз при многопоточной работе инди?! имхо он тут даже может быть вреден.
2. что происходит в OnCompleAt? учитывается ли то, что этот метод вызывается в контексте доп.потока? 3. а вообще выложи тестовый проект, у тебя там видимо куча недочетов, вот что-то и виснет. -------------------- There are always someone smarter than you... |
|||
|
||||
SilverShield |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 22.8.2007 Репутация: нет Всего: нет |
Прикрепил тестовый проект серверной части (которая производит опрос).
![]() Очень надеюсь, что у меня там действительно недочеты иначе ![]() Присоединённый файл ( Кол-во скачиваний: 10 ) ![]() |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 5 Всего: 158 |
соединение инициирует IdClient. принимает IdServer. а тут явно какая-то лабуда - ты пишешь, что на сервере лежит IdServer и сервер же делает IdClient.Connect... в прикрепленном проекте "серверной части" вообще нет упоминания IdServer, и, судя по тому, что там есть, IdServer таки находится в "клиенте". у тебя перепутаны понятия клиента и сервера - в твоем случае один клиент опрашивает много серверов. так как проект не открывал, то только то, что бросилось в глаза: "детская болезнь" - обращения к VCL-компонентам из создаваемых потоков. туда же несинхронизированный доступ к данным. полная бесполезность употребления RyTimer'а, так как он просто не работает в таких условиях(отсутствие выборки сообщений). procedure TSurClient.Execute; begin inherited; - мощно, но вроде как безобидно. ![]() ... в общем, почитай сначала: Многопоточность - как это делается в Дельфи. Пример простого многопоточного приложения. |
|||
|
||||
SilverShield |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 22.8.2007 Репутация: нет Всего: нет |
dumb, да согласен, с понятиями перепутал, но суть дела не меняет )
Ну, я внутри потока обращаюсь только к компонентам, которые созданы внутри этого потока. Вот объявление класса TSurClient:
Может я ошибаюсь, но по-моему тут с синхронизацией проблем быть не должно.
Поясните пожалуйста. TRyTimer это не дельфовый таймер, а класс основанный на таймерах винды. Спасибо за ссылки, но боюсь в данном случае просто принципов оргнизации многопоточности недостаточно. Тут еще сетевой обмен подключается. |
||||||
|
|||||||
dumb |
|
||||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 5 Всего: 158 |
SetTimer:
что касается таймаутов, то в индейских функциях чтения необязательным параметром можно указать время ожидания ответа, что тебе и нужно, так как только Read* могут висеть в "бесконечном" ожидании до появления данных. |
||||||
|
|||||||
SilverShield |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 22.8.2007 Репутация: нет Всего: нет |
Вроде разобрался ) Были ошибки с синхронизацией доступа в основном потоке. Спасибо за советы )
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |