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,[])
}
Этот топик читают: Гость
Ответов: 286
Рейтинг: 5
|
|||
Блин почему не работает
|
|||
карма: 0 |
|
Google
vip
|
#1.1контекстная реклама от партнеров
|
Ответов: 4621
Рейтинг: 746
|
|||
|
|||
карма: 26 |
|
Ответов: 286
Рейтинг: 5
|
|||
Netspirit Спасибо всю голову сломал
|
|||
карма: 0 |
|
Ответов: 18
Рейтинг: 0
|
|||
2Netspirit:
Более поучительно (imho) было бы не столько решить задачу, сколько указать на ошибки ТС 1) Метод StrList.doDelete воспринимает данные dtNULL (которые идут с таймера) как индекс равный -1 (а не =0) 2) После первого исправления уже начинает работать. НО: таймер надо все-таки останавливать по окончании процесса перебора Например (максимально близко к схеме ТС):
Редактировалось 2 раз(а), последний 2018-04-11 17:23:28 |
|||
карма: 2 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
|
|||
карма: 25 |
|
Разработчик
Ответов: 26066
Рейтинг: 2120
|
|||
Tad, а ты нагрузку на процессор смотрел в момент работы твоей схемы? Таймер более предпочтителен в данном случае.
--- Добавлено в 2018-04-11 21:06:42 Схема
Редактировалось 2 раз(а), последний 2018-04-11 21:07:42 |
|||
карма: 22 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
А так ещё и -3кб кода. (есть же точка EndIdx)
Редактировалось 1 раз(а), последний 2018-04-11 22:32:08 |
|||
карма: 25 |
|
Разработчик
Ответов: 26066
Рейтинг: 2120
|
|||
Tad писал(а): А так ещё и -3кб кода. (есть же точка EndIdx)
Это уже косметическое улучшение, совершенно не влияющее на принцип работы схемы. |
|||
карма: 22 |
|
Ответов: 286
Рейтинг: 5
|
|||
Да столько решений.Туповат я еще однако
|
|||
карма: 0 |
|
Ответов: 4621
Рейтинг: 746
|
|||
nesco писал(а): а ты нагрузку на процессор смотрел в момент работы твоей схемы? |
|||
карма: 26 |
|
Разработчик
Ответов: 26066
Рейтинг: 2120
|
|||
Netspirit писал(а): умоляю, давай переделаем этот Sleep!А у тебя есть нормальная версия реализации? Я уже пробовал, но, увы, терялись события формы. Может у тебя что получше есть? PS ЕМНМП, то моя реализация должна была остаться в теме про отложенные события. Редактировалось 1 раз(а), последний 2018-04-12 12:16:00 |
|||
карма: 22 |
|
Ответов: 4621
Рейтинг: 746
|
|||
Ты что, смеёшься? Какая там реализация! По методу doSleep - обычный sleep(), добавить верхнюю точку Delay (чтобы можно было в runtime указывать), изменить интерпретацию Delay с "микросекунд" на "миллисекунды". Остальные методы либо выбросить, либо оставить какой-то типа doSleepTick (задержка "на указанное колличество тиков"), и то если он реализован достаточно корректно согласно его описанию.
Ничего другого, кроме как "задержка исполнения потока на указанное количество миллисекунд" от компонента не требуется. И "пропуск сообщений" главного потока - это, так сказать, документированное поведение при вызове из главного потока. Чтобы этого избежать, компонент следует применять в параллельном потоке. В любом случае ничем в этом плане не отличается от текущей реализации. А если имеешь в виду, что события пропускались даже при применении в параллельном потоке - так проблема может быть как раз в перегрузке процессора, особенно критично для одноядерных процессоров. Редактировалось 1 раз(а), последний 2018-04-12 12:30:40 |
|||
карма: 26 |
|
Разработчик
Ответов: 26066
Рейтинг: 2120
|
|||
Netspirit писал(а): Ты что, смеёшься? Какая там реализация!Не хотелось бы использовать параллельный поток. Это чревато отсутствием синхронизации с главным потоком, для этого надо как-то все равно синхронизировать выданное событие с главным потоком. Так это уже реализовано в штатном компоненте Thread и его методе onSyncExec, чем тебе не синхронный Sleep? Но как ты собираешься затормозить в этом случае выполнение главного потока? Получается противоречее -- Sleep не может выполняться в параллельном потоке, тк перестает влиять на главный поток, но и не может выполняться в основном, тк заблокирует очередь событий. Вот и как этих ежиков скрестить? Да и зачем это все надо, когда есть нормальный компонент Timer, который прекрасно справляется с поставленной задачей и ни фига не грузит проц? Редактировалось 2 раз(а), последний 2018-04-12 14:21:13 |
|||
карма: 22 |
|
Ответов: 4621
Рейтинг: 746
|
|||
Смотри. С задачей "задержать поток на указанное время" справляется Sleep. С задачей "выполнить некоторое действие через указанный интервал" справится Timer с AutoStop=1. Для синхронизации с главным потоком у нас есть компонент Synchronize и DeferredEvent (а синхронизация и задержка - это совсем разные вещи).
Уточню чем отличается "задержать поток на указанное время" и "выполнить некоторое действие через указанный интервал". Во втором случае ничего не блокируется, программа продолжает работать, просто через нужный интервал произойдёт событие (в случае с Timer - в главном потоке). Простой пример: я делал автоматизацию некоторых операций в сторонней программе, в которой их можно было сделать только вручную. Пришлось реализовать путём последовательности нажатий клавиш, в процессе которого открываются несколько окон, в них вносятся данные. Между нажатиями клавиш вставляется различная задержка, чтобы соответствующее действие успело выполниться/окно появиться-скрыться перед посыланием следующей комбинации клавиш (ожидание окон можно было бы организовать по-другому, но не важно). Так вот именно для этого идеально подходит компонент Sleep. Не нужно никаких синхронизаций. Нужно просто: "задержка исполнения потока на указанное время". Можно только представить себе реализацию этого на таймерах с их стартом/остановкой. Причём обычный Timer исполняет событие в главном потоке, блокируя его (а если мне нужно в фоне?), а MMTimer - это Thread+Repeat+Sleep, MMTimer подойдёт, когда интервал одинаковый и когда действие нужно повторить много раз (а когда один раз, то слишком много телодвижений - включить таймер, остановить). А если ещё и нужно дождаться выполнения этого действия перед продолжением? Попробуй чисто для себя набросай схемку "послать 3 нажатия клавиш с разным интервалом между нажатиями, после чего показать сообщение о завершении". А если нажатий 15-ть? Редактировалось 8 раз(а), последний 2018-04-12 15:26:59 |
|||
карма: 26 |
|
Разработчик
Ответов: 26066
Рейтинг: 2120
|
|||
Вообще-то я рассматривал случай, применительно к схеме Tad-a. Если не задержать дальнейшее выполнение очереди событий, то пока выдаст событие задержки, то успеет перебрать весь список.
|
|||
карма: 22 |
|