Вверх ↑
Этот топик читают: Гость
Ответов: 655
Рейтинг: 18
#151: 2015-10-22 13:50:50 ЛС | профиль | цитата
Netspirit, у меня почта в профиле не отображается. Не могли бы вы в ЛС вашу почту скинуть, хотел бы обсудить один коммерческий вопрос.
карма: 0

0
Ответов: 4628
Рейтинг: 749
#152: 2015-10-22 14:08:12 ЛС | профиль | цитата
Открой ini-файл любого моего компонента - там есть
карма: 26

0
Ответов: 655
Рейтинг: 18
#153: 2016-03-03 01:21:16 ЛС | профиль | цитата
Netspirit, скрипт на web странице запрашивает у сервера данные каждые 3 секунды, данные формируются из БД в виде html таблицы, вес таблицы в районе 1200-1500 байт, на формирование данной таблицы и отправку браузеру уходит ~ 180мс.
В это время окно программы чуть подвисает, правильно ли я понимаю что это происходит из-за того что поток "упирается" в скорость выполнения запроса к БД? т.е. пока от БД не будет получен результат поток останавливается?

Сейчас запрос к БД оптимизирую, можно ли что-то еще сделать с TCP сервером? Количество клиентов (браузеров) не большое, я бы каждого клиента обрабатывал в отдельном потоке, что для этого требуется поправить в TCPClientServer.pas
карма: 0

0
Ответов: 4628
Рейтинг: 749
#154: 2016-03-03 11:32:30 ЛС | профиль | цитата
AsyncEvents=True призвано частично решить эту проблему. События будут выдаваться и обрабатываться отдельного от GUI-потока. Тормозов в интерфейсе программы быть не должно. Но, поскольку точки событий - одни на все соединения, то соединения стоят в очереди, выдавая события одно за другим, а не параллельно. Сделать реально параллельную обработку соединений можно только в аналоге TCPServerEx.
карма: 26

0
Гость
Ответов: 17029
Рейтинг: 0
#155: 2016-03-03 12:01:42 правка | ЛС | профиль | цитата


Редактировалось 15 раз(а), последний 2022-09-20 00:16:06
карма: 0

0
Ответов: 4628
Рейтинг: 749
#156: 2016-03-03 12:29:33 ЛС | профиль | цитата
Да я тоже хочу его сделать. Но нет пока ни времени, ни вдохновения. Ждите.
карма: 26

0
Ответов: 655
Рейтинг: 18
#157: 2016-03-03 14:59:35 ЛС | профиль | цитата
очень ждем)))

Netspirit писал(а):
AsyncEvents=True призвано частично решить эту проблему. События будут выдаваться и обрабатываться отдельного от GUI-потока. Тормозов в интерфейсе программы быть не должно.
я так понимаю тормоза интерфейса на другие потоки в приложении не влияют?
карма: 0

0
Ответов: 4628
Рейтинг: 749
#158: 2016-03-03 15:25:52 ЛС | профиль | цитата
На то они и параллельные потоки: один поток - интерфейс, остальные - сами по себе. Ну, если другой поток захочет выполнить некоторую операцию синхронно с главным, тогда ему придётся подождать пока главный поток освободится.
карма: 26

0
Ответов: 655
Рейтинг: 18
#159: 2016-03-24 01:36:24 ЛС | профиль | цитата
Добрый вечер.
Netspirit, делаю небольшой чекер сетевых датчиков (20шт) на работе , требуется подключаться к порту 4060 и слушать данные от датчика.
Вроде бы все просто, решил сделать мультик в котором разместить ваш TCP клиент, если коннекта нет или оборвался требуется переподключиться, пробовал и таймер и поток, не получается, вываливается приложение.
Вот схема, оч мелкая, убрал все лишнее, подскажите пожалуйста в чем проблема...ни как не могу заставить TCP клиент работать в мультике.
code_37069.txt
------------ Дoбавленo в 01.19:
Я так понимаю один из вариантов вот этот?
Add(MultiElementEx,7924571,322,112)
{
Mode=1
link(data,7784919:doEvent1,[(373,118)(373,111)])
}
BEGIN_SDK
Add(EditMultiEx,3508206,21,21)
{
WorkCount=#5:##add|8:##select|9:##hselect|
EventCount=#4:data|
VarCount=#13:##eventHandle|0:|
Width=489
Point(##add)
Point(##select)
Point(##hselect)
Point(##eventHandle)
link(##select,7656509:doWork1,[(154,34)])
link(##hselect,7656509:doWork2,[(86,41)(86,97)])
}
Add(TCPClient,15207703,287,77)
{
IP="192.168.0.233"
Port=4060
AsyncConnect=1
Point(onErrorConnect)
Point(onErrorSend)
link(onErrorConnect,3508206:data,[(430,111)(430,27)])
}
Add(HubEx,7656509,150,91)
{
link(onEvent,15207703:doConnect,[])
}
END_SDK
Add(Button,14431410,154,112)
{
Left=100
Top=20
link(onClick,3637955:doFor,[])
}
Add(Hub,5366368,273,112)
{
link(onEvent1,7924571:##add,[])
link(onEvent2,7924571:##select,[])
}
Add(StrList,9387499,434,112)
{
link(Str,7924571:##eventHandle,[(440,100)(365,100)(365,155)(328,155)])
}
Add(If_else,13019571,406,189)
{
Op2=Integer(0)
link(onFalse,10231186:doEnum,[])
link(Op1,9387499:Count,[(412,170)(447,170)])
}
Add(ArrayEnum,10231186,462,196)
{
link(onItem,1035810:doEvent1,[])
link(Array,9387499:Array,[(468,176)(454,176)])
}
Add(Thread,454066,294,189)
{
Delay=1
link(onExec,13019571:doCompare,[])
}
Add(Hub,1035810,518,196)
{
link(onEvent1,12816250:In,[])
link(onEvent2,1222769:doData,[])
}
Add(LineBreak,1688034,266,133)
{
Caption="try"
link(Out,7924571:##hselect,[(309,139)(309,132)])
Primary=[12816250,364,63]
}
Add(DoData,1222769,546,203)
{
link(onEventData,35443:In,[])
link(Data,10231186:Index,[(552,191)(514,191)(514,240)(475,240)])
}
Add(LineBreak,2101120,382,126)
{
Caption="del"
link(Out,9387499:doDelete,[])
Primary=[35443,215,77]
}
Add(Hub,7784919,392,105)
{
link(onEvent1,16292451:doNext,[])
link(onEvent2,9387499:doAdd,[])
}
Add(CounterEx,16292451,546,105)
{
Max=300
}
Add(Label,13572689,546,147)
{
Left=105
Top=70
link(Text,16292451:Count,[])
}
Add(Timer,7441405,497,147)
{
link(onTimer,13572689:doText,[])
}
Add(For,3637955,210,112)
{
End=20
link(onEvent,5366368:doEvent1,[])
}

------------ Дoбавленo в 01.36:
И еще вопрос) можно ли подобное реализовать в DLL? Все попытки использовать AsyncConnect в DLL приводят к крашу
карма: 0

0
файлы: 1code_37069.txt [1.4KB] [940]
Ответов: 4628
Рейтинг: 749
#160: 2016-03-24 11:22:03 ЛС | профиль | цитата
Gunnman писал(а):
вываливается приложение
В процессе работы? Или при завершении?
В процессе работы не обнаружил вылетов. А при завершении нужно останавливать потоки внутри мультика.
Кроме того, я не уверен в своём понимании функционирования мультика, когда потоки внутри каждой копии схемы работают одновременно.

Gunnman писал(а):
можно ли подобное реализовать в DLL?
Нужна схемка. Сами компоненты, предположительно, не должны иметь проблем с DLL. Там есть проблема с обменом строками между DLL и программой (не связана с данными компонентами).
карма: 26

0
Ответов: 655
Рейтинг: 18
#161: 2016-03-25 15:06:19 ЛС | профиль | цитата
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

0
файлы: 2code_37071.txt [284B] [590], code_37072.txt [8.3KB] [1632]
Ответов: 4628
Рейтинг: 749
#162: 2016-03-25 15:19:42 ЛС | профиль | цитата
Это было сделано в последних редакциях компонентов для увеличения количества возможных соединений в одной программе и ограничения количества параллельных потоков. Данные принимаются для всех соединений сервера и клиентов несколькими потоками, каждый из которых обслуживает группу соединений. В данный момент в одном потоке обслуживается до 64 соединений, то-есть, каждая группа из 64 соединений обрабатывается последовательно.
Уменьшить негативный эффект от этого можешь, установив меньшее значение в TCPClientServer.pas вот здесь:
MAX_SOCKETS_PER_THREAD = FD_SETSIZE;
MAX_SOCKETS_PER_THREAD = 1, чтобы получить один поток на одно соединение. Тогда все соединения будут работать параллельно.


карма: 26

1
Голосовали:Gunnman
Ответов: 655
Рейтинг: 18
#163: 2016-03-26 23:50:30 ЛС | профиль | цитата
В общем долго тестировал и пришел к такому результату:

При MAX_SOCKETS_PER_THREAD = 1 возникает ошибка kernel32.dll и приложение вылетает.
Пробовал разные значения, не вылетает при MAX_SOCKETS_PER_THREAD = 10, но тогда тормоза о которых я писал выше остаются..

п.с. Windows 7 64bit
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#164: 2016-03-28 17:12:15 правка | ЛС | профиль | цитата


Редактировалось 13 раз(а), последний 2022-09-20 00:16:06
карма: 0

0
Ответов: 4628
Рейтинг: 749
#165: 2016-03-28 17:38:33 ЛС | профиль | цитата
Ясно. А то я на Windows 2000 проверил - работает, собрался Windows 7 x64 искать.
карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)