Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизЗадержка выполнения программы Найти похожие ветки
← →
Записюн (2010-03-02 16:39) [0]Столкнулся с проблемой. При сохранении в типизированный файл большого объема инфы одной записью (Запись получается большая, но в файле она одна) возникают ошибки на методе CloseFile. Если зацементировать строку с закрытием файла то все номрально и без ошибок. При этом если после этого просто нажать на кнопку с вызовом этого метода то все тож проходит без ошибок. Предполагаю, что процедура Write "записывает слишком долго" и при выходе из нее запись еще не завершена. Такое возможно? И в связи с этим вопрос... как проверить не занят ли в настоящее время файл и могу ли я его закрыть.
← →
Sairex (2010-03-02 16:48) [1]А через TFileStream не пробывал писать?
← →
Плохиш © (2010-03-02 18:44) [2]
> Записюн (02.03.10 16:39)
В вашем глюкокоде ошибка.
← →
Вася (2010-03-02 19:30) [3]
> Предполагаю, что процедура Write "записывает слишком долго"
> и при выходе из нее запись еще не завершена. Такое возможно?
>
нет, вызов синхронный. ТО есть управление будет получено обратно уже после завершения операции (успешного или неуспешного)
← →
Сергей М. © (2010-03-02 19:51) [4]
> в типизированный файл
Судя по всуе упомянутой "типизации" налицо глюкокод
← →
Игорь Шевченко © (2010-03-02 23:15) [5]
> Предполагаю, что процедура Write "записывает слишком долго"
> и при выходе из нее запись еще не завершена
предположение неверное
← →
Записюн (2010-03-03 11:23) [6]const
MaxPN=100;
type
TWayPN=array[1..MaxPN,1..MaxPN]of integer;
var
FWayPN :file of TWayPN;
...
{$I-}
AssignFile(FWayPN,PathProgramm+PathDictionary+PathCurDistr+PathWayPN);
Reset(FWayPN);
Read(FWayPN,WayPN);
//вставить задержку по времени
// closeFile(FPN);
{$I+}
if IOResult<>0
then
begin
ClearWayPN;
AssignFile(FWayPN,PathProgramm+PathDictionary+PathCurDistr+PathWayPN);
Rewrite(FWayPN);
Write(FWayPN,WayPN);
// closeFile(FPN);
end;
так вот всегда эта процедура проходит по ветви с ошибкой. Когда регистр IOresult не равен 0. Может дейсчвительно я где-то накосячил?
← →
Сергей М. © (2010-03-03 11:32) [7]Конечно накосячил)
OResult returns the result of the last Delphi I/O routine when I/O-checking is off (that is, when using the {$I-} compiler option)
← →
Записюн (2010-03-03 12:03) [8]Ну...все верно. Компилятор в общем и целом хранит в регистре ioresult сотсояние ошибок ввода вывода. Где косяк? Или я опять что-то непонимаю
← →
Сергей М. © (2010-03-03 12:07) [9]Чего "все верно"-то ?
Для того чтобы IOResult возвращала актуальный результат, опция $I должна быть выключена !
А у тебя она, наоборот, включена)
Вот IOResult тебе хрень и возвращает. А ты эту хрень пытаешься трактовать как актуальный результат непонятно какой операции)
← →
Записюн (2010-03-03 12:10) [10]Блин. Все. Вопрос снят. Сам косяк. Прошу прощения
← →
Сергей М. © (2010-03-03 12:13) [11]Да и к чему этот геморрой с AssignFile и иже с ней ?
with TFileStream.Create("myfile", fmOpenRead) do
try
ReadBuffer(WayPN, SizeOf(WayPN));
finally
Free;
end;
← →
Записюн (2010-03-03 12:24) [12]Подождите. Помоему директивы компилятору написаны в верном порядке. Перед критичным участком отключам вывод ошибок ввода ввывода, чтоб не выскакивало неконтролируемое исключение, а потом за этот бонус вынуждены вручную проверять состояние регистра. Разве нетак? А в указанной строке
> Сергей М. © (03.03.10 11:32) [7]
> Конечно накосячил)OResult returns the result of the last
> Delphi I/O routine when I/O-checking is off (that is, when
> using the {$I-} compiler option)
грубо говоря написано, что проверять значения регистра можно толко после блока выключить. Но и насколько мне известно ошибку проверять можно толко после включения директивой.
А ошибка которую я искал оказалась тривиальной. Я закрываю не тот файл)))
← →
Записюн (2010-03-03 12:25) [13]Программа учебная. Потоки исключаются
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.062 c