Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
besserebrenik
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 10
#1

Функция winApi WriteFileEx() - Delphi WinAPI

22.02.2010, 16:28. Просмотров 1801. Ответов 7
Метки нет (Все метки)

Сейчас столкнулся с асинхронными файловыми операциями (I/O).
Нашел в сети исходник который должен записать на дискету файл в асинхроном режиме, т.е. функция возвращает управление, до того как закончит запись. Код посмотрел, вроде все так как и должно быть, но функция возвращает управление уже после того как закончила свою работу. Было подозрение, что что-то не так со структурой Overlapped.. Но вроде все правильно.

Вот исходник.. Не могли бы подсказать в чем проблема?

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const
  FLOPP_S=145766400;
var
  arr:array[1..FLOPP_S] of byte;
 
function HasOverlappedIoCompleted(OVR:TOverlapped):boolean;
begin
 Result:= OVR.Internal<>STATUS_PENDING
end;
 
procedure EndWrite(dwErrorCode:DWORD; dwNumberOfBytesTransfered:DWORD; lpOverlapped:POverlapped);stdcall;
begin
 ShowMessage('Âñ¸ ãîòîâî! Г§Г*ГЇГЁГ±Г*Г*Г® ГЎГ*éò '+IntToStr(dwNumberOfBytesTransfered));
end;
 
procedure TForm1.Button4Click(Sender: TObject);
var
  FileHandle,DestFileHandle:THandle;
  Overlap: TOverlapped;
  res:BOOL;
  _WRITED,i,LastError:DWORD;
