Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7

Взаимодействие копий программы

31.05.2023, 04:43. Показов 2926. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не знаю, в какой раздел этот вопрос, но, поскольку программа будет на Lazarus, то и вопрос сюда.
Есть где-то на сервере база данных (пусть PostgreSQL, хотя это неважно). В базе данных есть некоторое количество сущностей.
Есть рабочие станции, на которых стоят копии программы.
Каждая копия программы может читать одну сущность в память своей станции, оператор будет работать с ней какое-то время, а затем может записать измененную сущность обратно, а может и не записать.
Вопрос в следующем: можно организовать так, что программа при доступе к сущности будет получать информацию о том, что кто-то с сущностью уже работает?
И самое главное: чтобы это было корректно.

Добавлено через 6 минут
Поясню, что значит корректно.
Первая мысль, которая приходит в голову - это в БД для каждой сущности завести поле, в котором каждая копия программы при доступе к сущности увеличивает счётчик на 1, а когда покидает - уменьшает на единицу. Но эта мысль не предусматривает форс-мажоры. Допустим программа открыла сущность, а станция вырубилась, погас свет, оператор завершил программу аварийно и т.д. Признак доступа остался висеть, хотя реально это не так. Это некорректно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.05.2023, 04:43
Ответы с готовыми решениями:

Ограничение на кол-во запущенных копий программы
Разрабатываю программу по работе с БД. Планирую продавать фирмам. Как реализовать возможность продажи программы на определенное кол-во...

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

Запуск несколько копий программы
Возможно ли запустить несколько копий программы с разных пользователей? Если возможно, как это сделать на примере qBittorrent?

40
Markiz Red Devil
 Аватар для Ludwig Valentin
171 / 296 / 26
Регистрация: 11.08.2022
Сообщений: 3,868
31.05.2023, 09:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Я не хочу заблокировать "сущность" на время в монопольный доступ. Я, правда, не хочу этого ))) И, более того, об этом у меня нигде не написано.
Ну и пусть клиенты читают вашу сущность сколько хотят раз. При чтении данных коллизии нет.
Коллизия возникает только при записи.
Но вы записывайте данные построчно.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
31.05.2023, 09:37
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Я не хочу заблокировать "сущность" на время в монопольный доступ.
Тогда, как понимать это?
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Вопрос в следующем: можно организовать так, что программа при доступе к сущности будет получать информацию о том, что кто-то с сущностью уже работает?
Ну вот получила программа информацию о том, что кто-то с сущностью уже работает, и что дальше? Сама тоже начинает с ней работать, или ждёт, пока этот "кто-то" закончит свою работу?
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
31.05.2023, 09:44  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Сама тоже начинает с ней работать
Да, с предупреждением оператору. Но при записи (если такая будет) анализирует ситуацию для избежания коллизий. Возможно, тоже с привлечением оператора.
0
Markiz Red Devil
 Аватар для Ludwig Valentin
171 / 296 / 26
Регистрация: 11.08.2022
Сообщений: 3,868
31.05.2023, 10:01
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Да, с предупреждением оператору.
Триггеров на чтение вроде как ещё не придумали.
Всё держится на доверии к администратору.
Вот и надо поделить данные на важные - доступные только для администратора, и менее важные, доступные для простого оператора.

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

Добавлено через 7 минут
Или Mission impossible?
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
31.05.2023, 10:20
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Да, с предупреждением оператору. Но при записи (если такая будет) анализирует ситуацию для избежания коллизий.
Этот момент нужно продумать.
- Либо считывает новые данные, изменённые другим оператором, и предлагает сравнить.
- Либо не глядя перезаписывает поверх изменённых данных.
- Либо, если данные уже кто-то открыл, то второму оператору данные открываются только для чтения, чтобы он не мог изменить их. И при нажатии на кнопку "Обновить" программа ещё раз пытается их прочитать, и если данные никем не заняты, то уже открывает в режиме для изменения.
0
Markiz Red Devil
 Аватар для Ludwig Valentin
