Вверх ↑
Этот топик читают: Гость
Ответов: 286
Рейтинг: 5
#1: 2018-04-11 11:47:40 ЛС | профиль | цитата
Блин почему не работает

Add(MainForm,3372534,308,238)
{
Width=603
Height=417
link(onCreate,12382292:doData,[])
}
Add(Memo,14886223,385,189)
{
Width=280
Height=390
Align=1
Strings=#8:Мама+098|8:Папа+890|8:Брат+765|10:Сестра+677|0:|
ScrollBars=3
}
Add(Memo,7774838,504,259)
{
Left=300
Width=295
Height=390
Align=3
ScrollBars=3
link(onChange,4310479:doTimer,[])
}
Add(Button,7091212,357,294)
{
Left=185
Top=350
Width=180
Height=35
Align=4
Data=Integer(0)
Flat=0
link(onClick,15525915:doWork2,[])
}
Add(StrList,7009677,455,252)
{
Point(doGetString)
Point(onGetString)
link(onGetString,7774838:doAdd,[])
}
Add(DoData,12382292,385,252)
{
link(onEventData,7009677:doText,[(433,258)(433,279)])
link(Data,14886223:Text,[])
}
Add(Hub,4637100,427,294)
{
link(onEvent1,7009677:doGetString,[])
link(onEvent2,7009677:doDelete,[(448,307)(448,272)])
}
Add(Timer,4310479,553,259)
{
Enable=1
link(onTimer,15525915:doWork1,[(597,265)(597,335)(403,335)])
}
Add(HubEx,15525915,399,294)
{
link(onEvent,4637100:doEvent1,[])
}

карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4621
Рейтинг: 746
#2: 2018-04-11 11:57:44 ЛС | профиль | цитата
Add(MainForm,3372534,378,175)
{
Width=603
Height=417
link(onCreate,12382292:doData,[])
}
Add(Memo,14886223,469,126)
{
Width=280
Height=390
Align=1
Strings=#8:Мама+098|8:Папа+890|8:Брат+765|10:Сестра+677|0:|
ScrollBars=3
}
Add(Memo,7774838,609,175)
{
Left=300
Width=295
Height=390
Align=3
ScrollBars=3
}
Add(Button,7091212,406,287)
{
Left=185
Top=350
Width=180
Height=35
Align=4
Data=Integer(0)
Flat=0
link(onClick,3692965:doEvent1,[])
}
Add(StrList,7009677,539,168)
{
Point(doGetString)
Point(onGetString)
link(onGetString,7774838:doAdd,[])
}
Add(DoData,12382292,469,189)
{
link(onEventData,7009677:doText,[])
link(Data,14886223:Text,[])
}
Add(Timer,4310479,490,294)
{
Enable=1
link(onTimer,13369954:doNext,[(531,300)(531,286)])
}
Add(CounterEx,13369954,616,280)
{
Point(doMax)
Point(onThroughMax)
Point(doReset)
link(onNext,137891:doOperation,[])
link(onThroughMax,15740099:doEvent1,[])
}
Add(Hub,3692965,455,287)
{
link(onEvent1,3292503:doData,[])
link(onEvent2,4310479:doTimer,[])
}
Add(DoData,3292503,546,287)
{
link(onEventData,13369954:doMax,[])
link(Data,7009677:Count,[])
}
Add(Hub,15740099,672,287)
{
link(onEvent1,4310479:doStop,[(709,293)(709,350)(478,350)(478,307)])
link(onEvent2,13369954:doReset,[(698,300)(698,330)(604,330)(604,300)])
}
Add(Math,137891,721,280)
{
OpType=1
Op2=1
link(onResult,7009677:doGetString,[(800,286)(800,251)(527,251)(527,216)])
}
Add(ArrayEnum,8316169,518,462)
{
}
Add(InfoTip,5917358,448,406)
{
Info=#36:Для простого перебора строк в списке|
Width=169
Height=109
}
Add(InfoTip,16190675,532,56)
{
Info=#41:Без промежуточного StrList можно обойтись|
Width=169
Height=39
}
карма: 26

0
Ответов: 286
Рейтинг: 5
#3: 2018-04-11 12:05:08 ЛС | профиль | цитата
Netspirit Спасибо всю голову сломал
карма: 0

0
Ответов: 18
Рейтинг: 0
#4: 2018-04-11 17:21:50 ЛС | профиль | цитата
2Netspirit:
Более поучительно (imho) было бы не столько решить задачу, сколько указать на ошибки ТС
1) Метод StrList.doDelete воспринимает данные dtNULL (которые идут с таймера) как индекс равный -1 (а не =0)
2) После первого исправления уже начинает работать. НО: таймер надо все-таки останавливать по окончании процесса перебора

Например (максимально близко к схеме ТС):
Add(MainForm,3372534,273,140)
{
Width=603
Height=417
}
Add(Memo,14886223,427,91)
{
Width=280
Height=390
Align=1
Strings=#8:Мама+098|8:Папа+890|8:Брат+765|10:Сестра+677|0:|
ScrollBars=3
}
Add(Memo,7774838,616,175)
{
Left=300
Width=295
Height=390
Align=3
ScrollBars=3
}
Add(Button,7091212,273,189)
{
Left=185
Top=350
Width=180
Height=35
Align=4
Flat=0
link(onClick,10292475:doEvent1,[])
}
Add(StrList,7009677,511,168)
{
Point(doGetString)
Point(onGetString)
link(onGetString,7205382:doCompare,[])
}
Add(DoData,12382292,427,154)
{
link(onEventData,7009677:doText,[(494,160)(494,195)])
link(Data,14886223:Text,[])
}
Add(Hub,4637100,476,196)
{
link(onEvent1,7009677:doGetString,[])
link(onEvent2,7009677:doDelete,[(501,209)(501,188)])
}
Add(Timer,4310479,357,203)
{
Enable=1
link(onTimer,9959195:doWork3,[(410,209)])
}
Add(DoData,11668594,427,196)
{
Data=Integer(0)
link(onEventData,4637100:doEvent1,[])
}
Add(If_else,7205382,560,175)
{
Type=4
Op2=Integer(0)
link(onTrue,7774838:doAdd,[])
link(onFalse,4310479:doStop,[(599,188)(599,244)(347,244)(347,216)])
link(Op1,7009677:Count,[(566,166)(552,166)(552,215)(524,215)])
}
Add(HubEx,9959195,406,196)
{
link(onEvent,11668594:doData,[])
}
Add(Hub,10292475,322,189)
{
OutCount=3
link(onEvent1,12382292:doData,[(347,195)(347,160)])
link(onEvent2,9959195:doWork2,[])
link(onEvent3,4310479:doTimer,[])
}

Редактировалось 2 раз(а), последний 2018-04-11 17:23:28
карма: 2
пугаться не надо ...
0
Ответов: 16884
Рейтинг: 1239
#5: 2018-04-11 19:02:58 ЛС | профиль | цитата


Add(MainForm,3372534,525,315)
{
Width=603
Height=417
}
Add(Memo,14886223,574,210)
{
Width=280
Height=390
Align=1
Strings=#8:Мама+098|8:Папа+890|8:Брат+765|10:Сестра+677|0:|
ScrollBars=3
}
Add(Memo,7774838,763,273)
{
Left=300
Width=295
Height=390
Align=3
ScrollBars=3
link(Str,14744309:Item,[(769,261)(629,261)(629,316)(594,316)])
}
Add(Button,7091212,525,273)
{
Left=185
Top=350
Width=180
Height=35
Align=4
Flat=0
link(onClick,14744309:doEnum,[])
}
Add(ArrayEnum,14744309,588,273)
{
link(onItem,1494109:doSleepMks,[])
link(Array,14886223:Array,[])
}
Add(Sleep,1494109,637,273)
{
Delay=1000000
link(onSleep,14799399:doEvent1,[])
}
Add(Hub,14799399,679,273)
{
link(onEvent1,7774838:doAdd,[])
link(onEvent2,13347052:doProcessMessages,[])
}
Add(Application,13347052,714,280)
{
}

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#6: 2018-04-11 20:54:01 ЛС | профиль | цитата
Tad, а ты нагрузку на процессор смотрел в момент работы твоей схемы? Таймер более предпочтителен в данном случае.

--- Добавлено в 2018-04-11 21:06:42

Схема

Add(MainForm,3372534,133,301)
{
Width=603
Height=417
}
Add(Memo,14886223,385,168)
{
Width=280
Height=390
Align=1
Strings=#8:Мама+098|8:Папа+890|8:Брат+765|10:Сестра+677|0:|
ScrollBars=3
}
Add(Memo,7774838,462,266)
{
Left=300
Width=295
Height=390
Align=3
ScrollBars=3
}
Add(Button,7091212,133,259)
{
Left=185
Top=350
Width=180
Height=35
Align=4
Flat=0
link(onClick,12187333:doEvent1,[])
}
Add(CounterEx,14617920,336,266)
{
Min=-1
Default=-1
Point(doReset)
link(onNext,6655338:doRead,[])
}
Add(ArrayRW,6655338,399,266)
{
link(onRead,7774838:doAdd,[])
link(Array,14886223:Array,[])
}
Add(Timer,3407826,280,266)
{
Enable=1
Point(doAutoStop)
Point(onStop)
link(onTimer,14617920:doNext,[])
link(onStop,14617920:doReset,[])
}
Add(Hub,12187333,182,259)
{
link(onEvent1,16077606:doOperation,[(207,265)(207,286)])
link(onEvent2,3407826:doTimer,[])
}
Add(Math,16077606,224,280)
{
OpType=1
Op2=1
ResultType=0
link(onResult,3407826:doAutoStop,[])
link(Op1,14886223:Count,[(230,222)(398,222)])
}


Редактировалось 2 раз(а), последний 2018-04-11 21:07:42
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#7: 2018-04-11 22:27:56 ЛС | профиль | цитата
А так ещё и -3кб кода. (есть же точка EndIdx)

Add(MainForm,3372534,189,252)
{
Width=603
Height=417
}
Add(Memo,14886223,441,119)
{
Width=280
Height=390
Align=1
Strings=#8:Мама+098|8:Папа+890|8:Брат+765|10:Сестра+677|0:|
ScrollBars=3
Point(EndIdx)
}
Add(Memo,7774838,518,217)
{
Left=300
Width=295
Height=390
Align=3
ScrollBars=3
}
Add(Button,7091212,189,210)
{
Left=185
Top=350
Width=180
Height=35
Align=4
Flat=0
link(onClick,12187333:doEvent1,[])
}
Add(CounterEx,14617920,392,217)
{
Min=-1
Default=-1
Point(doReset)
link(onNext,6655338:doRead,[])
}
Add(ArrayRW,6655338,455,217)
{
link(onRead,7774838:doAdd,[])
link(Array,14886223:Array,[])
}
Add(Timer,3407826,336,217)
{
Enable=1
Point(doAutoStop)
Point(onStop)
link(onTimer,14617920:doNext,[])
link(onStop,14617920:doReset,[])
}
Add(Hub,12187333,238,210)
{
link(onEvent1,9161706:doData,[(266,216)(266,237)])
link(onEvent2,3407826:doTimer,[])
}
Add(DoData,9161706,280,231)
{
link(onEventData,3407826:doAutoStop,[])
link(Data,14886223:EndIdx,[(286,197)(468,197)])
}


Редактировалось 1 раз(а), последний 2018-04-11 22:32:08
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#8: 2018-04-12 03:36:16 ЛС | профиль | цитата
Tad писал(а):
А так ещё и -3кб кода. (есть же точка EndIdx)

Это уже косметическое улучшение, совершенно не влияющее на принцип работы схемы.
карма: 22

0
Ответов: 286
Рейтинг: 5
#9: 2018-04-12 04:39:23 ЛС | профиль | цитата
Да столько решений.Туповат я еще однако
карма: 0

0
Ответов: 4621
Рейтинг: 746
#10: 2018-04-12 11:58:16 ЛС | профиль | цитата
nesco писал(а):
а ты нагрузку на процессор смотрел в момент работы твоей схемы?
nesco, умоляю, давай переделаем этот Sleep! Он же в текущей реализации не sleep, а прогреватель для процессора.
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#11: 2018-04-12 12:13:41 ЛС | профиль | цитата
Netspirit писал(а):
умоляю, давай переделаем этот Sleep!

А у тебя есть нормальная версия реализации? Я уже пробовал, но, увы, терялись события формы. Может у тебя что получше есть?
PS ЕМНМП, то моя реализация должна была остаться в теме про отложенные события.

Редактировалось 1 раз(а), последний 2018-04-12 12:16:00
карма: 22

0
Ответов: 4621
Рейтинг: 746
#12: 2018-04-12 12:30:22 ЛС | профиль | цитата
Ты что, смеёшься? Какая там реализация! По методу doSleep - обычный sleep(), добавить верхнюю точку Delay (чтобы можно было в runtime указывать), изменить интерпретацию Delay с "микросекунд" на "миллисекунды". Остальные методы либо выбросить, либо оставить какой-то типа doSleepTick (задержка "на указанное колличество тиков"), и то если он реализован достаточно корректно согласно его описанию.

Ничего другого, кроме как "задержка исполнения потока на указанное количество миллисекунд" от компонента не требуется. И "пропуск сообщений" главного потока - это, так сказать, документированное поведение при вызове из главного потока. Чтобы этого избежать, компонент следует применять в параллельном потоке. В любом случае ничем в этом плане не отличается от текущей реализации. А если имеешь в виду, что события пропускались даже при применении в параллельном потоке - так проблема может быть как раз в перегрузке процессора, особенно критично для одноядерных процессоров.

Редактировалось 1 раз(а), последний 2018-04-12 12:30:40
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#13: 2018-04-12 14:12:05 ЛС | профиль | цитата
Netspirit писал(а):
Ты что, смеёшься? Какая там реализация!

Не хотелось бы использовать параллельный поток. Это чревато отсутствием синхронизации с главным потоком, для этого надо как-то все равно синхронизировать выданное событие с главным потоком. Так это уже реализовано в штатном компоненте Thread и его методе onSyncExec, чем тебе не синхронный Sleep? Но как ты собираешься затормозить в этом случае выполнение главного потока? Получается противоречее -- Sleep не может выполняться в параллельном потоке, тк перестает влиять на главный поток, но и не может выполняться в основном, тк заблокирует очередь событий. Вот и как этих ежиков скрестить?
Да и зачем это все надо, когда есть нормальный компонент Timer, который прекрасно справляется с поставленной задачей и ни фига не грузит проц?

Редактировалось 2 раз(а), последний 2018-04-12 14:21:13
карма: 22

0
Ответов: 4621
Рейтинг: 746
#14: 2018-04-12 15:04:09 ЛС | профиль | цитата
Смотри. С задачей "задержать поток на указанное время" справляется Sleep. С задачей "выполнить некоторое действие через указанный интервал" справится Timer с AutoStop=1. Для синхронизации с главным потоком у нас есть компонент Synchronize и DeferredEvent (а синхронизация и задержка - это совсем разные вещи).

Уточню чем отличается "задержать поток на указанное время" и "выполнить некоторое действие через указанный интервал". Во втором случае ничего не блокируется, программа продолжает работать, просто через нужный интервал произойдёт событие (в случае с Timer - в главном потоке).

Простой пример: я делал автоматизацию некоторых операций в сторонней программе, в которой их можно было сделать только вручную. Пришлось реализовать путём последовательности нажатий клавиш, в процессе которого открываются несколько окон, в них вносятся данные. Между нажатиями клавиш вставляется различная задержка, чтобы соответствующее действие успело выполниться/окно появиться-скрыться перед посыланием следующей комбинации клавиш (ожидание окон можно было бы организовать по-другому, но не важно). Так вот именно для этого идеально подходит компонент Sleep. Не нужно никаких синхронизаций. Нужно просто: "задержка исполнения потока на указанное время". Можно только представить себе реализацию этого на таймерах с их стартом/остановкой. Причём обычный Timer исполняет событие в главном потоке, блокируя его (а если мне нужно в фоне?), а MMTimer - это Thread+Repeat+Sleep, MMTimer подойдёт, когда интервал одинаковый и когда действие нужно повторить много раз (а когда один раз, то слишком много телодвижений - включить таймер, остановить). А если ещё и нужно дождаться выполнения этого действия перед продолжением?

Попробуй чисто для себя набросай схемку "послать 3 нажатия клавиш с разным интервалом между нажатиями, после чего показать сообщение о завершении". А если нажатий 15-ть?

Редактировалось 8 раз(а), последний 2018-04-12 15:26:59
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#15: 2018-04-12 18:12:28 ЛС | профиль | цитата
Вообще-то я рассматривал случай, применительно к схеме Tad-a. Если не задержать дальнейшее выполнение очереди событий, то пока выдаст событие задержки, то успеет перебрать весь список.
карма: 22

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