powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как определить, запущено ли приложение в других терминальных сессиях
15 сообщений из 15, страница 1 из 1
Как определить, запущено ли приложение в других терминальных сессиях
    #40051419
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени всем!

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

Вопрос: как правильно организовать, что бы специально назначенный пользователь запускал бы процедуру удаления, но при этом проверить, нет ли запущенных приложений в других сессиях, и, если такое возможно, что бы это было как-то не сложно, не погружаясь в winAPI и т.п.
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40051444
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто берешь и открываешь монопольно. Если не откроется - будет ошибка, лови ее через TRY ... CATCH ...
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40051449
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простого решения нет. Точнее, есть решение "не погружаясь в WinAPI", но простым оно не будет

Кто в данный момент работает с приложением
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40051472
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Попробуем, спасибо
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40051474
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Спасибо.
Я читал уже эту статью, перед тем, как задать вопрос, в целом мне понятна идея с таблицей, но для меня не выглядит простой в реализации. Может быть это более основательный и правильный вариант, но делать я это буду до-олго ))
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40073922
DmitryKn,

Удалось решить вопрос?
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40074893
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn
Со временем накапливаются помеченные на удаление строки. Для их удаления нужен "монопольный" режим.

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

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

Good luck!
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40074949
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn
Со временем накапливаются помеченные на удаление строки. Для их удаления нужен "монопольный" режим.

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


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

Sergey Ch

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



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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40075249
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.
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40075358
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алек Веселов,

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

Я осознаю уровень такого решения ))
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40075360
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Ch,

Изначально такая идея была, однако был переубежден, и теперь думаю, что в моем случае, так даже и лучше, потому что проще.
Но если бы я не сам ковырялся, а ставил бы кому-то задачу - я бы посчитал использование помеченных строк более гармоничным и правильным.
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40075365
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DmitryKn
Алек Веселов,

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

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


Ну в смысле, как DimaT советовал в try... catch обернул, потестил, вроде все работает, спасибо DimaT, но все равно запускаю утром, пока нет никого.
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40075541
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, то какой смысл во всех этих сложностях?

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

Восстановление записей, помеченных как удаленные, можно делать только в очень ограниченных сценариях работы. В общем случае, так работать очень сложно. Это, скорее, инструмент отладки. В реальной работе слабо применимо.
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40075576
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Крайне плохая стратегия. Нет, физически-то возможно, но идеологически - неправильно...

Когда Ваша программа работает 24/7 365 дней в году - у Вас просто нет выбора. Хотя на сегодня уже всё перенесли в Oracle и MS SQL server. Про FoxPro местные постоянно напоминали что это: "poor man solution"...
...
Рейтинг: 0 / 0
Как определить, запущено ли приложение в других терминальных сессиях
    #40075795
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Ch
ВладимирМ
Крайне плохая стратегия. Нет, физически-то возможно, но идеологически - неправильно...

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


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

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


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

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

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

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


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