Вверх ↑
Этот топик читают: Гость
Ответов: 95
Рейтинг: 2
#1: 2013-03-20 12:48:26 ЛС | профиль | цитата
code_30629.txt
Схема тестовая.
Если в HTTP_Get выставить Wait:True, то вся форма зависает пока не окончится закачка. Если Wait:False, то зависания формы нет, но и данные с HTTP_Get поступают позже, чем выполняется остальная часть схемы.
Как добиться правильного выполнения схемы без зависания формы?
карма: 0

0
файлы: 1code_30629.txt [1009B] [108]
Разработчик
Ответов: 26163
Рейтинг: 2127
#2: 2013-03-20 13:04:05 ЛС | профиль | цитата
Abracadabra писал(а):
Как добиться правильного выполнения схемы без зависания формы?

Тю! А так не пробовал

Add(MainForm,2953706,238,140)
{
}
Add(Button,11739294,238,182)
{
Left=10
Top=5
Width=165
Height=40
Data=String(http://www.rostov-gorod.ru/docs/genplan/013.jpg)
link(onClick,2944567:doDownload,[])
}
Add(HTTP_Get,2944567,294,182)
{
link(onDownload,8399227:doCopy,[])
link(onStop,3419385:doCompare,[(340,209)(340,244)])
}
Add(MemoryStream,8399227,350,189)
{
}
Add(If_else,3419385,357,238)
{
Type=2
Op2=Integer(0)
link(onTrue,2560188:doData,[])
link(onFalse,2945122:doData,[(403,251)(403,286)])
link(Op1,8399227:Size,[])
}
Add(Label,7768796,518,245)
{
Left=10
Top=50
Width=165
Height=55
}
Add(DoData,2560188,413,238)
{
Data=String(что-то есть)
link(onEventData,7711221:doEvent1,[])
}
Add(DoData,2945122,413,280)
{
Data=String(пусто)
link(onEventData,7711221:doEvent2,[(452,286)(452,251)])
}
Add(Hub,7711221,469,238)
{
InCount=2
link(onEvent1,8399227:doClear,[(489,244)(489,174)(340,174)(340,202)])
link(onEvent2,7768796:doText,[])
}


карма: 22

0
Ответов: 95
Рейтинг: 2
#3: 2013-03-20 14:43:07 ЛС | профиль | цитата
nesco писал(а):
Тю! А так не пробовал
пробовал. Приведённая схема - лишь тест. Реальная схема сложнее, так сделать не получается.
В твоей схеме основной поток фактически останавливается на входе HTTP_Get (т.к. больше нет задач) и запускается дальше на выходе. Задача именно в синхронизации с основным потоком. Это возможно?
Или можно добиться, чтобы форма не висла наглухо при HTTP_Get Wait:True?
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#4: 2013-03-20 14:51:44 ЛС | профиль | цитата
Abracadabra писал(а):
Или можно добиться, чтобы форма не висла наглухо при HTTP_Get Wait:True?

В этом случае, второй поток не запускается, и тормоза будут всегда
карма: 22

0
Ответов: 9906
Рейтинг: 351
#5: 2013-03-20 15:25:03 ЛС | профиль | цитата
Abracadabra писал(а):
Задача именно в синхронизации с основным потоком. Это возможно?

Оно уже так и есть:

#pas
function THIHTTP_Get.Execute;
.....
if _prop_Wait then
EndDownload
else th.Synchronize( EndDownload ); // переводится как "синхронизировать"
end;
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#6: 2013-03-20 15:44:52 ЛС | профиль | цитата
Galkov писал(а):
Оно уже так и есть

Так его onStop не устраивает, вот оно в чем дело-то
------------ Дoбавленo в 15.33:
Abracadabra, на тебе гемор, если ты не хочешь использовать onStop

Add(Button,11739294,56,182)
{
Left=10
Top=5
Width=165
Height=40
Data=String(http://www.rostov-gorod.ru/docs/genplan/013.jpg)
link(onClick,8025464:doEvent1,[])
}
Add(HTTP_Get,2944567,245,182)
{
link(onStatus,14707583:doPosition,[(291,188)(291,223)])
link(onDownload,8399227:doCopy,[])
link(onURLSize,14707583:doMax,[(284,202)(284,230)])
link(onStop,13758903:doOn,[(335,209)(335,160)])
}
Add(MemoryStream,8399227,406,189)
{
}
Add(If_else,3419385,413,329)
{
Type=2
Op2=Integer(0)
link(onTrue,2560188:doData,[])
link(onFalse,2945122:doData,[(459,342)(459,377)])
link(Op1,8399227:Size,[])
}
Add(Label,7768796,574,336)
{
Left=10
Top=50
Width=165
Height=55
}
Add(DoData,2560188,469,329)
{
Data=String(что-то есть)
link(onEventData,7711221:doEvent1,[])
}
Add(DoData,2945122,469,371)
{
Data=String(пусто)
link(onEventData,7711221:doEvent2,[(508,377)(508,342)])
}
Add(Hub,7711221,525,329)
{
InCount=2
link(onEvent1,8399227:doClear,[(552,335)(552,174)(396,174)(396,202)])
link(onEvent2,7768796:doText,[])
}
Add(MainForm,16294721,56,119)
{
}
Add(Hub,8025464,105,182)
{
OutCount=5
link(onEvent1,13758903:doReset,[(130,188)(130,153)])
link(onEvent2,2944567:GetURLSize,[(235,195)(235,202)])
link(onEvent3,2944567:doDownload,[(178,202)(178,188)])
link(onEvent4,5261786:doRepeat,[(235,209)(235,272)])
link(onEvent5,3419385:doCompare,[(228,216)(228,335)])
}
Add(Repeat,5261786,357,266)
{
Op2=Integer(1)
link(onRepeat,4565320:doProcessMessages,[])
link(Op1,13758903:State,[])
}
Add(Application,4565320,469,266)
{
Wait=1
}
Add(Switch,13758903,357,140)
{
DataOn=Integer(0)
DataOff=Integer(1)
Point(State)
Point(doOn)
}
Add(ProgressBar,14707583,322,217)
{
Left=15
Top=230
Width=355
Point(doMax)
}


------------ Дoбавленo в 15.44:
Хотя, нет -- есть вариант без таймера
карма: 22

0
Ответов: 9906
Рейтинг: 351
#7: 2013-03-20 16:24:57 ЛС | профиль | цитата
nesco писал(а):
Так его onStop не устраивает, вот оно в чем дело-то

Чем
Этот метод вроде специально сделан, чтобы он кого-то устраивал, а не наоборот
Dilma себе трудился, коды писал, а тут на тебе -- не устраивает
Что это ты усмотрел, чего я не увидел....

Нет ведь более адекватного метода для синхронизации, чем Synchronize - хоть из трусов выпрыгни.
Хоть загружена основная программа, хоть нет.
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#8: 2013-03-20 16:28:44 ЛС | профиль | цитата
Galkov писал(а):
Что это ты усмотрел, чего я не увидел....

Я-то тут причем, это не меня не устраивает, это ТС не устраивает, мое первое предложение было именно с использованием onStop, которое как раз и вызывается из синхронного метода созданного потока. Может у ТС чего-то на хабе еще навешено после запуска, и он хочет подождать загрузки без тормозов и только после окончания продолжить выполнение событий хаба дальше
карма: 22

0
Ответов: 9906
Рейтинг: 351
#9: 2013-03-20 16:46:56 ЛС | профиль | цитата
Хех
Ну значит послушаем начальника транспортного цеха.
А я то сказал потому, что дословно прочитал:
вот оно в чем дело-то


Хотя не вижу, какие слова ТС могут отменить утверждение:
Нет ведь более адекватного метода для синхронизации, чем Synchronize - хоть из трусов выпрыгни

карма: 9

0
Ответов: 95
Рейтинг: 2
#10: 2013-03-20 16:49:14 ЛС | профиль | цитата
спасибо за советы, буду экспериментировать.
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#11: 2013-03-20 16:56:25 ЛС | профиль | цитата
Galkov писал(а):
Хотя не вижу, какие слова ТС могут отменить утверждение

Да никакие, этот метод желательно использовать везде. Лучше было последовательно соединить цепи, а не параллельно, а то с параллельным соединением гемор получается полный и куча лишних компонентов
------------ Дoбавленo в 16.56:
Abracadabra писал(а):
спасибо за советы, буду экспериментировать

Два направления дали, сиди и думай, что тебе больше пойдет
карма: 22

0
Ответов: 95
Рейтинг: 2
#12: 2013-03-21 13:20:30 ЛС | профиль | цитата
оказалось, не стой стороны я подошёл к проблеме.
Перед HTTP_Get висит BlockFind, который последовательно выдаёт несколько ссылок.
Если HTTP_Get Wait:False, то обрабатывается только первая ссылка.
code_30635.txt
------------ Дoбавленo в 13.20:
ставлю HTTP_Get Wait:True и вешаю в начале схемы Thread - всё работает отлично.
Но реальная схема сложнее тестовой, вставить туда Thread - большой геморой.
Может перед HTTP_Get кинуть Stack или MemFIFO, собрать все ссылки и потом по одной скармливать HTTP_Get?
Ещё варианты есть?
карма: 0

0
файлы: 1code_30635.txt [1.4KB] [170]
Разработчик
Ответов: 26163
Рейтинг: 2127
#13: 2013-03-21 13:26:59 ЛС | профиль | цитата
Abracadabra писал(а):
то обрабатывается только первая ссылка

У меня твой пример вообще с ошибкой вываливается
------------ Дoбавленo в 13.26:
Abracadabra писал(а):
Stack или MemFIFO, собрать все ссылки и потом по одной скармливать HTTP_Get?

Да почему бы и нет
Кто-то мешает попробовать Можешь еше пример посмотреть HiUpdate.sha в корне HiAsm-a, может чем поможет
карма: 22

0
Ответов: 95
Рейтинг: 2
#14: 2013-03-21 13:45:08 ЛС | профиль | цитата
nesco писал(а):
Можешь еше пример посмотреть HiUpdate.sha в корне HiAsm-a
к сожалению у меня его нет. Выложите тут, если не сложно
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#15: 2013-03-21 13:54:12 ЛС | профиль | цитата
Abracadabra писал(а):
к сожалению у меня его нет

Странно, почему нет, он обязательно должен быть, тк входит в базовый комплект
Ну на, если нет -- hiupdate_001.sha
карма: 22

0
файлы: 1hiupdate_001.sha [11.4KB] [227]
15
Сообщение
...
Прикрепленные файлы
(файлы не залиты)