|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
Доброго времени всем! Со временем накапливаются помеченные на удаление строки. Для их удаления нужен "монопольный" режим. Приложение работает в терминальном режиме, кроме того, в каждой сессии может быть запущено несколько раз. Вопрос: как правильно организовать, что бы специально назначенный пользователь запускал бы процедуру удаления, но при этом проверить, нет ли запущенных приложений в других сессиях, и, если такое возможно, что бы это было как-то не сложно, не погружаясь в winAPI и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2021, 14:54 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
Просто берешь и открываешь монопольно. Если не откроется - будет ошибка, лови ее через TRY ... CATCH ... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2021, 18:26 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
Простого решения нет. Точнее, есть решение "не погружаясь в WinAPI", но простым оно не будет Кто в данный момент работает с приложением ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2021, 18:54 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
Dima T, Попробуем, спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2021, 20:44 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
ВладимирМ, Спасибо. Я читал уже эту статью, перед тем, как задать вопрос, в целом мне понятна идея с таблицей, но для меня не выглядит простой в реализации. Может быть это более основательный и правильный вариант, но делать я это буду до-олго )) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2021, 20:51 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
DmitryKn, Удалось решить вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 18:58 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
DmitryKn Со временем накапливаются помеченные на удаление строки. Для их удаления нужен "монопольный" режим. Вопрос: как правильно организовать... Хорошая практика - не удалять помеченные не удаление записи, а вторично их использовать... Сделать это не сложно. Good luck! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2021, 21:47 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 10:16 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 21:40 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
Алек Веселов, Нет, оставил на туманное будущее, просто периодически запускаю, когда никого нет. Я осознаю уровень такого решения )) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 11:07 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
Sergey Ch, Изначально такая идея была, однако был переубежден, и теперь думаю, что в моем случае, так даже и лучше, потому что проще. Но если бы я не сам ковырялся, а ставил бы кому-то задачу - я бы посчитал использование помеченных строк более гармоничным и правильным. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 11:12 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
DmitryKn Алек Веселов, Нет, оставил на туманное будущее, просто периодически запускаю, когда никого нет. Я осознаю уровень такого решения )) Ну в смысле, как DimaT советовал в try... catch обернул, потестил, вроде все работает, спасибо DimaT, но все равно запускаю утром, пока нет никого. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 11:22 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
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, то какой смысл во всех этих сложностях? Итого, получается, что использование данной стратегии накладывает значительные ограничения на программиста. Восстановление записей, помеченных как удаленные, можно делать только в очень ограниченных сценариях работы. В общем случае, так работать очень сложно. Это, скорее, инструмент отладки. В реальной работе слабо применимо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 01:26 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
ВладимирМ Крайне плохая стратегия. Нет, физически-то возможно, но идеологически - неправильно... Когда Ваша программа работает 24/7 365 дней в году - у Вас просто нет выбора. Хотя на сегодня уже всё перенесли в Oracle и MS SQL server. Про FoxPro местные постоянно напоминали что это: "poor man solution"... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 09:31 |
|
Как определить, запущено ли приложение в других терминальных сессиях
|
|||
---|---|---|---|
#18+
Sergey Ch ВладимирМ Крайне плохая стратегия. Нет, физически-то возможно, но идеологически - неправильно... Когда Ваша программа работает 24/7 365 дней в году - у Вас просто нет выбора. Угу. От безысходности. Просто по другому нельзя. Но разве это хорошо? И разве стоит это рекомендовать как хорошую альтернативу? Sergey Ch Хотя на сегодня уже всё перенесли в Oracle и MS SQL server. Про FoxPro местные постоянно напоминали что это: "poor man solution"... Вот и я о том. Задача явно не соответствовала используемому инструменту. В конце концов заменили инструмент... После всех этих рассуждений, возникает вопрос, который следовало бы задать с самого начала. А когда реально нет возможности выполнить команду PACK? Нет возможности выполнить команду PACK, когда приложение работает в многопользовательском режиме и невозможно его остановить даже на профилактику, хотя бы на полчаса раз в год. Разумеется, такие задачи тоже существуют. Но! Если у Вас стоит именно такая задача, то выбор в качестве хранилища данных таблиц DBASE - это весьма странный выбор. Дело тут не в том, что такую задачу сложно решить при помощи таблиц DBASE, а в том, что такие задачи предъявляют повышенные требования, как к надежности, так и к объему (количеству записей) базы данных. Т.е. в большинстве случаев требования таких задач заведомо превышают физические возможности формата хранения данных в таблицах DBASE. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 22:31 |
|
|
start [/forum/topic.php?fid=41&fpage=2&tid=1581452]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 269ms |
total: | 446ms |
0 / 0 |