![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нити и запись в индивидуальный файл.
Riply © (2007-04-19 18:46:00)Здравствуйте !
Есть много нитей (в одном процессе), каждая из них (как только ей захочеться :),
может вызвать следущую процедуру, для записи в личный файл:
procedure Test_CallBack(cbError: DWord; BytesTransf: DWord); stdcall;
var
FileName: string;
begin
FileName := TestDir + PathDelim + IntToStr(GetCurrentThreadID) + '.txt';
if not Str_AddToFile(FileName, IntToStr(cbError) + '=' + IntToStr(BytesTransf))
then Log_WriteError('Error on: Test_CallBack - Str_AddToFile', GetLastError);
end;
Где
Str_AddToFile(const FName, StrValue: string) - Просто добавляет строку в файл(FName). Ничем не защищена.
Log_WriteError - Пишет в общий лог. Защищена глобальной кр. секцией.
Иногда запись в файл (Str_AddToFile) не происходит.
Возвращаемая ошибка: "The process cannot access the file because it is being used by another process".
Совсем перестала соображать: никак не получается представить себе ситуацию, когда это возможно.
Подскажите, пожалуйста, почему так происходит ?
Riply (2007-04-19 19:42:00) [21]Тороплюсь. Не добавила: в них Test_CallBack, тоже вызывается
Riply (2007-04-19 19:40:00) [22]>[11] Riply © (19.04.07 19:17)
Забыла добавить. Еще используются ReadFileEx и WriteFileEx (c OVERLAPPED_COMPLETION_ROUTINE).
Просто пока тестирую, сервер и клиенты сидят в одном процессе.
Riply (2007-04-19 19:30:00) [23]P.S.
Пойду проверять с IsMultithread := True.
Займет некоторое время. Ошибка редко проявляется :(
Riply (2007-04-19 19:27:00) [24]> [13] Leonid Troyanovsky © (19.04.07 19:25)
>System.IsMultithread := True?
Вручную не ставила.
umbra (2007-04-19 19:27:00) [25]а разве IoCompletion - это синхронная запись?
Leonid Troyanovsky (2007-04-19 19:25:00) [26]
> Riply © (19.04.07 19:17) [11]
> QueueUserWorkItem и BindIoCompletionCallback
System.IsMultithread := True?
--
Regards, LVT.
Riply (2007-04-19 19:19:00) [27]> [11] Riply © (19.04.07 19:17)
Test_CallBack находиться внутри их(QueueUserWorkItem и BindIoCompletionCallback) колбэков.
Riply (2007-04-19 19:17:00) [28]> [10] Leonid Troyanovsky © (19.04.07 19:08)
>Как создавались эти потоки (threads)?
QueueUserWorkItem и BindIoCompletionCallback
Leonid Troyanovsky (2007-04-19 19:08:00) [29]
> Riply © (19.04.07 18:46)
> Подскажите, пожалуйста, почему так происходит ?
Как создавались эти потоки (threads)?
--
Regards, LVT.
Kolan (2007-04-19 19:08:00) [30]> Str_AddToFile
Это вот что делает? Те как конкретно записывается в файл, что за файл
> Я не могу понять, почему не всегда срабатывает первая.
Как это не можете, сами же пишете «The process cannot access the file because it is being used by another process», вопрос почему так получается как я понял
Riply (2007-04-19 19:04:00) [31]> [6] Kolan © (19.04.07 19:00)
>Тогда код показывайте, так ниче не понятно.
>[0] Riply © (19.04.07 18:46)
>FileName := TestDir + PathDelim + IntToStr(GetCurrentThreadID)+ '.txt';
Riply (2007-04-19 19:03:00) [32]> [5] Kolan © (19.04.07 18:59)
>Вот вы зачем лог защитили, а?
Причем здесь это ?
Функцию записи в лог(которая, кстати, срабатывает только после ошибки в предыдущей),
можно вообще убрать.
Я не могу понять, почему не всегда срабатывает первая.
Kolan (2007-04-19 19:00:00) [33]> Если в другой, то мы и открываем другой файл.
Тогда код показывайте, так ниче не понятно.
Kolan (2007-04-19 18:59:00) [34]> Можете «на пальцах» объяснить что здесь «не так»
Вот вы зачем лог защитили, а?
И чем «лог» файл отличается от другого файла? Уверен что ничем
Riply (2007-04-19 18:57:00) [35]> [2] umbra © (19.04.07 18:55)
>предыдущее обращение к файлу не закончилось.
"не закончилось" в той же нити ? или в другой ?
Если в другой, то мы и открываем другой файл.
Riply (2007-04-19 18:55:00) [36]> [1] Kolan © (19.04.07 18:51)
>Главное сами пишете, что одно зашишино крит. секцией а второе нет…
>А потом спрашиваете «почему так происходит ?»
Ну и что ?
Мне непонятно, в чем крамола ?
Можете "на пальцах" объяснить что здесь "не так" ?
umbra (2007-04-19 18:55:00) [37]
> Есть много нитей (в одном процессе), каждая из них (как
> только ей захочеться :),
> может вызвать следущую процедуру, для записи в личный файл
предыдущее обращение к файлу не закончилось.
Kolan (2007-04-19 18:51:00) [38]> Str_AddToFile(const FName, StrValue: string) Просто добавляет
> строку в файл(FName). Ничем не защищена.
> Log_WriteError Пишет в общий лог. Защищена глобальной
> кр. секцией.
Главное сами пишете, что одно зашишино крит. секцией а второе нет А потом спрашиваете «почему так происходит ?»
Странно
ЗЫ
Смешивать стьль оформления Си и Delphi фу :)