Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Как определить, запущено ли приложение в других терминальных сессиях  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Доброго времени всем!

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

Вопрос: как правильно организовать, что бы специально назначенный пользователь запускал бы процедуру удаления, но при этом проверить, нет ли запущенных приложений в других сессиях, и, если такое возможно, что бы это было как-то не сложно, не погружаясь в winAPI и т.п.
7 мар 21, 14:54    [22290900]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
Dima T
Member

Откуда:
Сообщений: 16063
Просто берешь и открываешь монопольно. Если не откроется - будет ошибка, лови ее через TRY ... CATCH ...
7 мар 21, 18:26    [22290933]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7919
Простого решения нет. Точнее, есть решение "не погружаясь в WinAPI", но простым оно не будет

Кто в данный момент работает с приложением
7 мар 21, 18:54    [22290938]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
DmitryKn
Member

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

Попробуем, спасибо
7 мар 21, 20:44    [22290967]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
DmitryKn
Member

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

Спасибо.
Я читал уже эту статью, перед тем, как задать вопрос, в целом мне понятна идея с таблицей, но для меня не выглядит простой в реализации. Может быть это более основательный и правильный вариант, но делать я это буду до-олго ))
7 мар 21, 20:51    [22290969]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
Алек Веселов
Member

Откуда:
Сообщений: 1
DmitryKn,

Удалось решить вопрос?
28 май 21, 18:58    [22328628]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8894
DmitryKn
Со временем накапливаются помеченные на удаление строки. Для их удаления нужен "монопольный" режим.

Вопрос: как правильно организовать...

Хорошая практика - не удалять помеченные не удаление записи, а вторично их использовать...
Сделать это не сложно.

Good luck!

Сообщение было отредактировано: 1 июн 21, 21:39
1 июн 21, 21:47    [22330100]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
PaulWist
Member

Откуда:
Сообщений: 2300
DmitryKn
Со временем накапливаются помеченные на удаление строки. Для их удаления нужен "монопольный" режим.

Вопрос: как правильно организовать...


Сделать административную процедуру в которой "удалить" удаленные записи.

Sergey Ch

Хорошая практика - не удалять помеченные не удаление записи, а вторично их использовать...
Сделать это не сложно.



Хм, для простого случая покажи (пока не рассматриваем записи у которых есть внешние ключи :) ), без передергивания SET DELETED OFF/ON:

SET DELETED ON

CREATE CURSOR test (f1 int NOT null)

SELECT test

INDEX on f1 TAG f1 FOR !DELETED() CANDIDATE

SET ORDER TO  

INSERT INTO test VALUES (1)

DELETE FROM test WHERE f1 = 1

INSERT INTO test VALUES (1)

** SET DELETED OFF

GO TOP IN test

RECALL IN test
2 июн 21, 10:16    [22330187]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8894
PaulWist
Хм, для простого случая покажи

Вот неплохое описание того, как я делал (sorry for English):

click

Or a better strategy, if you want to avoid packing, is to reuse deleted records. You do this the following way:

Whenever you need tro insert a new record in a DBF, instead of inserting, first you look for deleted records to reuse. This requires an index on DELETED() to SEEK(DELETED()). If you do not find any deleted records, then you insert normally. If you find a deleted record, you BLANK all important fileds (columns), keeping the PK (or Autoinc) as it was and you then REPLACE the columns with the new data. You have to do it with care not to leave any old (previous) info in that record (see BLANK in help). Lastly you RECALL the record efectively unmarking the delete flag.

This strategy requires no packing and no exclusive use.
2 июн 21, 21:40    [22330602]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Алек Веселов,

Нет, оставил на туманное будущее, просто периодически запускаю, когда никого нет.

Я осознаю уровень такого решения ))
3 июн 21, 11:07    [22330793]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Sergey Ch,

Изначально такая идея была, однако был переубежден, и теперь думаю, что в моем случае, так даже и лучше, потому что проще.
Но если бы я не сам ковырялся, а ставил бы кому-то задачу - я бы посчитал использование помеченных строк более гармоничным и правильным.
3 июн 21, 11:12    [22330795]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
DmitryKn
Алек Веселов,

Нет, оставил на туманное будущее, просто периодически запускаю, когда никого нет.

Я осознаю уровень такого решения ))