begin
  FillChar(Overlap,SizeOf(Overlap),0);
  for i:=1 to trunc(FLOPP_S/100) do
   arr[i*100]:=ord('Q');
  FileHandle:=CreateFile('K:\file.dat',GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
  if FileHandle=INVALID_HANDLE_VALUE then
   begin
    ShowMessage('Г*ГҐ ïð¸ò');
    exit;
   end;
  Overlap.hEvent:=CreateEvent(0,True,False,0);
 
  res:=WriteFileEx(FileHandle,@arr,FLOPP_S,Overlap,@EndWrite);
  LastError := GetLastError;
  ShowMessage('Г‡Г*ГЇГЁГ±Гј Г*Г*Г·Г*Г«Г*Г±Гј');
  while WaitForSingleObjectEx(Overlap.hEvent,1000,True)=WAIT_TIMEOUT do
   Application.ProcessMessages ;
 
  GetOverlappedResult(FileHandle,Overlap,_WRITED,FALSE);
  ShowMessage('Г‡Г*ГЇГЁГ±Гј Г§Г*ГЄГ®Г*Г·ГҐГ*Г*! Г§Г*ГЇГЁГ±Г*Г*Г® ГЎГ*éò '+IntToStr(_WRITED));
  CloseHandle(Overlap.hEvent);
  CloseHandle(FileHandle);
 
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2010, 16:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция winApi WriteFileEx() (Delphi WinAPI):

функция winApi CreateFileMapping() - Delphi WinAPI
Сейчас столкнулся с проблемой. Полное непонимание FileMapping Есть следующий код. Он должен выводить в мемо строку из swap-файла.. Не...

Работа с COM портами WinAPI, конкретно функция ClearCommError - Delphi WinAPI
Всем доброго времени суток, я вообще не программист, программирую от случая к случаю, пишу программу для работы с Com портом, котрая должна...

Как увидеть то, что вернула функция WinApi? - Delphi WinAPI
например вот такая процедура procedure TForm1.btnSysDirClick(Sender: TObject); var sysdir:PAnsiChar; s:Cardinal; res:Integer; ...

Какая функция winapi возвращает результатом значение по адресу памяти (указатель)? - Delphi WinAPI
Какая функция winapi возвращает результатом значение по адресу памяти (указатель)? Т.е. к примеру функция HeapAlloc возвращает адрес...

WinAPI - Delphi WinAPI
Как мне программно совершить эти действия,которые показаны на видео? http://video.yandex.ua/users/romanzi777/view/1/

WinAPI - Delphi WinAPI
как сделать так чтобы программа открывала блокнот и открыла нужный текстовый файл и каждая буква текстового файла записывалась в блокнот...

7
kukuruku310
197 / 184 / 7
Регистрация: 14.02.2010
Сообщений: 539
22.02.2010, 19:11 #2
а она случайно не должна работать для этого в другом потоке?
0
besserebrenik
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 10
22.02.2010, 19:16  [ТС] #3
Так и можно впихнуть запись данных в другой поток и тогда отпадает необходимость в асинхронных функциях.
но я хочу понять, что неправильно в использовании данной функции. Где то у меня косяк
0
kukuruku310
197 / 184 / 7
Регистрация: 14.02.2010
Сообщений: 539
22.02.2010, 19:47 #4
попробуйте поставить число байт в кратное размеру кластера, может тогда заработает

Добавлено через 16 минут
проблема именно в числе 145766400. Кртность тут ни при чем. Попробуйте начать хотя бы с 1М - и ваш код заработает. Ну а дальше увеличивайте потихоньку, пока работает... С чем это связано - не знаю - может места на диске мало? Или драйвер не рассчитан на такие объемы? Непонятно.
0
besserebrenik
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 10
22.02.2010, 20:24  [ТС] #5
Я этот код передрал с одного сайта. Там приводился пример записи файла на дискету.
До этого константа была такой
Pascal
1
FLOPP_S=1457664
И я пробовал записывать 1.5. мб..
На флопе протестировал - виснет..
Теперь пишу файл на винт и на флешку, результат одинаков - функция пока не закончит работу, процесс далее не выполняется. (но так флешка шустрая пришлось выставить размер записываемой области больше.. 1.4.мб залетают на нее мгновенно и я не видел реально стал процесс или выполняется далее)
Причем, есть одна странность:
Я записал в файл расположенный на флешке 14576640 байт (14 мб примерно).. при первой записи прога висела, только в конце получил два сообщения о том, что "запись началась" и следом "запись окончена".
Но если пытаюсь записать в тот же файл ту же инфу, то функция начинает работать корректно.
0
kukuruku310
197 / 184 / 7
Регистрация: 14.02.2010
Сообщений: 539
22.02.2010, 21:16 #6
Pascal
1
2
const
  FLOPP_S=145766400; // 145 Mb !!! - c этим не работает напрочь
уменьшаю в 10 раз (на HDD) - все нормально, независимо от того, есть такой файл, нет ли...
при записи на дискету - все нормально до тех пор, пока не приблизимся к максимальной емкости дискеты. Если меньше - опять все нормально. По крайней мере у меня так.
Скорее всего такая же бяка и с флешкой (флешку я уже не пробовал)

Способов преодоления не наблюдаю. Только что разве писать частями, если действительно надо нарисовать полную емкость диска или очень уж большой файло. А еще более радикальный способ - использовать более стандартный способ - с потоками, если и впрямь необходимо не ждать конца записи. К тому же в процессе записи всегда предполагается обработка ошибок, а как тут ее сделать?
Заново переписывать ВСЁ???
0
besserebrenik
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 10
22.02.2010, 23:44  [ТС] #7
Спасибо за помощь!
Я наверно забиваю, на эту проблему.. Это лаба, я студент. Буду спрашивать у преподавателя, что не так. И требование в лабе записать в файл используя асинхронную функцию. Так конечно можно сделать запись используя потоки, я конечно не пытался делать это, но судя по бесчисленному количеству html страниц просмотренных мной сегодня, этот способ и правда предпочтительней.
Сейчас, прочитав ваш пост, попытался записать 400 кб на дискету. Все равно висняки. Правда короче чем при попытке записи файла размером1.4 мб
Пробовал еще одну флешку, тоже самое.

Добавлено через 1 час 22 минуты
Сейчас убедился, что если писать на Хард, то все ок! 60 мб записалось 1300 мс (примерно), причем на вызов функции 10 мс, опять же примерно. Буду разбираться, с подвисанием на внешних носителях..
kukuruku310, если не затруднит последний вопрос. Вы когда на дискету писали файлы, подвисаний не было? Какой примерно был размер? Т.к. у меня даже на маленьких файлах, функция не передает управление пока не запишит, а это чуствительно учитывая скорость записи на FDD
0
kukuruku310
197 / 184 / 7
Регистрация: 14.02.2010
Сообщений: 539
23.02.2010, 15:21 #8
Никаких зависаний не было, по крайней мере при размере до 1,4 Мб ровно (дискета). А про HDD уже говорил. Скорее всего проблема в железе. Разные мамки, разные дрова.
Да и вообще, преподаватели, к сожалению, чаще далеки от реального использования того или иного свойства/наворота. Что, в общем-то, нисколько в вину им не ставится. Просто у них задача в другом - научить основам и как эти основы самостоятельно использовать. По крайней мере у меня такое мнение.
И, ко второму, уже гораздо большему сожалению, не все написано в той же MSDN, и - что еще хуже - написано иногда прямо противоположное фактическому состоянию дел.
0
23.02.2010, 15:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2010, 15:21
Привет! Вот еще темы с ответами:

winapi - Delphi WinAPI
РЕБЯТА,ПОМОГИТЕ пожалуйста со следующим: в программе нужно прописать коды клавиш(мне для примера достаточно одной) чтобы этот код выводился...

WinAPI - Delphi WinAPI
Подскажите плиз книгу какуюнить по WinAPI для полного,полного чайника:)

WinAPI функции - Delphi WinAPI
Суть программы: Есть две программы &quot;Клиент&quot; и &quot;Сервер&quot; Клиент посылает сообщение серверу с помощью PostMessage, при получении сообщения...

ToolBar и WinAPI - Delphi WinAPI
Создать ToolBar при помощи WinAPI в общем, дело не хитрое. Но все существующие примеры подразумевают использование картинок. Если их не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru