Вверх ↑
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
#1: 2019-12-12 14:21:01 ЛС | профиль | цитата
Здравствуйте форумчане!
Раньше не сталкивался с подобным и пока никак не слеплю простейшую вещь: открыть/переоткрыть соединение в потоке, дождаться рукопожатия "PJLINK*" и, заслав команду, получить ответ.

Без потока все ок, с потоком же завершается сразу после установки соединения и не удается с Events его задержать до окончания приема ответа. Подсобите правильным пинком.
Add(TCP_Client,96010,245,175)
{
Port=4352
IP="192.168.86.36"
link(onRead,11266684:doSynchronize,[])
link(Data,15711235:Result,[(258,145)(370,145)])
}
Add(Button,10593311,21,238)
{
Left=15
Top=40
Caption="Слать"
link(onClick,69202:doStart,[])
}
Add(Label,2186510,602,224)
{
Left=15
Top=75
Height=20
}
Add(Hub,5377,175,189)
{
link(onEvent2,96010:doSend,[(235,202)(235,195)])
}
Add(Hub,7443013,350,175)
{
OutCount=3
link(onEvent3,15684426:doValue,[(375,195)(375,202)])
}
Add(StrMask,14505764,434,217)
{
Mask="PJLINK*"
link(onFalse,275603:doEvent1,[(480,223)(480,230)])
link(onTrue,5377:doEvent1,[(473,230)(473,153)(165,153)(165,195)])
link(Str,15684426:Value,[(440,187)(412,187)(412,236)(391,236)])
}
Add(Memory,15684426,385,196)
{
link(onData,14505764:doCompare,[(424,202)(424,223)])
}
Add(Hub,1554760,140,238)
{
OutCount=3
link(onEvent1,96010:doClose,[(228,244)(228,188)])
link(onEvent2,96010:doOpen,[(214,251)(214,181)])
link(onEvent3,12965886:doWait,[(277,258)(277,321)])
}
Add(Thread,69202,84,238)
{
Delay=0
FastStop=0
link(onExec,1554760:doEvent1,[])
}
Add(Synchronize,11266684,294,175)
{
link(onSync,7443013:doEvent1,[])
}
Add(Events,5953648,539,266)
{
ManualReset=1
}
Add(Hub,275603,490,224)
{
link(onEvent1,2186510:doText,[])
link(onEvent2,5953648:doSet,[(529,237)(529,272)])
}
Add(WaitObject,12965886,539,315)
{
link(ObjHandle,5953648:ObjHandle,[])
}
Add(StrCat,15711235,364,63)
{
Str1="%1"
}


Редактировалось 1 раз(а), последний 2019-12-12 14:21:34
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4612
Рейтинг: 746
#2: 2019-12-12 16:32:12 ЛС | профиль | цитата
В стандартном TCP_Client нельзя вызывать doOpen из параллельного потока. Поставь Synchronize перед.

Проблема может быть в Events. Если у тебя стандартный - то обязательно надо при старте программы вызвать doCreate.

Не обязательно ставить Synchronize после TCP_Client.onRead - стандартный клиент и так работает в главном потоке.

Редактировалось 2 раз(а), последний 2019-12-12 16:35:43
карма: 26

0
Ответов: 704
Рейтинг: 7
#3: 2019-12-12 18:00:49 ЛС | профиль | цитата
Netspirit, поток мне для того чтоб основна программа не зависала на подключение если вдруг ip недоступен. Ставя Synchronize сразу после потока я ведь снова начинаю ждать всей остальной программой выполнение второстепенного запроса? Рад бы использовать Ваши компоненты TCP где поток есть по-умолчанию, но с альтернативным компонентом клиента программа бессистемно висла, приходится на штатном.

Events нестандартный, без точки создания.

Редактировалось 1 раз(а), последний 2019-12-12 18:02:28
карма: 0

0
Ответов: 4612
Рейтинг: 746
#4: 2019-12-12 18:16:57 ЛС | профиль | цитата
Других вариантов нет. По doOpen в параллельном потоке создаётся окно для приёма событий, в т.ч., получения данных. И, чтобы работало, в этом же потоке должна работать очередь обработки оконных сообщений.
Можно ещё исп. Ping для проверки подключения в пар. потоке, а потом - обычно doOpen.

Редактировалось 2 раз(а), последний 2019-12-12 18:25:54
карма: 26

0
Ответов: 704
Рейтинг: 7
#5: 2019-12-12 18:33:15 ЛС | профиль | цитата
Спасибо, понял! Пингом подстрахуюсь.
карма: 0

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