Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Последовательность выполнения команд программы / 21 сообщений из 21, страница 1 из 1
22.02.2013, 00:29
    #38161586
UAP
UAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Коллеги!

Пусть некоторая программа написанная на VFP состоит из нескольких команд К(1), К(2), ..., К(i), К(i+1), ..., К(n).
Как сделать так, чтобы команда К(i+1) начинала выполняться только после окончания выполнения команды К(i) ?

Почему-то я стал замечать, что иногда предыдущая команда еще не выполнилась, а следующая уже начала выполняться.
...
Рейтинг: 0 / 0
22.02.2013, 01:18
    #38161609
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Наблюдала подобную картину, когда после команды связанной с копированием файла
следующая команда обращалась уже к скопируемому файлу - так вот она говорила, что файл не найден!
по всей видимости он не успевал прописаться на новом месте
поставила между этими сомандами что-то типа this.Parent.Command1.Enabled=.F. и прошло.
...
Рейтинг: 0 / 0
22.02.2013, 07:36
    #38161680
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
UAPКоллеги!

Пусть некоторая программа написанная на VFP состоит из нескольких команд К(1), К(2), ..., К(i), К(i+1), ..., К(n).
Как сделать так, чтобы команда К(i+1) начинала выполняться только после окончания выполнения команды К(i) ?

Почему-то я стал замечать, что иногда предыдущая команда еще не выполнилась, а следующая уже начала выполняться.
Фокс однопоточный, пока одна команда не отработала другая не начинает выполнятся.

Команда может вообще не отработать если включена автообработка ошибок, например
Код: sql
1.
on error return .T.


тогда ошибка просто проигнорируется, строка не отработает и будет выполнятся следующая. Игнорированием ошибок злоупотреблять не стоит.

Какая конкретная строка не отрабатывает?
...
Рейтинг: 0 / 0
22.02.2013, 07:46
    #38161682
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
ЛюдмilaНаблюдала подобную картину, когда после команды связанной с копированием файла
следующая команда обращалась уже к скопируемому файлу - так вот она говорила, что файл не найден!
Проблемы с файлами из-за кэша виндовса. Начал замечать подобное на W7, тот же код в XP работал без проблем. Что-то перемудрил MS с оптимизацией файлового кэша.
Лечится командой
Код: sql
1.
FLUSH
...
Рейтинг: 0 / 0
22.02.2013, 08:27
    #38161698
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Dima TФокс однопоточный, пока одна команда не отработала другая не начинает выполнятся.Да, но, помнится, тот же copy file при работе с дискетами такое вытворял сплошь и рядом, если доп. проверок не ставить.
Dima TНачал замечать подобное на W7Да уж, и впрямь "всё новое - это хорошо забытое старое"
...
Рейтинг: 0 / 0
22.02.2013, 08:49
    #38161710
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
tanglirDima TНачал замечать подобное на W7Да уж, и впрямь "всё новое - это хорошо забытое старое"
Там еще круче есть мистика: начитался в инете про оптимизацию ключами в реестре, переключил в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters
в ноль EnablePrefetcher и EnableSuperfetch и начались паранормальные явления с файловыми операциями. Даже FLUSH не помог. Сохранил файл и он исчез. После перезапуска проги виден становится.

А ключики эти якобы отключают предварительное кэширование часто используемых программ. Везде советуют ставить 0 при использовании SSD-винтов. У меня правда винт обычный.
...
Рейтинг: 0 / 0
22.02.2013, 15:07
    #38162375
UAP
UAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Коллеги!

У меня ситуация вот какая.
Мне нужно сделать нечто похожее на слайд шоу.

Для этого на форме есть Oleboundcontrol и Grid.

По Grid ходит указатель, а в Oleboundcontrol отображается соответствующий записи таблицы файл.

Переходить на следующую запись нужно только после того, как в Oleboundcontrol отобразится соответствующий файл и немного там побудет.

Я никак не могу "синхронизировать" этот процесс.

Программа кувыркается.

Как "поймать" момент завершения отрисовки.

Может быть у Oleboundcontrol есть свойство, анализируя которое можно установить этот момент?
...
Рейтинг: 0 / 0
22.02.2013, 18:17
    #38162695
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
UAP,

файлы какого типа? картинки?
если картинки, то может с помощью Image показывать?
...
Рейтинг: 0 / 0
22.02.2013, 19:06
    #38162742
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
UAPПо Grid ходит указатель, а в Oleboundcontrol отображается соответствующий записи таблицы файл.
При помощи цикла? В смысле, программно, а не пользователь нажимает кнопки? Тогда после перемещения на новую запись дай команду DoEvents

