Вверх ↑
Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
#181: 2016-04-06 01:23:27 правка | ЛС | профиль | цитата


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

0
Ответов: 655
Рейтинг: 18
#182: 2016-04-11 12:15:52 ЛС | профиль | цитата
Netspirit Привет! Прошла мучительная неделя ожидания удалось внести правки?
карма: 0

0
Ответов: 4630
Рейтинг: 749
#183: 2016-04-11 12:52:20 ЛС | профиль | цитата
Не так быстро. У меня сейчас нет ни капли свободного времени, так что пока не смотрел. Там нужны часы вдумчивой расстановки дебагов и прогонов. Как только дойдут руки - сделаю.
карма: 26

0
Ответов: 4630
Рейтинг: 749
#184: 2016-04-23 22:01:48 ЛС | профиль | цитата
Gunnman, протестируй это: tcpclientserver 2016-04-24 error fix test.rar
карма: 26

0
Гость
Ответов: 17029
Рейтинг: 0
#185: 2016-05-04 11:25:23 правка | ЛС | профиль | цитата


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

0
Ответов: 655
Рейтинг: 18
#186: 2016-05-13 16:33:49 ЛС | профиль | цитата
Netspirit, Выше я, с датой регистрации 1970 год глюк.
В общем потестировал, kernel32.dll больше не ругается, но runtime при закрытии схемы 1 раз словил, поковыряю схему.
Спасибо!!! Думаю в шапке можно заменять на текущую версию.
карма: 0

0
Ответов: 4630
Рейтинг: 749
#187: 2016-05-13 16:44:34 ЛС | профиль | цитата
Обновил в первом посте компоненты. Исправлены некоторые ошибки.
У кого уже были установлены - достаточно заменить NSThreads.pas, TCPClientServer.pas

Gunnman, обновись тоже и попробуй. Там были дополнительные изменения.
карма: 26

2
Голосовали:Gunnman, Konst
Ответов: 655
Рейтинг: 18
#188: 2016-05-13 17:08:48 ЛС | профиль | цитата
Netspirit, Я в отъездах был, сейчас скачаю соберу схемку и запущу на 2х серверах, о результатах доложу на след неделе..надо чтобы подольше потестировалось.
карма: 0

0
Ответов: 655
Рейтинг: 18
#189: 2016-06-30 21:43:31 ЛС | профиль | цитата
Netspirit, привет. Служба, в ней 10 TCP клиентов, подключаются на 127.0.0.1:9090 (обычное приложение), после подключения через разное время (обычно в течении часа-двух) служба вываливается.
В события вижу такое:
Код исключения: 0xc0000005
Смещение ошибки: 0x00001fb8
Идентификатор сбойного процесса: 0xf18
Время запуска сбойного приложения: 0x01d1d2de6257cf11
Путь сбойного приложения: c:\trm\trmctrl.exe
Путь сбойного модуля: c:\trm\trmctrl.exe

Ошибка все время одинаковая.
Служба ни чего не делает, просто подключается к серверу и все. Ни одно лишнего компонента, мультик, TCP клиент.
Сервер то же ни чего не делает, принимает подключения и все.
------------ Дoбавленo в 18.19:
0xc0000005 вроде как access violation, если делаю приложение а не службу, то просто "Project1.exe завершил работу"
------------ Дoбавленo в 18.33:
FD_SETSIZE = 1 стоит, у TCP клиентов асинхронный тип подключения. п.с. если 1 TCP клиент в схеме, то все ок, работает сутками.
------------ Дoбавленo в 18.34:
Иногда в журнале ошибка kernelbase.dll
------------ Дoбавленo в 21.43:
Баг был после подвисания драйвера сетевой карты о_О. Перезагрузка компа, 3 часа служба работает, тестирую. Сорри что поднял панику..
карма: 0

0
Ответов: 655
Рейтинг: 18
#190: 2016-12-13 10:04:30 ЛС | профиль | цитата
Netspirit, правильно ли я понимаю что при FD_SETSIZE=1 события выдаваемые TCPServer происходят от 1 потока?

