Вверх ↑
Этот топик читают: Гость
Ответов: 11
Рейтинг: 0
#1: 2020-03-17 18:33:51 ЛС | профиль | цитата
Здравствуйте! Помогите, пожалуйста, синхронизировать выполнение команд.
Предполагаю, что нужно использовать потоки или синхронизацию с помощью событий, но самостоятельно не удалось с этим разобраться.

В текущий момент после отправки команды на сервер происходит считывание следующего элемента массива, мне же нужно сначала зафиксировать и обработать ответ от сервера.



Add(MainForm,2953706,21,105)
{
link(onCreate,7412511:doEnum,[])
}
Add(ArrayEnum,7412511,203,119)
{
link(onItem,9553273:doString,[])
link(Array,16459590:Text,[])
}
Add(StrList,16459590,203,63)
{
}
Add(TCP_Client,6396327,393,119)
{
Port=5005
IP="192.168.15.5"
Point(onError)
Point(onProgress)
link(onRead,10619078:doValue,[])
}
Add(Hub,295514,333,119)
{
link(onEvent1,6396327:doOpen,[])
link(onEvent2,6396327:doSend,[(370,132)(370,139)])
}
Add(GlobalVar,10619078,455,119)
{
Name="ответ сервера"
link(onValue,16320051:doOperation,[])
}
Add(FormatStr,9553273,266,119)
{
DataCount=1
Mask="команда для сервера %1"
link(onFString,295514:doEvent1,[])
}
Add(StrList,15291354,630,119)
{
}
Add(Math,16320051,574,119)
{
Op2=1
link(onResult,15291354:doAdd,[])
}

карма: 0

0
Ответов: 11
Рейтинг: 0
#2: 2020-03-18 14:28:35 ЛС | профиль | цитата
С помощью потоков Thread мне удалось получить все ответы от сервера.

Проблема в том, что перед обработкой очередного элемента массива мне нужно удостоверится, что закончена обработка предыдущего ответа сервера. Сама обработка довольно длительная (я получаю от сервера имя файла и произвожу манипуляции с ним. Только когда закончу необходимо отправить следующий запрос).
карма: 0

0
Ответов: 4626
Рейтинг: 747
#3: 2020-03-18 14:54:17 ЛС | профиль | цитата
Компоненты Events+WaitObject позволяют приостановить поток до наступления некоторого события.
карма: 26

0
Ответов: 11
Рейтинг: 0
#4: 2020-03-18 16:13:30 ЛС | профиль | цитата
Netspirit писал(а):
Компоненты Events+WaitObject позволяют приостановить поток до наступления некоторого события.

Интуитивно я это понимаю. Но не очень ясно как это правильно реализуется:

WaitObject двигается дальше, дальше если событие еще не создано (он считывает идентификатор "0")

Если же я создаю событие перед отправкой данных на сервер и жду, когда данные из сервера дойдут до doSet у Events, то этого не происходит и весь процесс "зависает".
карма: 0

0
Ответов: 4626
Рейтинг: 747
#5: 2020-03-18 16:44:28 ЛС | профиль | цитата
Компонент Events реализован коряво. "Создавать" событие (метод doCreate) нужно только 1 раз - при старте приложения. После создания события оно находится в состоянии "non-signalled". В этом состоянии WaitObject блокирует ("задерживает") вызвавший поток. Когда наступают требуемые условия - вызываешь метод Events.doSet, событие переходит в состояние "signalled" - тогда WaitObject отпускает блокируемый поток. Чтобы опять WaitObject позже остановился - нужно перевести событие в "non-signalled" методом doReset (или поставить ManualReset=False).

dimazelensky писал(а):
то этого не происходит и весь процесс "зависает"
Я не в курсе твоей схемы, но "приостановить поток" как раз и значит что этот поток ничего не делает. Поэтому вызывать WaitObject не стоит из главного потока (то-есть, из событий визуальных компонентов, и в данном случае - из событий TCP_Client). Только из компонентов Thread. Вот эти компоненты могут дать дополнительные возможности в этом плане: /topic/63600

Редактировалось 1 раз(а), последний 2020-03-18 16:45:14
карма: 26

0
Ответов: 11
Рейтинг: 0
#6: 2020-03-18 18:35:41 ЛС | профиль | цитата
Netspirit, огромное спасибо! Получилось.

Очень хорошо бы видеть ваш текст в хелпе ))

Может кому пригодится работающий пример:


Add(FormatStr,3661231,507,634)
{
DataCount=5
Mask="POST /templateGroupList HTTP/1.0\r\n"
link(onFString,12393686:doSend,[(567,640)(567,648)])
}
Add(Button,11986315,282,627)
{
Left=10
Top=460
link(onClick,9707353:doEvent1,[])
}
Add(Memo,5840899,633,628)
{
Left=10
Top=510
Width=750
Height=380
link(onChange,8490034:doSet,[(702,634)(702,536)(487,536)(487,480)])
}
Add(MainForm,3785844,135,453)
{
Left=20
Top=105
Width=801
Height=921
Point(doVisible)
link(onCreate,8490034:doCreate,[])
}
Add(TCP_Client,12393686,575,628)
{
Port=5005
IP="192.168.15.5"
Point(onError)
Point(onProgress)
link(onRead,5840899:doAdd,[])
}
Add(Hub,9707353,372,627)
{
OutCount=3
link(onEvent1,12393686:doOpen,[(526,633)(526,634)])
link(onEvent2,3661231:doString,[])
link(onEvent3,5995899:doStart,[(403,647)(403,647)])
}
Add(Message,5628561,617,697)
{
link(onMessage,8490034:doReset,[(724,703)(724,597)(463,597)(463,487)])
}
Add(WaitObject,5785299,497,697)
{
link(onWait,5628561:doMessage,[])
link(ObjHandle,8490034:ObjHandle,[])
}
Add(Events,8490034,497,467)
{
}
Add(Thread,5995899,420,641)
{
link(onExec,5785299:doWait,[(474,647)(474,703)])
}

карма: 0

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