Вверх ↑
Этот топик читают: Гость
Ответов: 4621
Рейтинг: 746
#211: 2017-04-21 16:42:07 ЛС | профиль | цитата
Gunnman писал(а):
Типа такого?
Да, только связи doSet/doReset перекинь местами - doReset заставляет WaitObject ждать, doSet - возобновляет. Последовательность должна быть такая: doReset-doSend-doWait. Можно поставить ManualReset=False, тогда не нужно будет вызывать doReset.
И да, предлагаю голосовать за такое изменение компонента Events - /topic/57987/4
Gunnman писал(а):
а Events можно использовать с паралельным потоком?
И только. Любая остановка главного потока приводит к зависанию интерфейса приложения и всех событий, выполняющихся в главном потоке (например, Timer или события TCP компонентов с AsyncEvents=False). А вот в консольных приложениях этот приём используется для предотвращения закрытия программы - смотри консольные примеры к TCP компонентам.

Редактировалось 4 раз(а), последний 2017-04-24 10:57:21
карма: 26

0
Ответов: 817
Рейтинг: 52
#212: 2017-05-23 20:59:50 ЛС | профиль | цитата
Добрый день!
Вот эта схемка должна работать (по логике), но не работает.
Схема

Add(MainForm,2953706,42,63)
{
Width=555
}
Add(Button,12708387,231,238)
{
Left=10
Top=10
Width=195
Caption="Запустит сервер"
link(onClick,2093243:doStartServer,[])
}
Add(Button,1581217,231,385)
{
Left=10
Top=40
Width=195
Caption="Подключиться к серверу"
link(onClick,13705605:doConnect,[(313,391)(313,377)])
}
Add(TCPServer,2093243,315,231)
{
Port=11111
link(onReceive,6461222:doEvent,[(360,237)(360,181)])
link(onClientConnect,6889360:doValue,[])
link(ClientID,6889360:Value,[(328,219)(418,219)(418,282)(377,282)])
}
Add(TCPClient,13705605,364,357)
{
IP="127.0.0.1"
Port=11111
link(onReceive,15155205:doConvert,[])
}
Add(Button,7497912,231,343)
{
Left=10
Top=70
Width=195
Caption="Получить картинку"
Data=String(1)
link(onClick,13705605:doSend,[(313,349)(313,363)])
}
Add(Memory,6889360,371,238)
{
}
Add(ScreenShort,11628527,434,168)
{
link(onCapture,15239341:doEvent1,[])
}
Add(Hub,8122056,399,175)
{
link(onEvent1,11628527:doCapture,[(423,181)(423,174)])
link(onEvent2,1976137:doCompress,[(424,188)(424,209)])
}
Add(MemoryStream,3864290,518,105)
{
}
Add(BitmapStream,10143796,518,168)
{
link(Stream,2573881:Var2,[])
}
Add(Hub,15239341,483,168)
{
link(onEvent1,3864290:doClear,[(507,174)(507,118)])
link(onEvent2,10143796:doWrite,[])
}
Add(GetDataEx,2573881,518,147)
{
link(Data,3864290:Stream,[])
}
Add(ZLIB,1976137,560,203)
{
link(onStream,4358992:doConvert,[])
link(Stream,2573881:Var3,[(566,152)])
}
Add(BitmapStream,10775830,560,357)
{
link(onRead,4002693:doLoad,[])
}
Add(Image,4002693,616,357)
{
Left=280
Top=25
Width=185
Height=185
}
Add(ZLIB,13934601,504,357)
{
link(onStream,10775830:doRead,[])
}
Add(StreamConvertor,15155205,434,357)
{
Mode=7
link(onResult,13934601:doCompress,[])
}
Add(StreamConvertor,4358992,609,203)
{
Mode=6
link(onResult,2093243:doSend,[(651,209)(651,94)(303,94)(303,237)])
}
Add(Debug,6461222,371,175)
{
link(onEvent,8122056:doEvent1,[])
}

Выдает страшную ошибку, ткните меня носом, где я не правильно что то сделал, уж задолбался.
err.png

Редактировалось 1 раз(а), последний 2017-05-23 21:00:40
карма: 1

0
Ответов: 4621
Рейтинг: 746
#213: 2017-05-24 12:54:31 ЛС | профиль | цитата
Разнеси сервер и клиент в разные приложения. Либо используй AsyncEvents=True, и doSendAsync. Потому что пока ты отправляешь данные (синхронно в главном потоке), главный поток ожидает пока они не будут отправлены. В это время принять данные можно только при AsyncEvents=True, но вывести их в визуальные компоненты невозможно, потому что главный поток занят. Где-то там ошибка появляется.

