История развития программирования, программирование, языки программирования, книги программирование На сайте представлена информация про программирование в Интернете и работу  

Интерфейсная часть, Кнопка "Select All" и выбор c ctrl/shift
xp кнопки, Как изменить стиль кнопок на ХРишный?
Функции печати.
TextBox, как добавить текст не стирая старый
Полосы прокрутки
Формы, Формы
combobox и
Unicode в Java, как добиться многоязычности?
Извлечение из строки n-го элемента, можно с помощью ExtractElement
Поиск Cristal Reports 6.0, Печать из приложений VB
Народ, подскажите с драйверами!, Access2003 and VB6
ProgressBar и Timer, Времени нет думать о времени таймера
ПОИСК одинаковых значений в столбце EXCEL, нужно удалить дублирующие значение
Консольная прога внутри моего exe-шника, Хочу запихать exe-консоль внуть своей
чтение файла в DOS кодировке в EXCEL, нужен макрос для чтения файла на VBA
Как получить цвет, по системной константе
Timer, ProgressBar, File, Таймер и ПРогрессБар
Перебор элементов в цикле, Перебор элементов в цикле для VBA Office
Средняя кнопка мыши, вспомнил тут...
Проблема с ЭктивХ, run-time error '3343'
Алгебра логики
Пжалуйста помогите разобраться с Windows API
Откровенно простой вопрос, Пробелы
ActiveX Controll, нужна помощь
TextBox, TextBox
Загрузка SQL-запроса из текстового файла, Как загрузить в VB запрос из txt или doc
Зимнее или летнее время ?, Как узнать какое час время ?
Timer
Меню в VB
Синхронизация доступа, к файлу
Вопрос, Я новичок
Мне надо удалить пробельчики, Пробельчики надо удалить
Excel в VB, Открытие таблицы Excel в VB
Djvu на форме, как задать ему файл?
Работа с Connection, проводник с поддержкой связанных значенн
Подскажите с VB
Компиляция exe-файла, ActiveX внутри exe-файла
Что такое ActiveX EXE
Как Вы относитесь к курящим девушкам?
Копирование записи в БД, Как програмно скопировать запись в БД
Рандомный символ…
Как и с чего начать?, бег с препятствиями...
Вывод в форму связанных таблиц, Access and vb
доступ в папку под другим Логином из кода
ProgressBar относительно 2-ух файлов, Отображение Progress Bar'a
Отказ на пустые бланки
вставка в компонент картинки, activeX
Конвертировать BMP в JPG
Возможность загрузки элимента отличного от VB
Работа с MSFlexGrid, а точнее с выводом в него данных запроса
Контроль за копированием БД на сервер, Произведена ли замена БД
FLPVBX20.VBX, Ищу файл
готовый e-shop, где можно взять готовый или компоненты
переключение как в punto switchere
функция с двумя условиями, помогите создать такую функцию
Как сменить значение счетчика?, В бд Access
Проблема с сохранением записи в бд
Printscreen по просьбе Flotskiy, Готовый проект
запись звука с источника в RAM, как записать без DirectX
Как при создании письма outlook добавлять подпись?
Сохранение обьекта, можно сохранить обьект в файл
Visual Basic Extensibility
Выскажите ваше мнение о книге?, Если читали...
VBA в excel, цикл перебирающий ячейки
api для вызрва диалога откоытия файлов, api для вызрва диалога откоытия фа
размеры data и combobox, сабж
Создание нового объекта на форме, во время выполнения приложения (Label)
Вопрос по прозрачности???
Вопрос по операторам, Функции операторов
Графическая оболочка в VB6, Хочу написать графическую оболочку

Платные хостинги     Раскрутка сайта     Книги по программированию


Синхронизация доступа, к файлу

Только здесь 1000 посетителей на Ваш сайт всего за 3 у.е.!

- Есть 2 потока. Один читае файл, а другой пишет. Как синхронизировать доступ к файлу ?