Код: sql
1.
2.
3.
4.
5.
select MyTab
scan
    ThisForm.Refresh()
    DoEvents [Force]
endscan


Опция Force иногда нужна, а иногда - нет. До сих пор не понял, в каких случаях надо, а когда - нет

Дело в том, что методы отрисовки формы или ее объектов (refresh()) имеют самый низкий приоритет. Они ставятся в конец стека вызовов всех событий. В результате, у тебя отработает отрисовка только по окончании цикла. По сути, только для последней записи. А команда DoEvents заставит выполниться вообще все события, которые оказались в стеке вызова. В том числе и методы отрисовки формы.
...
Рейтинг: 0 / 0
22.02.2013, 19:13
    #38162756
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
ВладимирМдай команду DoEvents
Настоятельно НЕ рекомендую так делать. DoEvents исполняет все события приложения, если юзер куда ткнул мышью, то это начинает отрабатывать и тут надо уже отслеживать чтоб эта обработка не нагадила своими изменениями той которая DoEvents вызвала.
...
Рейтинг: 0 / 0
22.02.2013, 20:07
    #38162812
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Dima TВладимирМдай команду DoEvents
Настоятельно НЕ рекомендую так делать. DoEvents исполняет все события приложения, если юзер куда ткнул мышью, то это начинает отрабатывать и тут надо уже отслеживать чтоб эта обработка не нагадила своими изменениями той которая DoEvents вызвала.
Читаем постановку задачи

UAPУ меня ситуация вот какая.
Мне нужно сделать нечто похожее на слайд шоу
По сути, он "фильму" крутит на экране путем перебора записей. Поэтому отлов нажатий мыши пользователя будет уместен. Надо же иметь возможность прервать это безобразие
...
Рейтинг: 0 / 0
23.02.2013, 01:55
    #38163051
UAP
UAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Уважаемые коллеги!

Уточняю постановку задачи.

1. Типы файлов для отображения самые различные - не обязательно картинки.
Упоминание термина "Слайд шоу" не совсем точно, но частично отражает суть дела.
Поэтому для показа DOC, XLS, PDF и т.д. я использую
APPEND GENERAL ... FROM ... для текущей записи таблицы.
Затем поле типа GENERAL вычищается а таблица пакуется.

2. Показ изображений ведется в цикле SCAN ... ENDSCAN.

3. Прерывание процесса показа НЕ планируется (но сделать нужно для порядка).
...
Рейтинг: 0 / 0
23.02.2013, 21:59
    #38163374
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Заставить быстрее работать ворд, эксель и т.д. ты не сможешь, именно они запускаются для показа файла. Как могут так и успевают.
Делай скриншоты и показывай картинки если надо быстрее.

Реально сейчас происходит следующее: для XLS файла запускается эксель, читает файл и показывает. При этом фокс не дожидается окончания показа. Запустился эксель и фокс дальше занимается своими делами, в это время эксель параллельно читает файл и показывает.

Как вариант можешь таймер использовать, но проблемы это не решит, если не хватает времени - надо увеличивать паузы или показывать заранее заготовленные картинки.
...
Рейтинг: 0 / 0
24.02.2013, 08:30
    #38163562
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
UAPКоллеги!

Пусть некоторая программа написанная на VFP состоит из нескольких команд К(1), К(2), ..., К(i), К(i+1), ..., К(n).
Как сделать так, чтобы команда К(i+1) начинала выполняться только после окончания выполнения команды К(i) ?

Почему-то я стал замечать, что иногда предыдущая команда еще не выполнилась, а следующая уже начала выполняться.
Код: sql
1.
2.
3.
4.
Видно, вы на бейсике до этого писАли ?
IF EOF('MyTable')  && команда K(i)
     REPLACE POLE1 WITH 0 ALL IN AnyTable && команда K(i+1)
ENDIF


И как тут команда K(i+1) сможет обогнать команду K(i) ?
...
Рейтинг: 0 / 0
24.02.2013, 12:56
    #38163648
UAP
UAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Уважаемый reware!

Пожалуйста, объясните более подробно свое решение.

Я проверял решение ВладимираМ.

Очень заманчиво!

Получается неплохо.

Но нет полной уверенности.

Команда DoEvents [Force] очень плохо описана в документации.

Каждый знает ощущение уверенности в программе, а его нет.