Возможно криво выразился, я имею ввиду подключается клиент №1, события onConnect,onReceive,onDisconnect данного клиента - это один поток, а такие же события клиент №2 это другой поток?

Или же все события происходят в одном потоке просто выдаются поочередно по принципу "кто первый того и тапки"?
карма: 0

0
Ответов: 4630
Рейтинг: 749
#191: 2016-12-13 11:58:18 ЛС | профиль | цитата
Gunnman писал(а):
происходят от 1 потока?

Gunnman писал(а):
просто выдаются поочередно
Оба варианта сразу: каждый компонент получает данные в своём потоке (2 потока), но выдают данные по-очереди: точка события то одна. Вызывать одно и то же событие одновременно из нескольких потоков (пока не отработало предыдущее событие) невозможно - будет разрушение данных в схеме после события, и разрулить это никаким образом невозможно.
Максимум, можно вызывать, например, onReceive одного подключения и onConnect/onDisconnect/onSend других подключений. Но это, во-первых, вынуждает избавиться от общих точек, таких как CurClientID (выдавать все нужные данные в MT-потоке), во-вторых, требует обязательной установки критических секций на выходе из этих событий при доступе к общим участкам схемы (очень скрупулёзного построения схемы). Выигрыш от этого незначительный (только некоторые части схемы получат параллельную обработку, а некоторые так и останутся последовательными, плюс, увеличится сложность разработки схемы).
карма: 26

0
Ответов: 655
Рейтинг: 18
#192: 2017-01-31 20:07:27 ЛС | профиль | цитата
Приветствую!
Netspirit, подскажите по такому вопросу, есть схема в ней 2 TCPServerEx, схема работает пару минут и appcrash, av ntdll, если в схему добавить ваш сервер и непременно его запустить (иначе фокус не удастся) то схема работает сутками.
Я понимаю что вы не разработчик Ex сервера, но может есть какие-то идеи?
П. С. Ex сервер приходится использовать т.к. у самого ни разу не получилось собрать аналогичную схему на базе вашего компонента и мультика.
П. П. С. 2 ex сервера в одной схеме - 2 потока, два ваших - 3. Еx сервера использую один поток не смотря на их кол-во в схеме?
карма: 0

0
Ответов: 4630
Рейтинг: 749
#193: 2017-02-01 12:44:26 ЛС | профиль | цитата
Gunnman писал(а):
Я понимаю что вы не разработчик Ex сервера, но может есть какие-то идеи?
Нужно на основе моих компонентов реализовать свой TCP_ServerEx. Я пока не могу к этому подобраться - нет целостной картины как оно должно быть реализовано.

Gunnman писал(а):
Еx сервера использую один поток не смотря на их кол-во в схеме?
Сам компонент TCP_ServerEx потоков не создаёт - он пользуется услугами системы: ему приходят сообщения о новом соединении, приходе данных. В системе для этого вполне может использоваться один поток. В моем сервере наоборот вся работа основана на своих потоках, и в данном случае каждый экземпляр компонента создаёт один поток для приёма входящих подключений. Это нормально.
А вот для приёма данных от текущих соединений уже были предприняты меры по уменьшению количества потоков (и увеличения количества возможных соединений). Все серверы и клиенты в схеме пользуются одним и тем же набором потоков, и по-умолчанию один поток обслуживает 64 соединения (можно заметить по появлению нового потока при подключении 65-го клиента).

Gunnman писал(а):
то схема работает сутками
Я приложил к этому много усилий
карма: 26

0
Ответов: 655
Рейтинг: 18
#194: 2017-03-07 04:47:55 ЛС | профиль | цитата
Netspirit, привет!

Вылетает вот такая схема сразу при нажатии на кнопку либо в течении 10-20 минут.


Add(MultiElementEx,913302,189,126)
{
Mode=1
}
BEGIN_SDK
Add(EditMultiEx,1744314,21,21)
{
WorkCount=#5:##add|
Width=356
Point(##add)
link(##add,15483795:doStart,[(53,27)(53,111)])
}
Add(TCPClient,4707401,266,98)
{
IP="192.168.0.100"
Port=9090
AsyncConnect=1
Point(onErrorConnect)
Point(onErrorSend)
link(onDisconnect,5797429:doWork2,[])
link(onErrorConnect,13699593:doWork2,[])
link(onErrorSend,13699593:doWork3,[(312,139)])
}
Add(Thread,15483795,105,105)
{
link(onExec,16626588:doEvent,[])
}
Add(Switch,16355607,161,49)
{
DataOn=Integer(1)
DataOff=Integer(0)
Point(doOn)
Point(State)
}
Add(IndexToChanel,16626588,161,105)
{
Point(Index)
link(onEvent1,15945999:doEvent1,[])
link(Index,16355607:State,[])
}
Add(Hub,15945999,210,105)
{
link(onEvent1,16355607:doOn,[(236,111)(236,90)(149,90)(149,69)])
link(onEvent2,4707401:doConnect,[])
}
Add(HubEx,5797429,308,119)
{
Angle=3
link(onEvent,16355607:doReset,[(312,35)(149,35)(149,62)])
}
Add(HubEx,13699593,308,126)
{
Angle=3
link(onEvent,5797429:doWork3,[])
}
END_SDK
Add(For,9428280,140,126)
{
End=29
link(onEvent,913302:##add,[])
}
Add(Button,16480008,84,126)
{
Left=80
Top=125
link(onClick,9428280:doFor,[])
}


--- Добавлено в 2017-03-07 04:53:18

Мне требуется параллельно проверять 50 сетевых датчиков и отлавливать дисконнекты (мало вероятно конечно, что провода оборвут, но все же проверка на всякий случай нужна).
Как правильно использовать AsyncConnect?

Редактировалось 1 раз(а), последний 2017-03-07 04:53:18
карма: 0

0
Ответов: 4630
Рейтинг: 749
#195: 2017-03-07 12:49:08 ЛС | профиль | цитата
Gunnman писал(а):
Как правильно использовать AsyncConnect?
Ну, действует оно так, как и остальные асинхронные методы: вызывается метод doConnect, стартует параллельный поток, в котором происходит подключение. Выполнение метода doConnect заканчивается. После этого, когда подключено или невозможно подключится - выдаётся событие onConnect/onErrorConnect соответственно. Для использования в цикле оно не подходит.
У тебя, вроде, правильно стоит поток в каждом мультике, только поставить AsyncConnect=False. Ещё поставил AutoReceive=False, чтобы зря каждый раз не создавало поток чтения данных.


Add(MainForm,2953706,21,105)
{
Position=1
}
Add(MultiElementEx,913302,448,91)
{
Mode=1
link(onSwitch,16234302:doSynchronize,[])
}
BEGIN_SDK
Add(EditMultiEx,1744314,21,21)
{
WorkCount=#5:##add|
EventCount=#8:onSwitch|
Width=377
Point(##add)
link(##add,15483795:doStart,[(53,27)(53,118)])
}
Add(TCPClient,4707401,203,98)
{
IP="192.168.0.100"
Port=9090
AutoReceive=0
Point(onErrorConnect)
Point(onErrorSend)
link(onConnect,14925847:doEvent1,[])
link(onErrorConnect,16520789:doWork1,[(291,132)(291,118)])
}
Add(Thread,15483795,105,112)
{
link(onExec,4707401:doConnect,[])
}
Add(Hub,14925847,252,112)
{
link(onEvent1,4707401:doDisconnect,[(279,118)(279,77)(182,77)(182,125)])
link(onEvent2,16520789:doWork2,[])
}
Add(ChanelToIndex,16520789,315,112)
{
link(onIndex,1744314:onSwitch,[(372,118)(372,27)])
}
END_SDK
Add(For,9428280,399,91)
{
End=29
link(onEvent,913302:##add,[])
}
Add(Button,16480008,343,91)
{
Left=5
Top=20
link(onClick,9428280:doFor,[])
}
Add(ListBox,4657886,560,91)
{
Left=85
Top=20
Width=70
Height=235
}
Add(Synchronize,16234302,507,91)
{
link(onSync,4657886:doAdd,[])
}

Редактировалось 1 раз(а), последний 2017-03-07 12:50:22
карма: 26

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