Как заблокировать файл на различных прикладных уровнях?

Сообщения об ошибках устраняют множество проблем.

  • Ошибка overflow, как уже указывалось, связана с целочисленными ограничениями на аргументы функции TimeSerial.
  • Ошибка 1004, возникающая в полночь, связана с тем, что, когда Timer возвращается к 0 в полночь, ваше выражение для секунд является отрицательным числом. Если вы не используете систему дат 1904 года, вы не можете выражать отрицательные времена в Excel.
  • Пытаясь приспособиться к «переходу в полночь», вы объединяете секунды и дни, а также Excel и VBA. Вы в своем макросе пытаетесь добавить одну секунду, тогда как вы, вероятно, действительно хотите добавить один день. Кроме того, поскольку True в VBA равно -1, вы фактически вычитаете, а не добавляете в любом случае!

Я думаю, что следующие модификации могут работать, но не тестировали их всесторонне. 86400 - количество секунд в дне.

Option Explicit
Sub RunMe()

Dim StartS As Single
Dim CellS As Range
Dim Cellt As Range
Dim CountUPS As Date
Dim CountUp As Date

'Timer is the number of seconds since midnight.
'Store timer at this point in a variable
StartS = TIMER

'Store A1 in a variable to make it easier to refer
'to it later. Also, if the cell changes, you only
'have to change it in one place
Set CellS = Sheet1.Range("A1")

'This is the starting value.
CountUPS = TimeSerial(0, 0, 0)

'Set our cell to the starting value
CellS.Value = CountUPS

Set Cellt = Sheet1.Range("A2")
CountUp = Sheet1.Range("A2")

'b_pause = True

Do While CellS.Value >= 0

    CellS.Value = CountUPS + (TIMER - StartS - 86400 * (StartS > TIMER)) / 86400
    Cellt.Value = CountUp + (TIMER - StartS - 86400 * (StartS > TIMER)) / 86400
    DoEvents
Loop

End Sub
6
задан Eduard Wirch 1 February 2009 в 23:37
поделиться

6 ответов

Если только необходимо редко писать файл, как насчет того, чтобы писать, что файл под временным именем и затем использованием переименовывает для создания его "видимым" читателям?

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

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

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

1
ответ дан 10 December 2019 в 02:54
поделиться

A. Кажется, что время для базы данных :-). Вместо того, чтобы иметь совместно используемый файл что относительно того, чтобы хранить данные в базе данных.

B. Кроме того - разделение на уровни:

  1. Потоки блокировки в рамках процесса со стандартом синхронизировали блокировку.
  2. Межпроцесс/машина блокировки с основанной на файле блокировкой вводит вещь - например, создает каталог для содержания блокировки.

Вложенное множество 2 внутренних 1.

Все еще имеет проблему очистки.

C. Кроме того, некоторая запись к новому регистрирует/переименовывает стратегию так, чтобы читатель не должен был блокировать, возможно?

2
ответ дан 10 December 2019 в 02:54
поделиться

Вы перечислили возможные решения кроме очевидного: удалите зависимость от того файла

Есть ли иначе, чтобы потоки получили те данные вместо того, чтобы читать его из файла? Как насчет того, чтобы настроить некоторый процесс, кто ответственен за координирование доступа к той информации вместо того, чтобы считать все потоки файл.

2
ответ дан 10 December 2019 в 02:54
поделиться

Большая часть простого решения состоит в том, чтобы создать другой процесс (веб-сервис или независимо от того, что является самым простым Вам). Только этот процесс читает/пишет файл, и он слушает запросы чтения-записи другими сервисами.

В то время как могло бы казаться, что это медленнее, чем использование сетевого ресурса непосредственно, это не обязательно имеет место: Используя средства сетевого ресурса использовать клиент/сервер, который встроен в Вашу ОС (который делает точно что: отправьте запросы чтения-записи к серверу, который предлагает долю).

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

2
ответ дан 10 December 2019 в 02:54
поделиться

Используя java.nio.channels. FileLock, с ReadWriteLock.

На вашем месте я скрыл бы Файл, FileChannel и весь FileOutputStream из всего бизнес-кода. Замененный моим собственным простым классом адаптера, как ДАО.

например.

abstract class MyWriter{
    private FileChannel file;
    public void writeSomething(byte[] b){
        // get VM scope write lock here
        // get file lock here
        // do write
        // release file lock
        // release readwritelock lock
    }
}
1
ответ дан 10 December 2019 в 02:54
поделиться

Вы смогли бы использовать использование Семафора для управления доступом как один во время в рамках приложения?

Для заключения в кавычки API, "Семафоры часто используются для ограничения количества потоков, чем может получить доступ к некоторым (физический или логичный) ресурсы"

Пока, что API мог бы остаться конкретным контейнером, понятие распределенного Семафора должно быть достижимым, возможно с JGroups.

Поверхностный поиск на Google для 'распределенного семафора Java' поднял Устройство автоматической смены дисков, которое похоже на него, мог обратиться к вышеупомянутому

1
ответ дан 10 December 2019 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: