![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
Доброго времени суток!
Пишу приложение для управления сетевыми девайсами, т.е. программа одновременно работает с несколькими устройствами по сети. Проблема в том, что когда идет долгая сетевая операция(сокет-клиент ждет ответа от сокет-сервера) - виснет вся программа. Каким образом можно запихать сетевую часть в поток, таким образом чтобы поток существовал столько сколько нужно мне? Есть мнение, что бесконечный цикл в Execute потока создаст лишнюю нагрузку. Устройств может быть больше 300 буквально, плюс каждое устройство имеет в подчинении др. устройства. И все эти устройства просто повесят программу. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
может посмотреть на тему Thread Pool?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
Пул-потоков и так есть, сейчас это объектный пул.
Общение происходит с сетевым маршрутизатором, который надо опрашивать с интервалом X. Для запроса: Создать поток, создать сокет, запросить<=>получить, прибить поток - не вариант. Слишком большая нагрузка создается. Может можно как-то создать поток 1 раз? Ну или может я вас не так понял? |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
если ваш объектый пул потоков только содержит все потоки в кучке то это не пул потоков.
создается поток на паузе, потом он получает задание, и снимается с паузы, когда он сделал задание он рапортует и встает обратно на паузу. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
мм вариант, пойду попробую.
|
![]() |
![]() |
![]() |
#6 | |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,926
|
![]() Цитата:
А ведь все проблемы с "управлением сетевыми девайсами" перестали бы быть проблемами, если бы с ними работали так, как они заточены, а не так как "много примеров в И-Нете". |
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
думаю проще сказать, что вы имели в виду асинхронные вызовы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
События мало чем помогут, честно. Не тот случай. Выносить сетевой компонент надо именно в поток, чтобы не тормозил программу и не мешал другим. Хотя я может и не пров, не знаю о каких событиях точно идет речь, и уж тем более как их применить к моей ситуации.
|
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]() Цитата:
У меня не просто поток с заданиями, а обычный сетевой сокет, который при каких-то случаях вешает всю программу. Например: указал не тот IP и сиди, жди 30 сек, пока программа отзовется, т.к. сокет ждет ответ от "битого" IP. Мне надо эту проблему как-то решить. Но вот как? Сокет позволяет: Подключаться по указанному IP, Port, User, Password Делать запросы Возвращать объект с данными(Результат запроса) Отключаться Как это грамотно ввернуть в TThread? Пробовал такую хитрость: Код:
Я ожидал, что созданный внутри сокет будет там и через property я спокойно смогу работать через TThread с этим сокетом. Но что-то не работает оно. |
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 10.02.2009
Сообщений: 815
|
![]()
Ваш клиент (TRosApiClient) использует блокирующие сокеты, верно?
Если да то по этой причине и приходится ждать 30 секунд, и во время работы сокета (соединения с несуществующим ип) приходится ждать т.к. поток занят этой работой (ожиданием ответа от железки) и не может выполнять других действий. |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как сохранить компонент в поток и сразу же его загрузить в BLOB поле? | artemavd | Общие вопросы Delphi | 17 | 17.05.2012 23:52 |
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. | Человек_Борща | Общие вопросы Delphi | 8 | 27.02.2012 23:24 |
как вставить текст в delphi в компонент memo | dimusiko | Помощь студентам | 3 | 31.01.2012 19:23 |
[Поиск] Компонент локализации строковых ресурсов и сторонних компонент delphi | Человек_Борща | Компоненты Delphi | 3 | 23.08.2011 10:44 |
Поток. Не получается создать поток. Выдает ошибки при запуске | bigory | Общие вопросы по Java, Java SE, Kotlin | 3 | 23.09.2010 00:40 |