Ну в смысле, как DimaT советовал в try... catch обернул, потестил, вроде все работает, спасибо DimaT, но все равно запускаю утром, пока нет никого.
3 июн 21, 11:22    [22330804]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7919
Sergey Ch
PaulWist
Хм, для простого случая покажи

Вот неплохое описание того, как я делал (sorry for English):

click

Or a better strategy, if you want to avoid packing, is to reuse deleted records. You do this the following way:

Whenever you need tro insert a new record in a DBF, instead of inserting, first you look for deleted records to reuse. This requires an index on DELETED() to SEEK(DELETED()). If you do not find any deleted records, then you insert normally. If you find a deleted record, you BLANK all important fileds (columns), keeping the PK (or Autoinc) as it was and you then REPLACE the columns with the new data. You have to do it with care not to leave any old (previous) info in that record (see BLANK in help). Lastly you RECALL the record efectively unmarking the delete flag.

This strategy requires no packing and no exclusive use.


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

(...) данная стратегия предполагает отказ от целого ряда команд и функций которые так или иначе могут автоматически создавать новые записи (APPEN BLANK, APPEND FROM, INSERT-SQL, буферизация, обновляемые Local View и т.п.). А создание новых записей осуществлять через специальную функцию, которая сначала ищет запись, помеченную как удаленная, и использует ее как новую запись.

К недостаткам данного способа следует еще отнести относительную сложность процедуры вставки новой записи. Тут недостаточно сделать просто LOCATE + RECALL. Все несколько сложнее. Достаточно много нюансов блокировки при работе в многопользовательском режиме.

Попробуйте, например, прикинуть какие потребуются действия, чтобы при создании новой записи "одновременно" двумя пользователями не произошло затирание информации, введенной одним из пользователей. Т.е. два пользователя "одновременно" сделали LOCATE, но RECALL естественно сделал только один из них. Как заставить другого пользователя отказаться от притязаний на обладание найденной записью в пользу первого, сделавшего RECALL? Разумеется, задача решаемая. Я просто хочу показать, что она достаточно не тривиальна.

Кроме того, данная стратегия фактически запрещает использовать Memo-поля. Почему? Да потому, что при работе с Memo-полями время от времени необходимо давать команду PACK. Это связано с особенностью работы с memo-полями. (...) Ну а если все равно приходится давать команду PACK, то какой смысл во всех этих сложностях?

Итого, получается, что использование данной стратегии накладывает значительные ограничения на программиста.


Восстановление записей, помеченных как удаленные, можно делать только в очень ограниченных сценариях работы. В общем случае, так работать очень сложно. Это, скорее, инструмент отладки. В реальной работе слабо применимо.
4 июн 21, 01:26    [22331157]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8894
ВладимирМ
Крайне плохая стратегия. Нет, физически-то возможно, но идеологически - неправильно...

Когда Ваша программа работает 24/7 365 дней в году - у Вас просто нет выбора. Хотя на сегодня уже всё перенесли в Oracle и MS SQL server. Про FoxPro местные постоянно напоминали что это: "poor man solution"...
4 июн 21, 09:31    [22331201]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, запущено ли приложение в других терминальных сессиях  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7919
Sergey Ch
ВладимирМ
Крайне плохая стратегия. Нет, физически-то возможно, но идеологически - неправильно...

Когда Ваша программа работает 24/7 365 дней в году - у Вас просто нет выбора.


Угу. От безысходности. Просто по другому нельзя. Но разве это хорошо? И разве стоит это рекомендовать как хорошую альтернативу?

Sergey Ch
Хотя на сегодня уже всё перенесли в Oracle и MS SQL server. Про FoxPro местные постоянно напоминали что это: "poor man solution"...


Вот и я о том. Задача явно не соответствовала используемому инструменту. В конце концов заменили инструмент...

После всех этих рассуждений, возникает вопрос, который следовало бы задать с самого начала. А когда реально нет возможности выполнить команду PACK?

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

Разумеется, такие задачи тоже существуют. Но! Если у Вас стоит именно такая задача, то выбор в качестве хранилища данных таблиц DBASE - это весьма странный выбор. Дело тут не в том, что такую задачу сложно решить при помощи таблиц DBASE, а в том, что такие задачи предъявляют повышенные требования, как к надежности, так и к объему (количеству записей) базы данных. Т.е. в большинстве случаев требования таких задач заведомо превышают физические возможности формата хранения данных в таблицах DBASE.
4 июн 21, 22:31    [22331664]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить