:: Visual Foxpro, Foxpro for DOS
Re: Что прописать в начале и в конце единственной в проекте main проги
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Еще чуть-чуть, и AdamAry станет спец-агентом ЦРУ, коварно внедренным в сплоченные ряды фоксклуба.
"Если у вас шизофрения это не значит что за вами не следят." (с)

Странно только, что у асов форума вызвал затруднения вопрос, вынесенный в заголовок темы, только pasha_usue пытается нащупать ответ по существу.
Вопрос же в своем туманном стиле ТС задал про загрузчик приложения - "Что прописать в начале и в конце единственной в проекте main проги?"

В начале программы прописывается процедура ее загрузки, где после READ EVENTS начинается считывание событий (обычно она бывает функцией "по-умолчанию"), в конце - процедура закрытия, которая завершает работу и после CLEAR EVENTS прекращает считывание событий.
Еще желательно предусмотреть процедуры обработки ошибок и выходы по команде пользователя и по ON SHUTDOWN, возможно еще что-то.
Ratings: 3 negative/1 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Нельзя никаких "команд" использовать. Можно лишь конструкции PROCEDURE, FUNCTION или DEFINE CLASS использовать (первые две имеют "необязательный" терминатор ENDPROC/ENDFUNC - необязательность проявляется в том, что вместо них можно просто начать "очередную" PROCEDURE/FUNCTION или описание класса - но если они всё же используются, то строго определяют "конец кода процедуры/функции").


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
Нельзя никаких "команд" использовать. Можно лишь конструкции PROCEDURE, FUNCTION или DEFINE CLASS использовать (первые две имеют "необязательный" терминатор ENDPROC/ENDFUNC - необязательность проявляется в том, что вместо них можно просто начать "очередную" PROCEDURE/FUNCTION или описание класса - но если они всё же используются, то строго определяют "конец кода процедуры/функции").

В "PROCEDURE, FUNCTION или DEFINE CLASS" тоже нельзя команды вписывать?
Ratings: 2 negative/1 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
[attachment 27936 2_troll_cr.jpg]


------------------
Без коментариев..
Ratings: 0 negative/2 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
Igor Korolyov
Т.е. в простых случаях, когда нет необходимости выходить, остановив работу программы нажатием ESC,
READ EVENTS и ON SHUTDOWN CLEAR EVENTS использовать не нужно.
Не нужно. Тем более что ты и не сможешь её "правильно" закрыть данным способом, особенно учитывая что для программы "которой совсем не видно" ну никак не послать "нажатие Esc" - чтобя его послать нужно иметь окно программы, и это окно должно быть активным. Иначе нажатие пойдёт совсем другой программе...
У меня в реальности появляются только окна com объекта. В этом случае тоже не нужно использовать READ EVENTS и ON SHUTDOWN CLEAR EVENTS ?

Цитата:
Ну, как часто вызывать DOEVENTS, и вызывать ли ТОЛЬКО его, или ещё и в дополнение INKEY(0.1) или там АПИшный Sleep(100) - вопрос отдельный. Полагаю не стоит его тут поднимать При том что для "невидимой", а значит и "непрерываемой" программы этого в принципе не требуется.

Равно и с ON SHUTDOWN - фокс "поймает" событие только "между" строками кода при штатном значении _VFP.AutoYield = .T. А если там будет какой SQL запрос на 5 минут колбасить, никак он не "среагирует" и его винда именно "Not Responding" и будет считать...

DOEVENTS нужен для видимой программы, и для программы которую мы хотим "визуальным способом" останавливать - например повесив формочку с кнопкой "Отмена" - без DOEVENTS кнопка не будет "нажиматься" вот и всё...
Для отмены по ESC (конечно же снова уточню - для ВИДИМОЙ программы - и чтобы было активно её окно) достаточно в этом самом мега-цикле, ну или если там не цикл а просто огромная "простыня" кода понатыкать банальных проверок IF LASTKEY()=27 с кодом выхода... DOEVENTS там не нужен...
Это (DOEVENTS) касается и окон com объекта?