171 / 296 / 26
Регистрация: 11.08.2022
Сообщений: 3,868
31.05.2023, 10:42
Можно поделить ваши данные на блоки фиксированной длины - сотни или тысячи строк.
И отсчёт вести от нуля или единицы по идентификатору.
И при доступе к очередной порции данных ставить флажок "занято" во вспомогательную таблицу.
Тогда следующий клиент будет знать, что данные заняты.
А при окончании работы с блоком этот флажок снимается.
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
31.05.2023, 11:22  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Этот момент нужно продумать.
Конечно. Ещё вариант звонок по телефону:
-Петрович, ты что там на объекте Х делаешь?
-Да просто смотрю.
-А, ну тогда я записываю.
-Давай.

Тогда нужно не только знание, что объект занят, а ещё и кем занят.
0
Markiz Red Devil
 Аватар для Ludwig Valentin
171 / 296 / 26
Регистрация: 11.08.2022
Сообщений: 3,868
31.05.2023, 11:27
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Тогда нужно не только знание, что объект занят, а ещё и кем занят.
Добавь ещё одно поле в таблицу, в котором будешь сигнализировать кто оператор.
Итого - номер блока, логин оператора, время начала работы, время окончания работы, флажок занято сейчас - чисто для удобства.

Добавлено через 1 минуту
Или даже вместо номера блока два столбца - идентификатор начала блока, идентификатор конца блока.
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
31.05.2023, 11:28  [ТС]
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Тогда нужно не только знание, что объект занят, а ещё и кем занят.
Вообще, конечно, по жизни эта ситуация достаточно редкая.
Но это не значит, что её не нужно предусмотреть.
0
Markiz Red Devil
 Аватар для Ludwig Valentin
171 / 296 / 26
Регистрация: 11.08.2022
Сообщений: 3,868
31.05.2023, 11:30
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Вообще, конечно, по жизни эта ситуация достаточно редкая.
Но это не значит, что её не нужно предусмотреть.
Придумать-то я придумал, но что-то не верю в этот анализ.
Ненатурально как-то получается.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
31.05.2023, 11:31
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Тогда нужно не только знание, что объект занят, а ещё и кем занят.
Тогда, не столько кем занят, а с какой целью. И 2 кнопки в программе: Открыть для просмотра - открывает всегда без внесения информации об этом факте. И второй вариант - открыть для изменения. Вот тогда уже проверяется открыто ли кем-либо ещё.

А при открытии только для чтения можно периодически проверять время последнего обновления данных и при его изменении автоматически перечитывать данные.
1
Markiz Red Devil
 Аватар для Ludwig Valentin
171 / 296 / 26
Регистрация: 11.08.2022
Сообщений: 3,868
31.05.2023, 11:34
Как Галилео в своё время - а всё-таки она вертится!
Всё-таки надо упростить модель работы и обеспечить неколлизионность данных транзакциями.
Пересмотреть весь подход к анализу.
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
31.05.2023, 11:38  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Открыть для просмотра - открывает всегда без внесения информации об этом факте. И второй вариант - открыть для изменения.
А вот это интересно. Причём кнопку коррекции сделать менее удобной.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
31.05.2023, 11:44
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Причём кнопку коррекции сделать менее удобной.
Можно и так. Ещё можно кнопку коррекции дублировать на форме просмотра, и при нажатии открывать данные заново для редактирования и тут же разрешить редактирование в элементах управления на форме. Так будет вполне удобно, думаю.
0
Эксперт .NET
 Аватар для Rius
13845 / 7887 / 1706
Регистрация: 25.05.2015
Сообщений: 23,943
Записей в блоге: 14
31.05.2023, 13:05
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Вообще, конечно, по жизни эта ситуация достаточно редкая.
Но это не значит, что её не нужно предусмотреть.
В той или иной мере есть в ClearCase (checkin, checkout) , SVN (аналогичнр), SharePoint (аналогично), MS Office (блокировка документа на сетевом диске, в файле блокировки видно - кем).
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
22.06.2023, 23:29  [ТС]
Ну, вот, с СУБД PostgreSQL как-то так получается:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//-----------------Условная "Блокировка" объекта, id - ключевое поле объекта
// Result=0 - объект захвачен нами,  =1 - объект занят, =2 - прочие ошибки 
function LockObject(id:integer):integer;    
begin   
ExecSql('begin;');     //---начинаем транзакцию
Result:=0;glid:=id;    //---записываем id в глобальную переменную (или в форму, если она есть)
try 
ExecSql('select lockstamp from r_objects where id='+IntToStr(id)+' for update;');   //---блокировка записи
except  on E:EPQdatabaseError do
    begin
    ExecSql('rollback');ShowMessage(E.Message);Result:=2;exit; //---если есть ошибки - откат и разблокировка записи
    end;
end;    
//---получаем время в секундах, прошедшее с последней записи
x:=SelectOneFloatValue('select cast(extract(epoch from now())-extract(epoch from lockstamp) as float8) from r_objects where id='+IntToStr(id)+';'); 
if (IsNAN(x)=true) or (x>40) then   //---если прошло больше чем 40 секунд - считаем, что объект освобождён.
    begin
    ExecSql('update r_objects set lockstamp=now() where id='+IntToStr(id)+';'); //---Записываем текущее время
    ExecSql('commit;');Timer1.Interval:=15000;Timer1.Enabled:=True;exit;        //---Запускаем таймер на 15 секунд, объект захвачен нами
    end;
ExecSql('rollback');Result:=1;  //---Объект занят, откат
end;    
    
procedure TMainForm.Timer1Timer(Sender: TObject);   
begin   
ExecSql('begin;');  
ExecSql('update r_objects set lockstamp=now() where id='+IntToStr(glid)+';');   //---Перезаписываем время
ExecSql('commit;'); 
end;
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
05.01.2024, 11:20  [ТС]
Возращаюсь к вопросу - реализовал идею в коде, работает, но есть нюансы. Проблема в том, что по таймеру происходит запись очередной временнОй метки в таблицу,
Pascal
1
2
3
BeginTransaction(_mdb);
ExecSql(_mdb,'update r_objects SET lockstamp=Now()::timestamp where id='+IntToStr(id)+';');
Commit(_mdb);
...и происходит это в произвольный момент. Если в это время что-то пишется или даже читается, то случаются сбои. Вопрос заключается в том, чем лучше синхронизировать эти вещи? Блокировками данных? Средствами ОС?
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
06.01.2024, 02:56  [ТС]
В общем, лучше всего оказалось останавливать таймер на время транзакции.
0
156 / 64 / 16
Регистрация: 12.12.2023
Сообщений: 395
06.01.2024, 14:48
Вычисляете хэш от идентификатора сущности и вызываете pg_advisory_lock или pg_try_advisory_lock. В первом случае вы зависнете в ожидании получения права на редактирование сущности, во втором сразу получаете отлуп что кто-то уже ее редактирует прямо сейчас. В случае если приложение умирает - эти локи сами освободятся при потере коннекта постгреса с клиентом

Или вы хотите успешно начать редактировать и только при попытке закомитить изменения получить отлуп что у вас это не выйдет, потому-что за это время ее уже кто то редактировал? Это делается даже проще - update ... where field1=:oldField1 and field2=... и так сравнение всех полей какими они были до начала редактирования. Если что то поменялось то апдейт не пройдет и вернется 0 измененных записей

Но по моему лучше все-таки получать отлуп до начала редактирования а не по завершении
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
06.01.2024, 16:09  [ТС]
Почитайте внимательнее. Мне не нужно ни зависание, ни отказ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2024, 16:09

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

Ограничение кол-ва запущенных копий программы.
Народ подскажите как программе на WPF запретить запускать больше одной копии? Код, что ниже не работает. public partial class...

Проверка сколько копий программы запущенно
Всем привет , есть мой софт который юзает 20-30 человек . Как узнать сколько копий запущенно именно сейчас и мониторить это количество ? +...

Поиск копий файлов и удаление найденных копий
Столкнулся с подобным заданием и никак, не могу понять как его решить: Разработать пакетный файл, находящий копии файлов в 2х заданных...

Запуск в цикле не более N копий программы одновременно
Здравствуйте, есть папка, в которой лежит N количество папок. Скрипт сканирует 1 уровень папок и архивирует их и все содержимое в zip...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru