Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Один экземпляр приложения.  [new]
Бобков Илья
Member

Откуда:
Сообщений: 14
Всем привет. Я хотел узнать. Как в Фокс Про допустить только один экземпляр запущенного приложения и как это можно реализовать проще всего? Всем спасибо.
22 ноя 13, 14:27    [15174375]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
Бобков Илья
Всем привет. Я хотел узнать. Как в Фокс Про допустить только один экземпляр запущенного приложения и как это можно реализовать проще всего? Всем спасибо.


Как предотвратить повторный запуск приложения
22 ноя 13, 14:29    [15174397]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
Бобков Илья
Member

Откуда:
Сообщений: 14
PaulWist, спасибо
22 ноя 13, 14:35    [15174464]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
Бобков Илья
Member

Откуда:
Сообщений: 14
Нашел более простое решение просто сохранял переменную в мем файл и проверял её на запуске.
22 ноя 13, 15:22    [15174901]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
Dima T
Member

Откуда:
Сообщений: 15288
Бобков Илья
Нашел более простое решение просто сохранял переменную в мем файл и проверял её на запуске.

Теперь попробуй убить свою прогу (снять задачу в диспетчере)
Или просто CANCEL сделай где-нибудь внутри кода.
22 ноя 13, 15:32    [15175011]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
Бобков Илья
Member

Откуда:
Сообщений: 14
Dima T, У меня на этот случай есть вторая проверка (программа завершена не корректно). И всё работает. Просто сбрасываю переменную с копией экземпляра приложения и всё.
22 ноя 13, 16:12    [15175407]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
Valerii
Member

