Буферный файл
От: Prond  
Дата: 18.06.03 09:51
Оценка:
Несколько экземпляров программы запускается с разными параметрами, отрабатывают и пишут результат в базу.
Нужно в случае невозможности подключения в базу кидать данные в буферный файл, потом с этого файла другой модуль будет периодически докидывать в базу информацию.

Думал сделать через INI

каждый файл пишет в этот ini секцию (название — время)
и в эту секцию пишет ключ (идентификатор опрашиваемого модуля — каждый экземпляр программы опрашивает свой модуль) и значение.

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

[время опроса]
1=значение
2=значение

При следующих запусках создается новая секция и т.д

Но, в результате в секции остается только последняя запись, несмотря на уникальный ключ. Я думал, что переписывается только значение ключа, если оно уже существует, а у меня тупо вытираются все предыдущие ключи и остаются записанные.

В общем подскажите оптимальный вариант организации буфера.

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



18.06.03 14:43: Перенесено модератором из 'C/C++' — ПК
Re: Буферный файл
От: Prond  
Дата: 18.06.03 10:01
Оценка:
С INI разобрался, по глупости использовал WritePrivateProfileSection вместо WritePrivateProfileString, вот он секцию и переписывал.

Тем не менее, может тут есть подводные камни?
Re[2]: Буферный файл
От: Prond  
Дата: 18.06.03 10:33
Оценка:
Вопрос еще

Как можно перебрать секции и значения INI файла не зная названия?
Re[3]: Буферный файл
От: hard.disk  
Дата: 19.06.03 05:28
Оценка:
Здравствуйте, Prond, Вы писали:

P>Вопрос еще


P>Как можно перебрать секции и значения INI файла не зная названия?


GetPrivateProfileSectionNames
GetPrivateProfileSection
Re[2]: Буферный файл
От: Vadim B  
Дата: 19.06.03 06:09
Оценка:
Здравствуйте, Prond, Вы писали:

P>С INI разобрался, по глупости использовал WritePrivateProfileSection вместо WritePrivateProfileString, вот он секцию и переписывал.


P>Тем не менее, может тут есть подводные камни?


По-моему, размер INI файла ограничен 64К. И работает оно медленно — система каждый раз парсит его.

Можно, например, каждый раз создавать новый файл. Но при большом количестве записей файлов будет много и производительность файловой системы тоже сильно упадет. Можно, например, открывать файл на дозапись и добавлять данные; если открыть файл не удается, то можно ждать, пока удастся. Либо другой вариант — если открыть файл "1" не удается, то попробовать открыть файл "2" и дозаписать в него, если нет — то "3" и т.д. Потом перебрать все созданные файлы. Парсить особо не нужно будет, если каждый раз новую строку создавать. Оптимальность зависит от интенсивности запросов — если у тебя постоянно будут конфликты между 10 экземплярами, то это будет неэффективно, а если конфликт будет раз в час — то нормально.
Re: Буферный файл
От: scaramush  
Дата: 19.06.03 07:17
Оценка:
А XML не подойдет? Его и дописывать более или менее просто, и парсеры есть, например микрософтовский msxml...
Re: Буферный файл
От: vvs86 Великобритания  
Дата: 19.06.03 08:28
Оценка:
Здравствуйте, Prond, Вы писали:

P>Несколько экземпляров программы запускается с разными параметрами, отрабатывают и пишут результат в базу.

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

P>Думал сделать через INI


P>каждый файл пишет в этот ini секцию (название — время)

P>и в эту секцию пишет ключ (идентификатор опрашиваемого модуля — каждый экземпляр программы опрашивает свой модуль) и значение.

P>Т.е. получается в одну и ту же секцию в результате работы модулей должны добавиться строки (при двух работающих экземплярах программы)


P>[время опроса]

P>1=значение
P>2=значение

P>При следующих запусках создается новая секция и т.д


P>Но, в результате в секции остается только последняя запись, несмотря на уникальный ключ. Я думал, что переписывается только значение ключа, если оно уже существует, а у меня тупо вытираются все предыдущие ключи и остаются записанные.


P>В общем подскажите оптимальный вариант организации буфера.


Можно попробовать распределение файла в память — они вроде часто используются чтобы обмениваться данными между разными процессами (тем более быстрее будет) — это мозно попробовать скомбинировать с ХМЛ
Re: Буферный файл
От: Аноним  
Дата: 23.06.03 06:26
Оценка:
Здравствуйте, Prond, Вы писали:

P>Несколько экземпляров программы запускается с разными параметрами, отрабатывают и пишут результат в базу.

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

P>Думал сделать через INI


P>каждый файл пишет в этот ini секцию (название — время)

P>и в эту секцию пишет ключ (идентификатор опрашиваемого модуля — каждый экземпляр программы опрашивает свой модуль) и значение.

P>Т.е. получается в одну и ту же секцию в результате работы модулей должны добавиться строки (при двух работающих экземплярах программы)


P>[время опроса]

P>1=значение
P>2=значение

P>При следующих запусках создается новая секция и т.д


P>Но, в результате в секции остается только последняя запись, несмотря на уникальный ключ. Я думал, что переписывается только значение ключа, если оно уже существует, а у меня тупо вытираются все предыдущие ключи и остаются записанные.


P>В общем подскажите оптимальный вариант организации буфера.


P>Можно создавать для каждого модуля свой файл и писать в него, но тогда его надо блокировать, разблорировать, парсить данные, но может быть можно так как я начал?


Зачем париться, если все уже придумано!!! Берешь DataSetProvider и ClientDataSet ам уже все предусмотрено и работает так, как ты говоришь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.