Нет кайфа от программы ...
...
Рейтинг: 0 / 0
24.02.2013, 17:03
    #38163781
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
UAPУважаемый reware!
Пожалуйста, объясните более подробно свое решение.
...
Ах это даже решение ... А как обьяснять ? Гхм, ну вот вызывается тупо одна команда, потом вторая, третья. При некоем результате первой команды (или без такового) соответственно либо через IF либо DO CASE делать ветку на нужный кусок кода.
...
Рейтинг: 0 / 0
24.02.2013, 20:36
    #38163894
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
UAPКоманда DoEvents [Force] очень плохо описана в документации.
В виндовсе весь оконный интерфейс построен на сообщениях. Что-то произошло - виндовс шлет сообщение. Т.е. сообщение - нажатие кнопки клавиатуры/мыши, перемещение мыши, команды на перерисовку окна при изменении размеров, инициализация приложения - последовательность сообщений, закрытие - последовательность и т.д.
Все сообщения обрабатываются очередью сообщений приложения. Когда происходит выполнение кода в фоксе - обработка сообщений приостанавливается. А твои контролы требуют чтобы предназначенные им сообщения они получили. Вот это и делает команда DoEvents, она принудительно запускает обработчик сообщений.

DoEvents плоха тем что могут быть сообщения внутрифоксовые и их не понятно как обрабатывать. Например: захочет пользователь твою форму закрыть, ткнет в "крестик" и как быть? Форма не может быть закрыта т.к. выполняется код внутри формы.

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

PS Про обработку сообщений можешь например тут почитать .
...
Рейтинг: 0 / 0
24.02.2013, 22:53
    #38163968
UAP
UAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Уважаемый reware!

Ваш подход к решению поставленной задачи ошибочен.
...
Рейтинг: 0 / 0
24.02.2013, 23:06
    #38163979
UAP
UAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Коллеги!

ВладимирМ указывает:

"Дело в том, что методы отрисовки формы или ее объектов (refresh()) имеют самый низкий приоритет. Они ставятся в конец стека вызовов всех событий. В результате, у тебя отработает отрисовка только по окончании цикла. По сути, только для последней записи. А команда DoEvents заставит выполниться вообще все события, которые оказались в стеке вызова. В том числе и методы отрисовки формы".

Я вчитываюсь и вдумываюсь в цитату.

И у меня возникают вопросы.

1. Поставить в КОНЕЦ стека это фактически поставить в очередь?
2. Можно ли быть уверенным, что в конец стека задания ставятся в естественной последовательности, а именно: в той же последовательности, что и в исходной программе?
...
Рейтинг: 0 / 0
25.02.2013, 07:25
    #38164120
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
UAP1. Поставить в КОНЕЦ стека это фактически поставить в очередь?
в данном случае "стек" и "очередь" это одно и тоже. Правильный термин "очередь" т.к. идет обработка в порядке поступления. Подробнее тут, в середине "Алгоритм выборки сообщений из очереди потока"

UAP2. Можно ли быть уверенным, что в конец стека задания ставятся в естественной последовательности, а именно: в той же последовательности, что и в исходной программе?
Можно. Ставятся и обрабатываются в той последовательности, в которой поступают.
Только учти что приложение при обработке сообщений может слать новые сообщения само себе, в т.ч. использовать таймеры, которые тоже сообщения, приходящие с заданной периодичностью.
Поэтому если надо обработку всех сообщений, то лучше использовать таймер. Только тут надо учесть такой момент что сообщение для таймера ставится в очередь с заданной периодичностью, но обрабатывается в порядке очереди, т.е. если очередь долго обрабатывалась, то может оказаться что накопилось несколько сообщений таймера и тогда они будут обработаны друг за другом без какой-либо паузы.
Пример oTimer.Timer()
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
if !This.Enabled
	* таймер уже остановлен
	return
endif

if abs(seconds() - This.nPrevTime) <= 0.2
	* с момента прошлого запуска прошло менее 0.2 сек.
	return
endif

if chrsaw(0)
	* есть необработанные нажатия на клавиатуре
	return
endif

... код обработки

This.nPrevTime = seconds() && добавление nPrevTime прописать в Init() This.AddProperty('nPrevTime', seconds())


Таймер тебе чем не подходит?
...
Рейтинг: 0 / 0
25.02.2013, 23:09
    #38165624
UAP
UAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последовательность выполнения команд программы
Уважаемый Dima T!

Не хочется использовать таймер, поскольку никогда не знаешь сколько времени нужно для отработки фрагмента.

С другой стороны, сегодня с помощью DoEvents удалось привести программу в порядок.

Работает программа неплохо.

Дальнейшее тестирование покажет, насколько решение оказалось удачным.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Последовательность выполнения команд программы / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]