Откуда:
Сообщений: 749
Бобков Илья,
IF AppAlreadyRunning()
=MESSAGEBOX("Приложение уже запущено..", 0 + 16 +0, ;
"Внимание.")
QUIT
ENDIF
*-------------------------------------------
FUNCTION AppAlreadyRunning
LOCAL hsem, lpszSemName
#DEFINE ERROR_ALREADY_EXISTS 183
DECLARE INTEGER GetLastError IN win32API
DECLARE INTEGER CreateSemaphore IN WIN32API ;
STRING @ lpSemaphoreAttributes, ;
LONG lInitialCount, ;
LONG lMaximumCount, ;
STRING @ lpName
lpszSemName = 'PUBLIC_FOOD'
hsem = CreateSemaphore(0,0,1,lpszSemName)
RETURN (hsem # 0 AND GetLastError() == ERROR_ALREADY_EXISTS)
26 ноя 13, 17:09    [15193029]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Бобков Илья
Dima T, У меня на этот случай есть вторая проверка (программа завершена не корректно). И всё работает. Просто сбрасываю переменную с копией экземпляра приложения и всё.

Можно уточнить каким образом выполняется эта проверка? Переменная физически где находится? В том же mem-файле? Как Вы по значению переменных отличаете завершенную не корректно программу от программы, которая сейчас продолжает работать?
26 ноя 13, 21:26    [15194521]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
Dima T
Member

Откуда:
Сообщений: 15288
[quot ВладимирММожно уточнить каким образом выполняется эта проверка? Переменная физически где находится? В том же mem-файле? Как Вы по значению переменных отличаете завершенную не корректно программу от программы, которая сейчас продолжает работать?[/quot]
вот тебе не все равно насколько квадратны колеса у велосипеда?
27 ноя 13, 21:45    [15202042]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
sg12
Member

Откуда:
Сообщений: 454
Dima T

Из хелпа:

SAVE TO Команда - Сохраняет текущие переменные памяти и массивы в файле переменных памяти или в memo-поле.
RESTORE FROM Команда - Извлекает переменные памяти и массивы переменных памяти, сохраненные в файле переменных памяти или в memo-поле, и помещает их в память.
28 ноя 13, 09:33    [15203463]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
sg12
Dima T

Из хелпа:

SAVE TO Команда - Сохраняет текущие переменные памяти и массивы в файле переменных памяти или в memo-поле.
RESTORE FROM Команда - Извлекает переменные памяти и массивы переменных памяти, сохраненные в файле переменных памяти или в memo-поле, и помещает их в память.

И каким образом это помогает решить поставленную задачу? Как Вы планируете отличить содержимое mem-файла, созданного работающей в данный момент программой, от содержимого mem-файла, оставшегося без изменений вследствие аварийного завершения работы (сбой)? Во втором случае нет работающего приложения, но mem-файл выглядит так, как-будто приложение продолжает работать.
28 ноя 13, 22:38    [15208705]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
sg12
Member

Откуда:
Сообщений: 454
ВладимирМ
sg12
Dima T

Из хелпа:

SAVE TO Команда - Сохраняет текущие переменные памяти и массивы в файле переменных памяти или в memo-поле.
RESTORE FROM Команда - Извлекает переменные памяти и массивы переменных памяти, сохраненные в файле переменных памяти или в memo-поле, и помещает их в память.

И каким образом это помогает решить поставленную задачу? Как Вы планируете отличить содержимое mem-файла, созданного работающей в данный момент программой, от содержимого mem-файла, оставшегося без изменений вследствие аварийного завершения работы (сбой)? Во втором случае нет работающего приложения, но mem-файл выглядит так, как-будто приложение продолжает работать.
29 ноя 13, 09:46    [15209916]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
sg12
Member

Откуда:
Сообщений: 454
ВладимирМ
Как Вы планируете отличить содержимое mem-файла, созданного работающей в данный момент программой, от содержимого mem-файла, оставшегося без изменений вследствие аварийного завершения работы (сбой)? Во втором случае нет работающего приложения, но mem-файл выглядит так, как-будто приложение продолжает работать.


Понимаю вас, решение не ахти.
Можно так: По окончании первая переменная записывается в mem-файл и проверяется через RESTORE.
При удачном завершении значение второй переменной меняется и также сохраняется. При отказе ее значение в mem-файле не меняется.
В принципе, можно обойтись и одной переменной на три значения, но это на любителя.
29 ноя 13, 09:48    [15209932]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
Dima T
Member

Откуда:
Сообщений: 15288
sg12
Можно так: По окончании первая переменная записывается в mem-файл и проверяется через RESTORE.
При удачном завершении значение второй переменной меняется и также сохраняется. При отказе ее значение в mem-файле не меняется.
В принципе, можно обойтись и одной переменной на три значения, но это на любителя.

Пример кода покажи.

Ты пытаешься доказать что мягкое и теплое это одно и тоже. Так показывай как мягкость термометром меряют.
29 ноя 13, 18:59    [15214910]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
sg12
Member

Откуда:
Сообщений: 454
Dima T

Примеры кода есть в ссылке, которую я чуть выше вам дал.
Или - "... не читатель, а писатель", судя по вашему посту?
29 ноя 13, 21:09    [15215332]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
sg12
Можно так: По окончании первая переменная записывается в mem-файл и проверяется через RESTORE.
При удачном завершении значение второй переменной меняется и также сохраняется. При отказе ее значение в mem-файле не меняется.
В принципе, можно обойтись и одной переменной на три значения, но это на любителя.

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

1. При старте приложения ищем файл с определенным именем, находящийся в определенной директории
1.1. Если такого файла нет, то это означает, что других копий приложения запущено не было. Значит, можно запускать приложение.
1.2. Если такой файл найден, то это означает, что данное приложение уже было запущено. Пользователь пытается запустить его второй раз. Значит, запускать нельзя
2. Если приложение было запущено, то при старте указанный файл создается в указанной директории
3. При завершении работы приложения файл удалялся

Т.е. даже не важно, что там внутри файла находится. Достаточно самого факта существования файла.

На первый взгляд, кажется, что схема идеальная. Но это только на первый взгляд. Представим себе ситуацию, когда приложение было завершено, но файл не удалился. Что получим? При попытке запустить приложение, мы видим, что файл есть. Значит, приложение запускать нельзя.

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

Так вот, добавление некоего содержимого в это файл проблему не решит. Никак. Ведь любые изменения содержимого предполагается вносить в этот файл при штатном (корректном) завершении приложения. Если же приложение было завершено не корректно, то содержимое файла останется неизменным. Таким, какое оно есть в процессе работы приложения. Но ведь приложение уже не работает! Как следствие, снова требуется ручное вмешательство программиста, чтобы запустить приложение.

Вы снова вернулись к началу истории программирования. Снова наступаете на те же грабли...

sg12
Примеры кода есть в ссылке, которую я чуть выше вам дал.

Где? Что-то я тоже не вижу никаких Ваших ссылок в этой теме...
29 ноя 13, 21:50    [15215452]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
sg12
Member

Откуда:
Сообщений: 454
ВладимирМ

История дело интересное.
Но в теме речь идет о переменной, а не файле-семафоре - это разные решения, не надо путать.
Даже новичок ТС заметил, что нужно делать две проверки, а не одну.
Что и я пытался вам объяснить.
В своем примере выполните вторую проверку и он заработает.
Примеры для ДимыТ из хелпа - надо в нем набрать "SAVE TO".
30 ноя 13, 10:05    [15216961]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
asws
Member

Откуда:
Сообщений: 1384
ВладимирМ,

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

Механизм открытия файла в монопольном режиме прост и универсален, потому что даёт возможность гибких решений,
например у меня это используется для следующих целей:
- можно запретить одновременную работу второго экземпляра приложения (блокируемый файл по выбору в любом месте);
- можно запретить одновременную работу с экземпляром данных (блокируемый файл в папке с данными);
- можно организовать самообновление программы через интернет (основная программа и инсталлятор запускают друг друга, ожидая завершения - освобождения файла).
30 ноя 13, 14:27    [15217373]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
sg12
ВладимирМ

История дело интересное.
Но в теме речь идет о переменной, а не файле-семафоре - это разные решения, не надо путать.
Даже новичок ТС заметил, что нужно делать две проверки, а не одну.
Что и я пытался вам объяснить.
В своем примере выполните вторую проверку и он заработает.
Примеры для ДимыТ из хелпа - надо в нем набрать "SAVE TO".

Так ПОКАЖИТЕ свой пример? ГДЕ Вы его привели?

И еще раз, любой анализ переменных основан на том факте, что вы ШТАТНО завершили приложение. Т.е. непосредственно перед выходом как-то там изменили переменные. А если выход был НЕ штатным. Т.е. выйти-то вышли, а вот переменные не изменились. Ваш пример, который Вы неизвестно где привели, эту проблему решает?

Переменные внутри файла - это всего-лишь "бантики". Принципиально НИЧЕМ не отличаются от факта создания-удаления файла. Разве что, это более сложное решение.
30 ноя 13, 19:45    [15218188]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
asws
ВладимирМ,

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

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

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

Чем этот вариант отличается от банальной блокировки записи в DBF-таблице? Вот ЭТО действительно просто и понятно для программиста FoxPro. Более того, чрезвычайно гибко и удобно. А с файлами, встает вопрос администрирования доступа.

А вопросы администрирования доступа к файлам и директориям в настоящее время уже достаточно сложен. Судя по уровню вопросов спрашивающих, решить эту проблему они не смогут. Скорее всего, у большинства пользователей просто не будет прав на создание и блокировку файлов в ряде директорий. Придется "мудрить" не с расположением, а с именами файлов. Т.е. ни о какой "простоте" и "понятности" не может быть и речи...
30 ноя 13, 20:05    [15218241]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
sg12
Member

Откуда:
Сообщений: 454
ВладимирМ

Вы опять что-то перепутали - я не обещал вам каких-либо примеров.
И вообще, какой смысл их сочинять для удовлетворения чьего-то гонора, если его можно сбить.
Вы также продолжаете путать переменные и файлы - это непростительно даже новичку.
Первоначально записанные значения переменных меняются при штатном выходе, при нештатном нет, я уже объяснял.
Если mem-файл вас раздражает, вы можете сохранить их значения в таблице, ini-файле, в текстовом виде и т.п.
И еще - рабочие файлы программы обычно принято располагать в рабочей директории, куда есть доступ, иначе вы просто не запустите свою программу.
1 дек 13, 00:40    [15219266]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
Dima T
Member

Откуда:
Сообщений: 15288
sg12
Вы опять что-то перепутали - я не обещал вам каких-либо примеров.

Правильно, ни один уважающий себя тролль не будет подтверждать свой словесный понос примерами кода
1 дек 13, 18:33    [15220967]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
asws
Member

Откуда:
Сообщений: 1384
ВладимирМ
asws
Механизм открытия файла в монопольном режиме прост и универсален, потому что даёт возможность гибких решений,

Чем этот вариант отличается от банальной блокировки записи в DBF-таблице? Вот ЭТО действительно просто и понятно для программиста FoxPro. Более того, чрезвычайно гибко и удобно. А с файлами, встает вопрос администрирования доступа.

А вопросы администрирования доступа к файлам и директориям в настоящее время уже достаточно сложен. Судя по уровню вопросов спрашивающих, решить эту проблему они не смогут. Скорее всего, у большинства пользователей просто не будет прав на создание и блокировку файлов в ряде директорий. Придется "мудрить" не с расположением, а с именами файлов. Т.е. ни о какой "простоте" и "понятности" не может быть и речи...
Да, конечно, согласен,
это у меня от привычки юзать в FoxPro клиент-серверную архитектуру с "толстыми" клиентами )),
то-есть никаких шаред-файлов и всегда есть полные права как минимум на папку...
1 дек 13, 20:19    [15221350]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
sg12
Member

