Форум: "Прочее";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];
ВнизЗадержка на CloseHandle при чтении файла на удаленном ПК Найти похожие ветки
← →
balepa (2010-06-11 13:14) [0]Имеется ПО которое опрашивает приборы и "складывает" в файлы по "кругу". Формат такой: Первые два байта указатель на "последнюю" запись остальные (600 записей По одной записи на секунду, для графиков 10 мин.) время и данные, т.е. считываем первые два байта перемещаемся на нужную позицию и считываем текущие значения.
При каждой записи, т.е. 1 раз в секунду происходит открытие файла запись данных и закрытие. С этим проблем нет.
Вторая программа (на удаленном ПК) которая считывает данные и отображает их. Проблема в том что на CloseHandle бывают задержки до ~1 секунды. Программа написана на VB5 c использованием таймера, и эти задержки влияют на скорость реакции приложения и отображение полученных данных. Пока решил данную проблему так: При создании формы открываю файл и закрываю его по завершении работы приложения. А во время работы раз в секунду открываю с др. хэндлами считываю и закрываю, в данном случае закрытие происходит без задержек.
Пример кода в VB5:
Sub OprosSet10(NNN, Tip, Dn() As Integer, Dn00() As Integer, NoDn() As Byte, PadamM, NOV)
Dim Z As Integer
On Error GoTo errorh
Upper = UBound(Dn, 3)
Lower = LBound(Dn, 3)
Open FileO(NNN, PadamM, Tip) For Binary Access Read Shared As #1 "открытие на чтение с SHARE_READ or SHARE_WRITE
Get #1, 1, Z
Get #1, , KolOth
zzk = NomerVod(NNN, PadamM, Tip)
If zzk <> Z Then
Seek #1, (2858 - 0 * 2200) * (zzk - 1) + 5
m: zzk = zzk + 1
If zzk > 600 Then
zzk = 1
End If
Get #1, , min(NNN, zzk, PadamM, Tip)
Get #1, , Dn00
If zzk = 1 Then Seek #1, 5
For j = Lower To Upper
Dn(NNN, zzk, j, Tip) = Dn00(j) "DN(blok,Nzap,ustr,tip)
Next j
If NNN = 1 And PadamM = 0 Then
Dn(NNN, zzk, PNP_GP(NNN, 1436), Tip) = Dn(NNN, zzk, PNP_GP(NNN, 1436), Tip) - 50
End If
NomerVod(NNN, PadamM, Tip) = zzk
" If PadamM = 0 Then Call Vvod_ÐÀ(NNN, Tip)
If zzk <> Z And Z <> 0 Then GoTo m
NOV = 1
Else
NOV = 0
End If
errorh:
Close #1
End Sub
Думал может операторы open, close, get, неправильно работают под XP. Написал dll на дельфи для работы с файлами, та же история.
library pRmotFile;
uses
SysUtils,
Classes,Windows;
{$R *.res}
var
Data: Pointer;
function OpenFileRMOT(path: Pchar): Cardinal; stdcall;
var
hFile: Cardinal;
begin
hFile:= CreateFile(path,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
Result:= hFile;
end;
function ReadFileRMOT(hFile: Cardinal; AData: Pointer; size: Integer): Cardinal; stdcall;
var
nobr: Cardinal;
begin
data:= AllocMem(size);
ReadFile(hFile,Data^,size,nobr,nil);
Move(data^,AData^,size);
Result:= nobr;
FreeMem(data,size);
end;
function SetFilePointerRMOT(hFile: Cardinal; distance: Integer): Cardinal; stdcall;
var
err: cardinal;
begin
err:= SetFilePointer(hFile,distance,nil,FILE_BEGIN);
Result:= Err;
end;
function CloseFileRMOT(hFile: Cardinal): Cardinal; stdcall;
begin
CloseHandle(hFile);
end;
exports OpenFileRMOT,ReadFileRMOT,SetFilePointerRMOT, CloseFileRMOT;
begin
end.
ПК который собирает: W2k3 (файл-сервер),Core2Duo, 2x512Mb (533 Mhz) RAM, RAID1 WD 320Gb, LAN 1GB
ПК который считывает: WinXP SP2 LAN 100Mb-1Gb
P.S.: На компьютерах с Win98 проблем нет, да и на некоторых с WinXP, т.е. задержек на закрытии нет. Я понимаю что лучше уйти от файлов, я сейчас над этим работаю (перевожу на сокеты), но приложение большое и это займет некоторое время. Если нужно приведу код записи в файлы.
← →
RWolf © (2010-06-11 14:53) [1]
> Я понимаю что лучше уйти от файлов, я сейчас над этим работаю
> (перевожу на сокеты), но приложение большое и это займет
> некоторое время.
На Named Pipes проще перевести по идее — API тот же, что для файлов.
← →
balepa (2010-06-11 15:02) [2]
> RWolf © (11.06.10 14:53) [1]
>
>
> > Я понимаю что лучше уйти от файлов, я сейчас над этим
> работаю
> > (перевожу на сокеты), но приложение большое и это займет
> > некоторое время.
>
> На Named Pipes проще перевести по идее — API тот же, что
> для файлов.
Рассмотрим данный вариант. Спасибо.
← →
balepa (2010-06-14 06:49) [3]Так все таки кто-нибудь объяснит почему идет задержка на закрытии ?
Я, понимаю при записи в файл она может быть, но тут чтение.
← →
Anatoly Podgoretsky © (2010-06-14 08:54) [4]> balepa (14.06.2010 06:49:03) [3]
Тут не чтение, тут закрытие.
← →
balepa (2010-06-14 10:02) [5]
> Anatoly Podgoretsky © (14.06.10 08:54) [4]
>
> > balepa (14.06.2010 06:49:03) [3]
>
> Тут не чтение, тут закрытие.
Имелось ввиду закрытие после чтения.
← →
Anatoly Podgoretsky © (2010-06-14 10:20) [6]> balepa (14.06.2010 10:02:05) [5]
Не важно что имелось в виду, это совсем другой процесс. Обычно многие
антивирусы контролируют закрытие.
← →
balepa (2010-06-14 14:02) [7]
> Anatoly Podgoretsky © (14.06.10 10:20) [6]
>
> > balepa (14.06.2010 10:02:05) [5]
>
> Не важно что имелось в виду, это совсем другой процесс.
> Обычно многие
> антивирусы контролируют закрытие.
А это как объяснить ???
> При создании формы открываю файл и закрываю его по завершении
> работы приложения. А во время работы раз в секунду открываю
> с др. хэндлами считываю и закрываю, в данном случае закрытие
> происходит без задержек.
К тому же
> да и на некоторых с WinXP, т.е. задержек на закрытии нет.
а на всех ПК антивир один и тот же и настроен одинаково.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c