Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Многопользовательский режим и все такое / 8 сообщений из 8, страница 1 из 1
23.03.2017, 10:31
    #39425479
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопользовательский режим и все такое
Добрый день,

Слабо многое себе представляю, поэтому прошу уважаемых форумчан пояснить пару моментов.

Есть проект, многопользовательский, ну не очень много, но 5-6 пользователей могут быть одновременно.

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

В проекте есть форма, у нее есть метод save, в самом конце метода создается текстовый файл с помощью copy to
Т.е. каждое изменение любым пользователем создает новый txt-файл, который пишется поверх прежнего.

Блокировка одновременного редактирования с помощью Rlock(), буфферизация 5.
Т.е. пытаемся блокировать одну запись.

Что происходит, если два юзера одновременно нажмут save ? По умолчанию, я считаю, что разница во времени все-таки всегда существует и останется какая-то последняя версия файла.
Далее планируется, что тот же код после создания txt-файла будет запускать exe-шник, который в свою очередь будет брать тестовый файл и отправлять данные на удаленный сервер. Например, RUN /N c:\temp\filename.exe

Что будет в случае одновременного запуска двумя и более пользователями ? Как вообще правильно строится такая идеология?
...
Рейтинг: 0 / 0
23.03.2017, 12:41
    #39425681
T1gRa_NT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопользовательский режим и все такое
А подключить БД сайта для просмотра обновлений вашей БД? или в идеале иметь 1 БД невозможно?
...
Рейтинг: 0 / 0
23.03.2017, 12:43
    #39425686
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопользовательский режим и все такое
T1gRa_NT,

нет, к сожалению, по ряду причин, и не все из них технические, это невозможно, по крайней мере в обозримой перспективе.
...
Рейтинг: 0 / 0
23.03.2017, 13:39
    #39425748
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопользовательский режим и все такое
Ну, "одновременно", разумеется, ничего не происходит. "Одновременность" - это иллюзия, которая создается системой. Но в данном случае, "камень преткновения" - это работа с файлом. Проблема в том, что FoxPro не может ее контролировать, как следствие, получаем неразрешимые конфликтные ситуации.

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

Логичным в этом случае представляется два возможных решения

1. Организация режима блокировки до завершения процесса создания и передачи файла
2. Организация стека файлов и стек передачи

Что имеется в виду

1. Организация режима блокировки до завершения процесса создания и передачи файла

Это значит, что как только пользователь нажал кнопку "Сохранить" следует взвести некий "флаг" (признак), говорящий другим пользователям о том, что начат процесс сохранения и передачи файла. И пока передача файла не будет завершена это признак не сбрасывается.

Как следствие, если перед началом процесса сохранения другой пользователь посмотрит на этот флаг и увидит, что он установлен, то выдавать сообщению пользователю о том, что в настоящий момент сохранение невозможно. Выполняется сохранение другим пользователем

Но у данного способа есть ряд недостатков

1. Сложность определения момента завершения копирования. Т.е. когда именно будет завершена работа внешней (по отношению к FoxPro) программы. Вот этой самой RUN /N c:\temp\filename.exe
2. В случае, если по каким-то причинам будет аварийное завершение работы программы и флаг останется не сброшенным, придется вмешиваться вручную для его изменения


2. Организация стека файлов и стек передачи

Здесь речь идет о том, что при каждом сохранении формируется уникальное имя файла. Лучше всего формировать имя файла как префикс + порядковый номер. Ну, что-то вроде File0001.txt, File0002.txt, File0003.txt,...

Это нужно для того, чтобы получив список файлов для передачи можно было понять, в какой последовательности передавать файлы. Кто был сначала, а кто потом. В принципе, очередь можно реализовать через дополнительную таблицу с парой полей: Порядковый номер, имя файла

Ну, а далее, процедура передачи RUN /N c:\temp\filename.exe будет последовательно перебирать файлы в порядке их создания и передавать на удаленный сервер. Если нужно, переименовывая их

Для определения порядка передачи файлов опираться на их время создания - нельзя. Дело в том, что существует минимальный интервал записи времени создания. Кажется, 1/3 секунды. Т.е. если файлы были созданы с интервалом меньше, чем этот минимальный интервал, то по значению системного времени создания файла будет невозможно сказать какой из них был создан раньше, а какой позже
...
Рейтинг: 0 / 0
23.03.2017, 13:58
    #39425769
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопользовательский режим и все такое
ВладимирМ,

Спасибо за развернутый ответ, на некоторые мысли натолкнуло, буду что-то пробовать.
...
Рейтинг: 0 / 0
23.03.2017, 14:14
    #39425786
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопользовательский режим и все такое
А можно ли как-то проверить из Fox запущена ли внешняя программа? Т.е. если filename.exe запущена - пользователю сообщат и попросят подождать, затем внешняя программа отработает, а пользователь повторит попытку сохранить и все тогда сложится наилучшим образом ?
...
Рейтинг: 0 / 0
23.03.2017, 15:14
    #39425857
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопользовательский режим и все такое
DmitryKnА можно ли как-то проверить из Fox запущена ли внешняя программа? Т.е. если filename.exe запущена - пользователю сообщат и попросят подождать, затем внешняя программа отработает, а пользователь повторит попытку сохранить и все тогда сложится наилучшим образом ?

В принципе можно. Используя API-функции получить мгновенный снимок списка процессов и сделать поиск нужного процесса. Но!

На каком компьютере Вы собираетесь искать этот процесс?

На том, где работает текущий пользователь? На "сервере"? На всех компьютерах локальной сети?

Кроме того, у Вас есть гарантия, что filename.exe запущен именно Вашим приложением? Может, кто-то просто из проводника запустил для копирования своих файлов. Также остается проблема "зависания". Ну, завис процесс. Потребуется ручное вмешательство, чтобы его "пнуть"

И это еще если процесс работает без создания процессов-диспетчеров как Acrobat-reader, например. Попробуйте открыть любой файл PDF и посмотрите список процессов. Вы с удивлением увидите, что процессов больше, чем открытых файлов PDF.

Т.е. это тупиковый путь. Использовать можно только в очень ограниченных и специфических ситуациях.
...
Рейтинг: 0 / 0
23.03.2017, 16:04
    #39425918
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопользовательский режим и все такое
ВладимирМ,

Понятно (.

Спасибо большое за комментарий, буду думать дальше.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Многопользовательский режим и все такое / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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