Откуда:
Сообщений: 454
Dima T
sg12
Вы опять что-то перепутали - я не обещал вам каких-либо примеров.

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


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

И не надо блефовать, у вас самих нет серьезных кодов.
Все, что вы имеете - это из года в год обрывки одних и теж же процедур и советов, для новичков, на пальцах: "Примерно так ...".
Вы из них хоть один работающий проект сумеете собрать?
1 дек 13, 20:44    [15221422]     Ответить | Цитировать Сообщить модератору
 Re: Один экземпляр приложения.  [new]
Станислав С...кий
Guest
sg12
...Но в теме речь идет о переменной, а не файле-семафоре - это разные решения, не надо путать.


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



Вопрос-то состоял именно в том, КАК по значению переменной в сохраненном файле(вариант № 1) или просто по наличию файла(вариант № 2) отследить, что программа реально работает, а не "вылетела" по ошибке...

Ответ от ВладимираМ прозвучал: "Никак"

С моей точки зрения, этот ответ не совсем правильный. Отследить закрытие по ошибке/через менеджер задач можно, так как при закрытии приложения система должна закрыть все его окна и завершить главный вызывающий процесс. Этот момент можно перехватить в приложении и успеть записать переменную в соответствующий файл. На С/С++ это (отследить тип запроса системы на закрытие приложения) сделать вполне возможно... На VFP - не знаю. Может и можно... как-нибудь... по ON Shutdown, например...
2 дек 13, 09:59    [15223163]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / FoxPro, Visual FoxPro Ответить