- Простейший способ, хотя и не самый оптимальный:Код Object LOCK = new Object();....synchronized(LOCK){//делаем здесь ВСЕ манипуляции с файлом}highlightSyntax('javac0OTM=','java');Есть еще варианты, но надо смотреть по задаче, надо ли уведомлять читающий процесс о новых данных, надо ли на это время останавливать запись в файл и т.д. Это сообщение отредактировал LSD - 13.2.2005, 00:12

- Смысл такой - читающий поток проверяет дату последнего изменения файла. Если она изменилась, то он читает его. Пишуший поток просто пишет через определенные период времени.

- Тогда можно сделать как LSD предлагает, только учти что lock должен быть один и тот же для обеих тредовКод public static final Object LOCK = new Object();... // тред 1synchronized(LOCK){   проверяем дату} ...// тред 2synchronized(LOCK){     пишем в файл} highlightSyntax('javaOTE4YW','java');

- Наверное так не получится - эти потоки находятся в разных приложениях.Тоесть они могут запускаться независимо друг от друга.Может это можно сделать средствами самого файла ?

- Для чтения использовать RandomAccessFile и открывать файл на запись, если в этот момент в файл пишет другая программа, то будет ошибка.

- public void syncronized read() throws .... { // insert code here}public void syncronized write() throws ....{ // insert code here}

- Все это не должно принадлежать этим двум тредам.Пожалуйстa пользуйся тегами [codе=javа] [/code].

- Цитата Наверное так не получится - эти потоки находятся в разных приложениях.Тоесть они могут запускаться независимо друг от друга.Пока не оказалось, что это вообще разные файлы на разных машинах, предложу следующее (это просто кусок из моего кода, не адаптированный под текущий вопрос):Код ...FileInputStream fis = new FileInputStream( ...);FileChannel chan = fis.getChannel();FileLock lock = chan.tryLock(0, Long.MAX_VALUE, true);if (lock == null) {    System.out.println( "Другой процесс использует файл");} else {    ...    lock.release();}fis.close();...highlightSyntax('javaDU5ODQ','java'); Это сообщение отредактировал Zandr - 28.2.2005, 14:30

- извиняюсь - не зашел

- Значит юзай блокировки на уровне файловой системы, как в примере выше (я его попровил немного). Там осуществляется попытка блокировки на запись. Остальное в API.

- Что-то не очень-то получаетсяесли блокировать и читающий процесс и пишущий, то вроде все должно работать, но все равно слетает

- В какую сторону?

- Пробовал тестовый вариант, в котором при чтении файл блокируется для изменения, а при записи монопольно - вроде все работает. Непонятно, почему при чтении тоже нельзя монопольно заблокировать ?Код java.nio.channels.NonWritableChannelException    at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:784)    at java.nio.channels.FileChannel.tryLock(FileChannel.java:967)highlightSyntax('javaDY3Mzc','java');Тестовый вариантКод public class Lock {    private static String filePath = "C:\\test.txt";    private static File file = new File (filePath);    public Lock() {        readFile();                writeFile();                    }    public void readFile (){        try {                       FileInputStream stream = new FileInputStream ( file );            FileChannel chan = stream.getChannel ();            FileLock lock = chan.tryLock (0, Long.MAX_VALUE, true);            if ( lock == null ) {                System.out.println ( "Файл заблокирован на запись" );                return;            }            else {//                lock.release ();//                chan.close();//                stream.close ();            }        }        catch ( Throwable t ) {            t.printStackTrace ();        }    }    public void writeFile(){        try {            StreamResult outStream = new StreamResult ( file );                                    FileOutputStream stream = new FileOutputStream ( file );            FileChannel chan = stream.getChannel ();            FileLock lock = chan.tryLock ();            if ( lock == null ) {                System.out.println ( "Файл заблокирован на чтение" );                return;            }            else {//                stream.write(-1);//                lock.release ();//                chan.close();//                stream.close ();            }        }        catch ( Throwable ex ) {            ex.printStackTrace ();        }    }    public static void main(String[] args) {        Lock lock = new Lock ();    }}highlightSyntax('javaZjUyNj','java');И самое главное. Это все работает при FileInputStream & FileOutputStream. Но мне надо при записи использовать StreamResult - а с ним к сожалению не получится получить FileChannel. Как быть ?Думал прокатит такКод             FileOutputStream stream = new FileOutputStream (file);            StreamResult out = new StreamResult ( stream );                        FileChannel chan = stream.getChannel ();            FileLock lock = chan.tryLock ();            if ( lock == null ) {                System.out.println ( "Файл заблокирован на чтение" );                return;            }            else {    transformer.transform ( source, out );                lock.release ();                chan.close();                stream.close ();            }highlightSyntax('javazNjI0N','java');Но не дает писать - говорит файл заблокированP.S. Блин - задолбался с этой синхронизацией, что нельзя было просто сделать что-нибудь вроде Mutex Это сообщение отредактировал zss - 12.3.2005, 15:45

Интернет казино     Онлайн игры     Увеличение члена     Купить DVD


Главная страница | история развития программирования | компьютеры программирование | lg программирование | задачи квадратичного программирования | winapi программирование | программирование x | программирование djvu | программирование visual foxpro | wap программирования | xp программирование | классы программирование | программирование motorola | графы программирование | программирование атс panasonic | языки программирования развитие | линейное программирование лекции | фортран программирования | программирование драйверов windows | tcp программирование | программирование qbasic | программирование проблемы | примеры задач линейного программирования | параметрическое программирование | дельфи программирование | программирование мыши | Ссылки

Все про классы программирование