Кроме того, событие onReceive выдаёт данные не за один раз, а порциями примерно до 8КБ. Тебе в событии onReceive нужно дождаться прихода всех данных. Сделать это можно, если перед данными отправлять их длину, а при приёме считывать длину и накапливать данные до получения этого количества. Пример можно глянуть тут: /topic/65137.

Редактировалось 1 раз(а), последний 2017-05-24 12:55:02
карма: 26

1
Голосовали:-= DriveR =-
Ответов: 817
Рейтинг: 52
#214: 2017-05-24 12:58:01 ЛС | профиль | цитата
Netspirit, Спасибо. Буду пробовать, но чувствую, что вопросов будет много.
карма: 1

0
Ответов: 817
Рейтинг: 52
#215: 2017-05-24 21:20:34 ЛС | профиль | цитата
Еще раз спасибо, нашел все что надо http://forum.hiasm.com/post/277633
и понял что да как.
карма: 1

0
Ответов: 817
Рейтинг: 52
#216: 2017-05-28 16:00:08 ЛС | профиль | цитата
Netspirit, добрый день!
Подскажите, где можно взять подробную информацию по кодам ошибок?
карма: 1

0
Ответов: 4621
Рейтинг: 746
#217: 2017-05-29 10:51:20 ЛС | профиль | цитата
Коды ошибок можно посмотреть здесь: http://msdn.microsoft.com/en-us/library/ms681381.aspx
карма: 26

0
Ответов: 655
Рейтинг: 18
#218: 2017-08-31 10:18:39 ЛС | профиль | цитата
Netspirit, Windows Server 2008r2 ...подключаюсь к серверу, согласно логике программы если клиент не шлет ни чего в течении 5 сек происходит отключение клиента. Netstat показывает что сокет WAIT_CLOSE через минуту исчезает. Если клиент отключается сам то WAIT_CLOSE сокетов нет. Так и должно быть?

Редактировалось 1 раз(а), последний 2017-08-31 10:21:22
карма: 0

0
Ответов: 4621
Рейтинг: 746
#219: 2017-08-31 10:31:15 ЛС | профиль | цитата
Не совсем понятно: в первом случае "через минуту исчезает" и во втором "сокетов нет".
Отключая клиента, мы принудительно закрываем сокет соединения на стороне сервера. Предполагаю, после этого система может ждать какой-то реакции от клиента (по-моему, там клиенту посылается TCP-пакет FIN и выдерживается какой-то таймаут). Когда соединение закрывает клиент - это и есть последняя команда, которой от него можно ожидать, поэтому ресурсы соединения освобождаются сразу.
Если программа работает как и требуется, тогда это просто такое внутреннее поведение системы.

Редактировалось 1 раз(а), последний 2017-08-31 10:32:12
карма: 26

0
Ответов: 655
Рейтинг: 18
#220: 2017-08-31 10:41:04 ЛС | профиль | цитата
Если соединение закрывается сервером то 1 минуту в netstat на сервере отображаются сокеты WAIT_CLOSE, если соединение закрывается клиентом то на сервере в netstat нет сокетов WAIT_CLOSE.
Netspirit писал(а):
Если программа работает как и требуется, тогда это просто такое внутреннее поведение системы.

Да, работает на Ваших компонентах отлично, просто любопытно почему сервер отключая клиента еще ждет от него что-то..

Редактировалось 1 раз(а), последний 2017-08-31 10:41:27
карма: 0

0
Ответов: 4621
Рейтинг: 746
#221: 2017-08-31 10:45:54 ЛС | профиль | цитата
Похоже, причина в
Netspirit писал(а):
по-моему, там клиенту посылается TCP-пакет FIN
Проверить на клиенте - если мониторить сокет, открытый клиентом, в момент, когда клиент отключается сам, должно быть такое же поведение.

Редактировалось 2 раз(а), последний 2017-08-31 17:17:09
карма: 26

0
Ответов: 655
Рейтинг: 18
#222: 2017-08-31 11:42:58 ЛС | профиль | цитата
Да на клиенте так же появляются на минуту сокеты WAIT_CLOSE
карма: 0

0
Ответов: 165
Рейтинг: 7
#223: 2018-06-01 12:42:52 ЛС | профиль | цитата
Netspirit-хороший компонент.
мне кажется клиент при отсутствии соединения зря ресурсы потребляет.
Нужно в схеме sleep выбросить вообще, а задержку построить на mmtimer
mmtimer.jpg
карма: 1

0
Ответов: 4621
Рейтинг: 746
#224: 2018-06-01 13:05:11 ЛС | профиль | цитата
А, так это проблема реализации Sleep. Никто не хочет переделать.
карма: 26

0
Ответов: 165
Рейтинг: 7
#225: 2018-06-01 15:46:40 ЛС | профиль | цитата
да, это надо на системном уровне робить
а вообще этот страхолюдный sleep вообще из пакета надобно выкинуть
попробую заняться
карма: 1

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