Netspirit, у меня почта в профиле не отображается. Не могли бы вы в ЛС вашу почту скинуть, хотел бы обсудить один коммерческий вопрос.
Этот топик читают: Гость
Ответов: 655
Рейтинг: 18
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Открой ini-файл любого моего компонента - там есть
|
|||
карма: 26 |
|
Ответов: 655
Рейтинг: 18
|
|||
Netspirit, скрипт на web странице запрашивает у сервера данные каждые 3 секунды, данные формируются из БД в виде html таблицы, вес таблицы в районе 1200-1500 байт, на формирование данной таблицы и отправку браузеру уходит ~ 180мс.
В это время окно программы чуть подвисает, правильно ли я понимаю что это происходит из-за того что поток "упирается" в скорость выполнения запроса к БД? т.е. пока от БД не будет получен результат поток останавливается? Сейчас запрос к БД оптимизирую, можно ли что-то еще сделать с TCP сервером? Количество клиентов (браузеров) не большое, я бы каждого клиента обрабатывал в отдельном потоке, что для этого требуется поправить в TCPClientServer.pas |
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
AsyncEvents=True призвано частично решить эту проблему. События будут выдаваться и обрабатываться отдельного от GUI-потока. Тормозов в интерфейсе программы быть не должно. Но, поскольку точки событий - одни на все соединения, то соединения стоят в очереди, выдавая события одно за другим, а не параллельно. Сделать реально параллельную обработку соединений можно только в аналоге TCPServerEx.
|
|||
карма: 26 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 15 раз(а), последний 2022-09-20 00:16:06 |
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Да я тоже хочу его сделать. Но нет пока ни времени, ни вдохновения. Ждите.
|
|||
карма: 26 |
|
Ответов: 655
Рейтинг: 18
|
|||
очень ждем)))
Netspirit писал(а): AsyncEvents=True призвано частично решить эту проблему. События будут выдаваться и обрабатываться отдельного от GUI-потока. Тормозов в интерфейсе программы быть не должно. |
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
На то они и параллельные потоки: один поток - интерфейс, остальные - сами по себе. Ну, если другой поток захочет выполнить некоторую операцию синхронно с главным, тогда ему придётся подождать пока главный поток освободится.
|
|||
карма: 26 |
|
Ответов: 655
Рейтинг: 18
|
|||
Добрый вечер.
Netspirit, делаю небольшой чекер сетевых датчиков (20шт) на работе , требуется подключаться к порту 4060 и слушать данные от датчика. Вроде бы все просто, решил сделать мультик в котором разместить ваш TCP клиент, если коннекта нет или оборвался требуется переподключиться, пробовал и таймер и поток, не получается, вываливается приложение. Вот схема, оч мелкая, убрал все лишнее, подскажите пожалуйста в чем проблема...ни как не могу заставить TCP клиент работать в мультике. code_37069.txt ------------ Дoбавленo в 01.19: Я так понимаю один из вариантов вот этот?
И еще вопрос) можно ли подобное реализовать в DLL? Все попытки использовать AsyncConnect в DLL приводят к крашу |
|||
карма: 0 |
| ||
файлы: 1 | code_37069.txt [1.4KB] [940] |
Ответов: 4628
Рейтинг: 749
|
|||
Gunnman писал(а): вываливается приложениеВ процессе работы не обнаружил вылетов. А при завершении нужно останавливать потоки внутри мультика. Кроме того, я не уверен в своём понимании функционирования мультика, когда потоки внутри каждой копии схемы работают одновременно. Gunnman писал(а): можно ли подобное реализовать в DLL? |
|||
карма: 26 |
|
Ответов: 655
Рейтинг: 18
|
|||
Netspirit,
Столкнулся с следующим: 1) Есть TCP сервер code_37071.txt Выполняет роль "эмулятора" сетевого контроллера. 2) Есть второй TCP Сервер code_37072.txt Выполняет роль WEB сервера..собирает данные с контроллеров и выводит на страницу. В схеме №2 по сути TCP сервер и 20 клиентов. Если клиенты отключены от схемы №1, то время выдачи web страницы браузеру ~9-12мс. Если клиенты подключены то время выдачи страницы браузеру ~500-1000мс. Как тестировал: обращался на IP:port и смотрел в Chrome (нажать F12). Короче говоря если в 1 схеме есть TCP сервер и несколько TCP клиентов (которые подключаются к чему-либо в сети) то TCP сервер начинает тормозить. При 20 клиентах при обращении на localhost..тормоза до 500ms для простейшей страницы, при использовании в ЛВС тормоза до 2-3 секунд. Собственно вопрос...почему так происходит? Не делят потоки\ресурсы между собой? Можно ли что-то поправить в исходниках чтобы избавится от тормозов. п.с. почему я вообще начал эту тему: Мне требуется опрашивать сетевые датчики...они парные 10 пар, т.е. 20шт. При подключении датчик в порт шлет данные раз в 1 секунду, нужно сравнивать данные каждой ноды 1 пары и записывать нужный результат в БД, последовательно их опрашивать не вариант, нужно с каждый работать в отдельном соединении. Собственно если проблема в компонентах и ее можно исправить\подправить под себя ,прошу вас как автора подсказать как это сделать. Если это "не баг а фитча" то подскажите как можно избежать тормозов? вынести клиенты в отдельный сервис\приложение\dll? |
|||
карма: 0 |
| ||
файлы: 2 | code_37071.txt [284B] [590], code_37072.txt [8.3KB] [1632] |
Ответов: 4628
Рейтинг: 749
|
|||
Это было сделано в последних редакциях компонентов для увеличения количества возможных соединений в одной программе и ограничения количества параллельных потоков. Данные принимаются для всех соединений сервера и клиентов несколькими потоками, каждый из которых обслуживает группу соединений. В данный момент в одном потоке обслуживается до 64 соединений, то-есть, каждая группа из 64 соединений обрабатывается последовательно.
Уменьшить негативный эффект от этого можешь, установив меньшее значение в TCPClientServer.pas вот здесь: MAX_SOCKETS_PER_THREAD = FD_SETSIZE; MAX_SOCKETS_PER_THREAD = 1, чтобы получить один поток на одно соединение. Тогда все соединения будут работать параллельно.
|
|||
карма: 26 |
| ||
Голосовали: | Gunnman |
Ответов: 655
Рейтинг: 18
|
|||
В общем долго тестировал и пришел к такому результату:
При MAX_SOCKETS_PER_THREAD = 1 возникает ошибка kernel32.dll и приложение вылетает. Пробовал разные значения, не вылетает при MAX_SOCKETS_PER_THREAD = 10, но тогда тормоза о которых я писал выше остаются.. п.с. Windows 7 64bit |
|||
карма: 0 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 13 раз(а), последний 2022-09-20 00:16:06 |
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Ясно. А то я на Windows 2000 проверил - работает, собрался Windows 7 x64 искать.
|
|||
карма: 26 |
|