Исправлено 3 раз(а). Последнее : AdamAry, 06.07.17 09:06
Ratings: 0 negative/0 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
pasha_usue
А вообще. Если не ошибаюсь, после отсылки WM_QUERYENDSESSION приложению, у него есть 5 секунд на раздумье. Затем начинаются силовые методы. Если вся программа укладывается в 5 секунд, то абсолютно точно никакая обработка потока событий не нужна.
Не знал что если программа выполняется более 5 секунд то windows начинает думать что это зависание.
Спасибо pasha_usue.
Ratings: 0 negative/0 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
lulgu
Странно только, что у асов форума вызвал затруднения вопрос, вынесенный в заголовок темы, только pasha_usue пытается нащупать ответ по существу.
Плюс Igor.
Ratings: 0 negative/0 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
AdamAry
pasha_usue
А вообще. Если не ошибаюсь, после отсылки WM_QUERYENDSESSION приложению, у него есть 5 секунд на раздумье. Затем начинаются силовые методы. Если вся программа укладывается в 5 секунд, то абсолютно точно никакая обработка потока событий не нужна.
Не знал что если программа выполняется более 5 секунд то windows начинает думать что это зависание.
Спасибо pasha_usue.
Я не так сказал. Я сказал, что когда винда закрывает сессию, она посылает приложениям WM_QUERYENDSESSION. И от всех приложений она ожидает ответа приблизительно 5 секунд (если не настроено другое). Если приложение в течение 5 секунд не закрылось и не выставило флаг завершения своей работы, винда начинает действовать силовыми методами.
Ratings: 0 negative/1 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
pasha_usue
А вообще. Если не ошибаюсь, после отсылки WM_QUERYENDSESSION приложению, у него есть 5 секунд на раздумье. Затем начинаются силовые методы. Если вся программа укладывается в 5 секунд, то абсолютно точно никакая обработка потока событий не нужна.
Не знал что если программа выполняется более 5 секунд то windows начинает думать что это зависание.
Спасибо pasha_usue.
Я не так сказал. Я сказал, что когда винда закрывает сессию, она посылает приложениям WM_QUERYENDSESSION. И от всех приложений она ожидает ответа приблизительно 5 секунд (если не настроено другое). Если приложение в течение 5 секунд не закрылось и не выставило флаг завершения своей работы, винда начинает действовать силовыми методами.
Не в состоянии понять в деталях и точно как это происходит,
если не затруднит нет ли возможности как то объяснить,
может быть на примитивном примере
или как то ещё чтобы дошло?

1. Когда у запущенного приложения есть 5 секунд? Что с ним происходит в этот момент? И в ответ на какие действия пользователя?
2. Когда уинда закрывает сессию?
3. Для чего уинда посылает приложениям WM_QUERYENDSESSION ?
4. В каких случаях приложение в течение 5 секунд не закрывается и не выставляет флаг завершения своей работы?
5. Каким образом уинда начинает действовать силовыми методами? Т.е. что она для этого использует?
6. Может быть что то ещё, что я упустил?

Если конечно объяснить на пальцах сложно, то может быть хотя бы цель 5 секунд?



Исправлено 5 раз(а). Последнее : AdamAry, 06.07.17 09:46
Ratings: 1 negative/0 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
AdamAry
У меня в реальности появляются только окна com объекта. В этом случае тоже не нужно использовать READ EVENTS и ON SHUTDOWN CLEAR EVENTS ?
Смотря как работает этот ком объект. Скорее всего не нужно (если он работает синхронно - т.е. в фоксе стоит какой-то вызов метода, и пока он не завершится фокс будет ждать на этой самой строке). Если же он работает на событиях, то нужно (примерно как показано в примере с фоксовым таймером).
AdamAry
Это (DOEVENTS) касается и окон com объекта?
Нет. Это касается прежде всего того как работает фоксовый рантайм. Касаться работы COM сервера это может лишь в части обработки инициированных этим ком-объектом событий - если навешены фоксовые обработчики, и "параллельно" с работой ком-объекта продолжает работать какой-то фоксовый код (фокс не находится в состоянии ожидания).

