Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2013, 15:41   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Сетевой компонент вставить в поток

Доброго времени суток!

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

Проблема в том, что когда идет долгая сетевая операция(сокет-клиент ждет ответа от сокет-сервера) - виснет вся программа.

Каким образом можно запихать сетевую часть в поток, таким образом чтобы поток существовал столько сколько нужно мне?

Есть мнение, что бесконечный цикл в Execute потока создаст лишнюю нагрузку. Устройств может быть больше 300 буквально, плюс каждое устройство имеет в подчинении др. устройства. И все эти устройства просто повесят программу.
Человек_Борща вне форума Ответить с цитированием
Старый 25.07.2013, 16:36   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может посмотреть на тему Thread Pool?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.07.2013, 16:48   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Пул-потоков и так есть, сейчас это объектный пул.

Общение происходит с сетевым маршрутизатором, который надо опрашивать с интервалом X.
Для запроса:
Создать поток, создать сокет, запросить<=>получить, прибить поток - не вариант. Слишком большая нагрузка создается.

Может можно как-то создать поток 1 раз?

Ну или может я вас не так понял?
Человек_Борща вне форума Ответить с цитированием
Старый 25.07.2013, 16:50   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если ваш объектый пул потоков только содержит все потоки в кучке то это не пул потоков.
создается поток на паузе, потом он получает задание, и снимается с паузы, когда он сделал задание он рапортует и встает обратно на паузу.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.07.2013, 17:12   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

мм вариант, пойду попробую.
Человек_Борща вне форума Ответить с цитированием
Старый 27.07.2013, 02:06   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Доброго времени суток!

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

Проблема в том, что когда идет долгая сетевая операция(сокет-клиент ждет ответа от сокет-сервера) - виснет вся программа.

Каким образом можно запихать сетевую часть в поток
Вот что меня реально бесит (сейчас уже не так сильно как лет 10 назад, но всё же) так это то, что почти все кто пишет программы, компоненты, процедуры и функции для Communications думают только о потоках! А про систему событий (Events) встроенную в ОС Windows мало кто помнит. Ну разве только те, кто реально работал под ДОС.
А ведь все проблемы с "управлением сетевыми девайсами" перестали бы быть проблемами, если бы с ними работали так, как они заточены, а не так как "много примеров в И-Нете".
northener вне форума Ответить с цитированием
Старый 27.07.2013, 02:51   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

думаю проще сказать, что вы имели в виду асинхронные вызовы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.07.2013, 12:24   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

События мало чем помогут, честно. Не тот случай. Выносить сетевой компонент надо именно в поток, чтобы не тормозил программу и не мешал другим. Хотя я может и не пров, не знаю о каких событиях точно идет речь, и уж тем более как их применить к моей ситуации.
Человек_Борща вне форума Ответить с цитированием
Старый 30.07.2013, 16:27   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
создается поток на паузе, потом он получает задание, и снимается с паузы, когда он сделал задание он рапортует и встает обратно на паузу.
Что-то я вас не допонимаю...

У меня не просто поток с заданиями, а обычный сетевой сокет, который при каких-то случаях вешает всю программу. Например: указал не тот IP и сиди, жди 30 сек, пока программа отзовется, т.к. сокет ждет ответ от "битого" IP.
Мне надо эту проблему как-то решить.

Но вот как?

Сокет позволяет:
Подключаться по указанному IP, Port, User, Password
Делать запросы
Возвращать объект с данными(Результат запроса)
Отключаться

Как это грамотно ввернуть в TThread?

Пробовал такую хитрость:
Код:
  TROSClientThread = class(TThread)
  private
    fClient: TRosApiClient;
  protected
    procedure Execute; override;
  public
    property Client: TRosApiClient read fClient write fClient;
    constructor Create; overload;
    destructor Destroy; override;
  end;
...
{ TROSClientThread }

constructor TROSClientThread.Create;
begin
  inherited Create(true);
  FreeOnTerminate := true;
end;

destructor TROSClientThread.Destroy;
begin
  inherited;
end;

procedure TROSClientThread.Execute;
var
  Cl: TRosApiClient;
begin
  Cl := TRosApiClient.Create;
  try
    fClient := Cl;
    while not Terminated do
    begin
      Sleep(200);
    end;
  finally
    Cl.Disconnect;
    FreeAndNil(Cl);
  end;
end;

Я ожидал, что созданный внутри сокет будет там и через property я спокойно смогу работать через TThread с этим сокетом.
Но что-то не работает оно.
Человек_Борща вне форума Ответить с цитированием
Старый 30.07.2013, 17:40   #10
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Ваш клиент (TRosApiClient) использует блокирующие сокеты, верно?
Если да то по этой причине и приходится ждать 30 секунд, и во время работы сокета (соединения с несуществующим ип) приходится ждать т.к. поток занят этой работой (ожиданием ответа от железки) и не может выполнять других действий.
Lime вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сохранить компонент в поток и сразу же его загрузить в 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