AdamAry
1. Когда у запущенного приложения есть 5 секунд? Что с ним происходит в этот момент? И в ответ на какие действия пользователя?
При завершении сессии приложению посылается событие WM_QUERYENDSESSION на которое оно должно отреагировать - сказать что готово к закрытию, либо сказать что НЕ готово - в этом случае винда постарается "отменить" процесс закрытия сессии. Пользователь инициирует либо "завершение сеанса/переключение пользователя", либо "выключение компьютера и выход из системы" - т.е. явно говорит что завершает свою работу. ПОСЛЕ этого приложениям рассылается сообщение
WM_ENDSESSION, оно уже "безусловно" говорит что сейчас всё будет вырублено - с этого момента начинает работать таймер определения "подвисших" процессов, позволяющий их принудительно закрыть (в новых ОС так, насколько я в курсе).
AdamAry
2. Когда уинда закрывает сессию?
Когда пользователь или какое-то программное событие (например сигнал от UPS, или посланная системным администратором по сети команда выключения/перезагрузки компьютера) инициирует выход из системы.
AdamAry
3. Для чего уинда посылает приложениям WM_QUERYENDSESSION ?
Для того чтобы известить приложения о том что сейчас произойдёт завершение сессии (и этим приложениям нужно будет завершиться, если они не сервисы). Ну и получить от них подтверждение что они "всё поняли". При этом им даётся шанс попросить винду "не завершать сессию". Если это будет возможно, то закрытие сессии (или перезагрузка/выключение системы) будут отменены.
msdn.microsoft.com
AdamAry
4. В каких случаях приложение в течение 5 секунд не закрывается и не выставляет флаг завершения своей работы?
Странный вопрос. Если код этого приложения не завершает свою работу в течении 5 секунд после поступления сигнала WM_ENDSESSION. А флаг не выставляется если приложение вообще не реагирует на данное сообщение.
AdamAry
5. Каким образом уинда начинает действовать силовыми методами? Т.е. что она для этого использует?
АПИ функцию TerminateProcess.
AdamAry
6. Может быть что то ещё, что я упустил?
Наверняка. В MSDN есть очень много страниц которые следует прочесть, чтобы хоть минимально разбираться в обсуждаемых вопросах...

Начать стоит с msdn.microsoft.com


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 06.07.17 13:28
Ratings: 0 negative/1 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
AdamAry
Причина была в том, что READ EVENTS я поставил в конце программы, как и указывал товарищ

На самом деле причина была в том, что вы совсем по-разному понимаете, что такое "программа" в данном контексте, и, соответственно, где находится ее конец.
(раньше не задумывался над тем, можно ли писать программы, не до конца понимая, что такое программа, но, видимо, можно).

Кто ж мог предположить, что концом программы вы считаете некое физическое место в конце prg-файла?
Только Леонид.

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

Ну, не полетит ваша ракета, если не изучить основы физики и проч.!
Ratings: 0 negative/2 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
AdamAry
Спасибо Igor.
После функций внизу прг нельзя писать код.

Код писать можно - нельзя надеяться, что этот код будет выполнен.
Более того, если выполнять такую прогу из исходников, то вы даже не узнаете об ошибке.

Попробуйте выполнить программу из одной единственной строки:
DO CASE
Получите ошибку "There is a missing keyword..."

А теперь такую:
ENDFUNC
DO CASE

Ошибки не будет.
Точнее, ошибка компиляции "Statement is not in a procedure." будет игнорироваться.

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

Хотя в обоих случаях она написана "в конце программы" (в вашем понимании того, что такое программа).



Исправлено 1 раз(а). Последнее : akvvohinc, 06.07.17 20:00
Ratings: 0 negative/1 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Ну встряну тож во флуд )))

AdamAry
По идее, чтобы пользователь не остался в недоумении от невидимки и была возможность остановить программу всё таки наверное надо вызывать хоть какой либо примитивный интерфейс типа wait window "Идёт выполнение программы. Для отмены нажми ESC."

можно систрей для таких вещей пользовать ))) так и делал кста
Ratings: 0 negative/1 positive
Re: Что прописать в начале и в конце единственной в проекте main проги
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Систрей сам по себе не позволит отлавливать нажатие esc
По большому счёту это просто иконка (и её тултип) и механизм отлова нажатий на неё. Оттуда уже и формы показываются, и, если надо, "завершение/прерывание" программы делается...


------------------
WBR, Igor
Ratings: 0 negative/1 positive


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

On-line: 28 BOBAN  (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика