1 (изменено: Waveshaper, 2016-05-20 01:06:13)

Тема: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Здравствуйте, на большинстве современных жёстких дисках, присутствует проблема слишком частой авто-парковки головок (каждые 8 секунд простоя), которая вызывает постоянные, крайне неприятные, щелчки и задержки при работе с ними. Простейшие действия, такие как, посмотр фотографий или сортировка файлов, превращаются в пытку задержками, даже при прослушивании музыки, каждое переключение песни, сопровождается громким щелчком.

У меня несколько таких дисков, и я перепробовал уже кучу вариантов решения, в том числе, wdidle3 и hdparm, ничего не помогает.

Возможно ли сэмулировать чтение с диска? Требуется постоянное и стабильное чтение, чтобы между зубчиками (как на скриншоте), не проходило более 5 секунд. Или возможно Вы знаете какие-то команды, не дающие диску простаивать?

Хотелось бы просто включать AHK скрипт, при использовании дисков, и выключать после.


Вот так выглядит график, при прослушивании музыки.

http://i.imgur.com/wKO5sVr.png

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

2

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Вот тут есть решение. Возможно, достаточно просто открывать и закрывать какой-нибудь файл на диске.

3

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Спасибо, это как раз мой топик. Но проблема того решения, что оно каждые 5 секунд пишет на диск файл, при многочасовой работе батника это чревато последствиями для HDD, а при нынешних ценах.

Поэтому хотелось бы найти решение, основанное на чтении, возможно, есть какие-то специальные команды или другие обходные пути в программировании. А на этом форуме очень многим помогают решать всякие нетривиальные задачи.

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

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

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

4

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Хотелось бы просто включать AHK скрипт, при использовании дисков, и выключать после.

Команда FileRead считывает текст файла в переменную. А как понимать "при использовании дисков"  и "после использования дисков"? Не проще ли периодически читать файл?

5

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

ypppu
FileRead уже интересно, если и здесь не помешает кэш.

Т.к. у меня 5 таких HDD, я имел ввиду следующий подход, на рабочем столе лежат AHK файлы с буквами дисков, когда мне нужно что-то поделать на определённом диске, я просто запускаю файл с его буквой, появляется например GUI с надписью "Диск (E:) в работе", после всех дел, я закрываю GUI и закрывается сам AHK файл, а диск паркуется.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

6

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper пишет:

Но проблема того решения, что оно каждые 5 секунд пишет на диск файл, при многочасовой работе батника это чревато последствиями для HDD, а при нынешних ценах.

Но ведь пишет-то, как я понял, 0 байт. Т.е. записи фактически не происходит.

7

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Да, я тоже так подумал сначала, но на ru-board выяснил, что "дата изменения" пишется физически, а она изменяется каждые 5 секунд. Таким образом, это не особенно отличается от записи .txt файла.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

8

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Есть ещё последний доступ к файлу. Где-то ведь он тоже пишется. Выходит, что чтение этой проблемы не решит.

9

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Да, кстати, но, насколько я знаю, эта функция отключена в Win 7|8.1, у меня никогда эта дата не меняется, она всегда сходна с датой "Создан".

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

10 (изменено: ypppu, 2016-05-20 15:31:30)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Вот пример скрипта. Попробуйте.

Loop
{
FileRead, var, boot.ini
Sleep, 4000
}

Да, на XP при каждом доступе к файлу изменяется дата "Открыт". Частое перемагничивание ухудшает свойство сектора. Можно каждый день создавать новый файл.

11

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

ypppu
Спасибо, как доберусь до ПК я протестирую скрипт, вот только, мне нужно создать boot.ini с любым текстом и прописать путь до него?

Да, а в 7|8.1, помоему, нужно что-то в реестре менять, чтобы оно заработало.

Частое перемагничивание ухудшает свойство сектора. Можно каждый день создавать новый файл.

Вот спасибо, объяснили научным языком то, чего я и боюсь. Создавать новый файл, Вы имеете ввиду .DRIVE-AWAKE?

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

12

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Я говорю, что простое чтение файла не должно влиять на жёсткий диск. Он изнашивается только при записи. Однако в Windows XP каждое чтение сопровождается записью аттрибута "Открыт" (то есть дата последнего доступа к файлу). Как на других версиях ОС -  не знаю.

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

Boot.ini - это такой важный системный файл в Windows. Я использовал его в качестве примера. Чаще всего он находится по адресу C:\boot.ini. Скрипт, который я приводил выше, следует положить рядом с этим файлом и запустить. Если при этом прекратится парковка, значит вариант жизнеспособный.

13

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Я говорю, что простое чтение файла не должно влиять на жёсткий диск. Он изнашивается только при записи.

Да, я тоже так думаю, именно поэтому и ищу решение с чтением или с эмуляцией, когда диск будет думать, что с него читают.

Однако в Windows XP каждое чтение сопровождается записью аттрибута "Открыт"

У меня Win 8.1 x64, а здесь, похоже, эту функцию отключили по умолчанию.

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

Да, это вариант, если не будет найдено решение с чтением.

Boot.ini - это такой важный системный файл в Windows.

Ага, я понял, обязательно попробую. Создам любой .txt файл и положу вместе с Вашим AHK на паркующийся диск.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

14 (изменено: Malcev, 2016-05-20 16:49:03)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Boot.ini - это такой важный системный файл в Windows

Последняя операционка где он использовался - это WinXp.
Может это поможет:
https://autohotkey.com/docs/commands/DriveGet.htm

15

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Добрый вечер,

ypppu

Loop
{
FileRead, var, boot.ini
Sleep, 4000
}

К сожалению, этот скрипт вообще себя никак не проявляет, диск запаркован и молчит даже при его запуске.

Malcev
А можно поподробнее, что эта команда делает? И какой скрипт стоит попробовать?

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

16

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Вместо boot.ini попробуйте прописать один из следующих файлов:

  • ntldr

  • AUTOEXEC.BAT

  • Bootfont.bin

  • NTDETECT.COM

  • boot.ini

  • CONFIG.SYS

  • hiberfil.sys

  • IO.SYS

  • MSDOS.SYS

В Windows 7, 8, 8.1, 10 уж какой-нибудь да подойдёт.

17

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

ypppu
Вы, наверное, меня неправильно поняли, системный диск, где хранятся все эти файлы, у меня без парковки, т.е. на нём заметить что-либо нельзя. А проблема с парковкой на всех остальных HDD, чтобы проверить Ваш скрипт, я делал так: скопировал на проблемный диск 500КБ файл с текстом и скрипт, прописал в коде log.txt и запускал. Я что-то не так сделал? Потому что диск даже не распарковался.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

18

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Возможно так, в FileName укажите полный путь к файлу.
Попробуйте в простое нажать 2.

FileName = 

2::File := FileOpen(FileName, "rw"), File.Close()
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Пусть всех перечисленных файлов там нет, а есть log.txt. Тогда должно работать:

Loop
{
FileRead, var, log.txt
Sleep, 4000
}

Файл скрипта должен лежать рядом с log.txt.
На всякий случай уменьшите размер файла log.txt до нескольких байт.

20

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

serzh82saratov, ypppu
Попробовал, но в этот раз в FileName = вписал файл, который уже давно находится на HDD, а не только что скопированный, и эффект был, но только при первом нажатии.

Моё предположение, что очень хорошо работает кэширование, я скопировал большой Flac файл на целевой диск и при его воспроизведении, диск даже не распарковался. Вопрос, конечно, как это обойти.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

21 (изменено: YMP, 2016-05-22 18:58:24)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Можно попробовать отключить буферизацию файла системой через FILE_FLAG_NO_BUFFERING. Код ниже создаёт файл, если его нет, а потом читает в цикле с заданным таймаутом. Если у вас уже есть файл с таким именем, лучше удалите, чтобы не было путаницы.


FileName = D:\DRIVE_AWAKE
FileSize := 4096    ; Должен быть кратен 4096.
Timeout = 5000

pBuf := DllCall("VirtualAlloc", "ptr", 0
                              , "ptr", FileSize
                              , "uint", 0x3000  ; MEM_RESERVE | MEM_COMMIT
                              , "uint", 4       ; PAGE_READWRITE
                              , "ptr")
If (pBuf = 0) {
    MsgBox, Ошибка VirtualAlloc.
    ExitApp
}
hFile := DllCall("CreateFile", "str", FileName
                             , "uint", 0xC0000000   ; GENERIC_READ | GENERIC_WRITE
                             , "uint", 0
                             , "ptr", 0
                             , "uint", 4            ; OPEN_ALWAYS
                             , "uint", 0x20000000   ; FILE_FLAG_NO_BUFFERING
                             , "ptr", 0
                             , "ptr")
If (hFile = -1) {   ; INVALID_HANDLE_VALUE
    MsgBox, Ошибка CreateFile.
    ExitApp
}
If DllCall("GetLastError") != 183 {     ; ERROR_ALREADY_EXIST
    If !DllCall("WriteFile", "ptr", hFile
                           , "ptr", pBuf
                           , "uint", FileSize
                           , "uint *", BytesWritten
                           , "ptr", 0)
    {
        MsgBox, Ошибка WriteFile.
        ExitApp
    }
}

Loop
{
    DllCall("SetFilePointer", "ptr", hFile
                            , "int", 0
                            , "ptr", 0
                            , "uint", 0)        ; FILE_BEGIN
    If !DllCall("ReadFile", "ptr", hFile
                          , "ptr", pBuf
                          , "uint", FileSize
                          , "uint *", BytesRead
                          , "ptr", 0)
    {
        MsgBox, Ошибка ReadFile.
        ExitApp
    }
    Sleep, %Timeout%
}

22

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?


while (true)
{
	FileExist("D:\1")
	Sleep 5000
}

#0::ExitApp

Работает?

23 (изменено: Waveshaper, 2016-05-22 23:50:42)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Вот это да, эффект есть, я было обрадовался, что вот оно решение, но оказалось, что не до конца. Объясню подробно как работает:

1) Первый запуск, всё отлично, диск распарковывается и стабильно, каждые 5 секунд идёт чтение на скорости 4,1 КБ/с. После закрытия, некоторое время происходит запись файла DRIVE_AWAKE и диск запарковывается.

2) Второй запуск, диск запаркован, но в диспетчере задач так же происходит стабильное чтение, что очень удивляет, т.к. если бы чтение происходило из кэша, то диспетчер этого бы не отражал, почему так?

Появилась мысль, не дело ли в том, что при первом запуске, он всё-таки пишет на диск, хотя это и не отражается в диспетчере? Т.к. если удалить файл DRIVE_AWAKE, всё начинает работать.


1-ый запуск:
https://i.imgur.com/gYqAGi2.png


2-ой запуск:
https://i.imgur.com/E7y0Arb.png



Eduard
Нет, вообще ничего не происходит.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

24

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

На самом диске тоже есть кэш. Вероятно, оттуда читается. Влияние начальной записи интересно, да. Попробуем тогда перезаписывать файл при каждом запуске скрипта. Если так не сработает, в конце кода есть закомментированная команда удаления файла. Попробуйте её раскомментировать и использовать скрипт с ней.

Если какой-то из вариантов будет работать, не исчезайте пока из этой темы. Желательно выяснить, какие действия в коде необходимы для решения задачи, а какие можно убрать.


FileName = D:\DRIVE_AWAKE
FileSize := 4096    ; Должен быть кратен 4096.
Timeout = 5000
OnExit, Exit

pBuf := DllCall("VirtualAlloc", "ptr", 0
                              , "ptr", FileSize
                              , "uint", 0x3000  ; MEM_RESERVE | MEM_COMMIT
                              , "uint", 4       ; PAGE_READWRITE
                              , "ptr")
If (pBuf = 0) {
    MsgBox, Ошибка VirtualAlloc.
    ExitApp
}
hFile := DllCall("CreateFile", "str", FileName
                             , "uint", 0xC0000000   ; GENERIC_READ | GENERIC_WRITE
                             , "uint", 0
                             , "ptr", 0
                             , "uint", 2            ; CREATE_ALWAYS
                             , "uint", 0x20000000   ; FILE_FLAG_NO_BUFFERING
                             , "ptr", 0
                             , "ptr")
If (hFile = -1) {   ; INVALID_HANDLE_VALUE
    MsgBox, Ошибка CreateFile.
    ExitApp
}
If !DllCall("WriteFile", "ptr", hFile
                       , "ptr", pBuf
                       , "uint", FileSize
                       , "uint *", BytesWritten
                       , "ptr", 0)
{
    MsgBox, Ошибка WriteFile.
    ExitApp
}

Loop
{
    DllCall("SetFilePointer", "ptr", hFile
                            , "int", 0
                            , "ptr", 0
                            , "uint", 0)        ; FILE_BEGIN
    If !DllCall("ReadFile", "ptr", hFile
                          , "ptr", pBuf
                          , "uint", FileSize
                          , "uint *", BytesRead
                          , "ptr", 0)
    {
        MsgBox, Ошибка ReadFile.
        ExitApp
    }
    Sleep, %Timeout%
}

Exit:
    DllCall("CloseHandle", "ptr", hFile)
    ;FileDelete, %FileName%

25

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Ого, работает! Код использовал как есть, ничего не изменял.

Вот только у меня вопрос, этот скрипт просто создаёт 4КБ файл и читает его содержимое, минуя Windows кэш? И по отношению к HDD это сравнимо с воспроизведением музыки, с единственным различием в скорости чтения (4 vs 131)?

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

26 (изменено: Malcev, 2016-05-23 19:17:01)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP, а можно ли заменить эту часть скрипта:

Loop
{
    DllCall("SetFilePointer", "ptr", hFile
                            , "int", 0
                            , "ptr", 0
                            , "uint", 0)        ; FILE_BEGIN
    If !DllCall("ReadFile", "ptr", hFile
                          , "ptr", pBuf
                          , "uint", FileSize
                          , "uint *", BytesRead
                          , "ptr", 0)
    {
        MsgBox, Ошибка ReadFile.
        ExitApp
    }
    Sleep, %Timeout%
}

на это:

Loop
{
FileRead, var, log.txt
Sleep, 4000
}

Иными словами в чём разница чтения?

27

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper пишет:

Вот только у меня вопрос, этот скрипт просто создаёт 4КБ файл и читает его содержимое, минуя Windows кэш? И по отношению к HDD это сравнимо с воспроизведением музыки, с единственным различием в скорости чтения (4 vs 131)?

Да, создаёт и потом читает, минуя буфер Windows. Скорость, вероятно, определяется размером файла. Он считывается, по идее, меньше чем за секунду, но в такие тонкости расчёт скорости, видимо, не вдаётся.

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


#Persistent
FileName = D:\DRIVE_AWAKE
FileSize := 4096    ; Должен быть кратен 4096.

pBuf := DllCall("VirtualAlloc", "ptr", 0
                              , "ptr", FileSize
                              , "uint", 0x3000  ; MEM_RESERVE | MEM_COMMIT
                              , "uint", 4       ; PAGE_READWRITE
                              , "ptr")
If (pBuf = 0) {
    MsgBox, Ошибка VirtualAlloc.
    ExitApp
}
hFile := DllCall("CreateFile", "str", FileName
                             , "uint", 0xC0000000   ; GENERIC_READ | GENERIC_WRITE
                             , "uint", 0
                             , "ptr", 0
                             , "uint", 2            ; CREATE_ALWAYS
                             , "uint", 0x20000000   ; FILE_FLAG_NO_BUFFERING
                             , "ptr", 0
                             , "ptr")
If (hFile = -1) {   ; INVALID_HANDLE_VALUE
    MsgBox, Ошибка CreateFile.
    ExitApp
}
If !DllCall("WriteFile", "ptr", hFile
                       , "ptr", pBuf
                       , "uint", FileSize
                       , "uint *", BytesWritten
                       , "ptr", 0)
{
    MsgBox, Ошибка WriteFile.
    ExitApp
}

28 (изменено: YMP, 2016-05-23 19:53:19)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Malcev пишет:

Иными словами в чём разница чтения?

Ну, команда FileRead, прежде всего, опять же откроет файл, только уже без FILE_FLAG_NO_BUFFERING. Хэндл файла, полученный от CreateFile, ей ведь не подсунуть. Соответственно, читать она должна будет через кэш Windows.

29

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Цикл чтения нужен, без него, создаётся файл 0КБ и диск запарковывается, после закрытия скрипта, файл меняет размер на 4КБ, распарковывается и снова запарковывается.

Да, создаёт и потом читает, минуя буфер Windows.

А почему, пока запущен скрипт размер файла 0КБ, будто чтение происходит в ОЗУ, и только после закрытия становится 4КБ?

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

30

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Да, в списке файлов в Проводнике размер 0, но если по правой кнопке открыть свойства файла, то там 4 КБ. Не знаю, почему 0 в списке. Сначала подумал, потому что файл открывается без расшаривания доступа к нему (третий параметр CreateFile). Но если даже там поставить 7, т.е. комбинацию трёх возможных видов доступа: чтение, запись, удаление, то это тоже ничего не меняет.

31

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Ясно, но это мелочи, главное, что идёт чтение, а не запись.

А можно ещё добавить простенький GUI, например, "Диск (D:) в работе", и чтобы был значок на панели задач, как у обычной программы, при его закрытии, закрывается и сам скрипт? А то боюсь забыть отключить его и оставить на длительное время.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

32

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Люди, а почему бы вместо чтения просто не запрашивать/проверять дисковую информацию (наличие файла, наличие жёсткой/сиволической связи файла, идентификатор объекта (диска), наличие грязного бита, дисковые квоты, статус обновления штампа времени, разрешение писать 8.3 файлы,  данные журнала USN и т.п.)?

33

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
Можно, но я думаю, что это вы и сами сможете сделать, почитав про Gui. Сложного в такой задаче ничего нет.

Flasher
Никто ничего не запрещает, предложите свой вариант решения.

34

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP, ну, допустим:

Loop
{
IfExist, D:\
Sleep, 4000
}

35

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Я проверить не могу, у меня нет таких постоянно паркующихся дисков.

36

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
А можете подсказать в какую часть кода вставить строки, отвечающие за GUI? А то у меня получается, либо скрипт работает, либо GUI.

И, кстати, можно ли запускать сразу несколько скриптов, настроенных на разные диски, они не будут конфликтовать?

Gui, Add, Text,, Диск (D:) в работе
Gui, Show, Restore w300 h200
return ; Окончание секции авто-выполнения. Скрипт ожидает каких-нибудь действий пользователя.

GuiClose:
ExitApp

Flasher
Этот код не даёт совершенно никакого эффекта.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

37

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
А если дописать к диску существующий в корне файл?

38 (изменено: Waveshaper, 2016-05-23 21:58:31)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Flasher
Так же никакого эффекта, возможно, потому что DRIVE_AWAKE файл находится в кэше, а "старых" файлов в корне нет.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

39

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
Gui создавать в начале скрипта, только убрать Return, чтобы выполнение шло дальше, к созданию файла. А вот эту часть в конец скрипта:


GuiClose:
ExitApp

40

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
Кстати, можно убрать из скрипта вот это:


OnExit, Exit

и это:


Exit:
    DllCall("CloseHandle", "ptr", hFile)
    ; FileDelete, %FileName%

41

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Спасибо большое, теперь всё работает.

А что насчёт запуска сразу несколько скриптов, настроенных на разные диски, они не будут конфликтовать?

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

42

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

На самом диске тоже есть кэш. Вероятно, оттуда читается.

Если я правильно перевел, то не должен читаться:

The FILE_FLAG_NO_BUFFERING takes this concept one step further and eliminates all read-ahead file buffering and disk caching as well, so that all reads are guaranteed to come from the file and not from any system buffer or disk cache.

https://support.microsoft.com/en-us/kb/99794

43

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

В порядке оффтопа, возможно ли изменить иконку, видимую на панели задач? Не в трее.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

44

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper пишет:

А что насчёт запуска сразу несколько скриптов, настроенных на разные диски, они не будут конфликтовать?

А из-за чего им конфликтовать? Файлы же разные они будут открывать.

Malcev пишет:

Если я правильно перевел, то не должен читаться:

Но раз диск был запаркован, то чтение явно шло не с него. Но и не из системного кэша, раз Диспетчер задач его показывал, как чтение с диска. Я вижу единственный вариант — чтение из кэша диска. Конечно, я не спец по этим вопросам.

45

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper пишет:

В порядке оффтопа, возможно ли изменить иконку, видимую на панели задач? Не в трее.

Вроде нет. Или я не знаю этого способа.

46

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP

А из-за чего им конфликтовать? Файлы же разные они будут открывать.

Спасибо, это просто отлично, пошёл тестировать. А с иконкой, удивительно.

Я вижу единственный вариант — чтение из кэша диска.

Кэш у дисков по 64МБ, так что 4КБ кэшируются моментально. Если это не какой-то глюк системы, я о диспетчере.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

47

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper пишет:

В порядке оффтопа, возможно ли изменить иконку, видимую на панели задач? Не в трее.

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

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

48

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper пишет:

Так же никакого эффекта

Проверьте ещё на всякий из cmd циклы каждый в отдельности:


for /l %d in (0,0,0) do (fsutil dirty query D: && timeout /t 4)
for /l %d in (0,0,0) do (fsutil quota query D: && timeout /t 4)
for /l %d in (0,0,0) do (fsutil objectid query D: && timeout /t 4)
for /l %d in (0,0,0) do (fsutil fsinfo drivetype D: && timeout /t 4)
for /l %d in (0,0,0) do (fsutil usn queryjournal D: && timeout /t 4)
for /l %d in (0,0,0) do (fsutil file queryallocranges offset=1024 length=64 C:\Windows\regedit.exe && timeout /t 4)

49

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Flasher
Ни одна команда диск не распарковала, хотя ответы на них были.

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

50

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
Странно. У меня коромысло щелкает и начинается вращение шпинделя.

51

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Flasher
А у Вас какой диск? У меня WD Green WD30EZRX.

Может быть у Вас он спал, а не запаркован был?

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

52

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
Такой же, только 60, а не 30.
Видимо, спал. Хотя я пробовал тормозить через hddmaster - не вышло.

53

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Flasher
О, значит Вы понимаете, что такое парковка. Вы не пробовали hdparm?

Возможно влияет, что у меня в опциях электропитания, установлено "Отключать жёсткий диск: никогда".

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

54

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
Вот эту сборку? Вроде работает. APM погашен.

55

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Flasher
Вроде можно и её, могли бы проверить команду hdparm.exe -i /dev/sda, что у Вас написано в строке AdvancedPM=? А при -B 255 никаких ошибок не выдаёт? И какая у Вас ОС?

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

56

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
no WriteCache=enabled.
setting Advanced Power Management level to disabled
Win7 x32.

57 (изменено: Waveshaper, 2016-05-24 01:20:55)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Flasher
Спасибо, вот и у меня AdvancedPM=no, а -B 255 вот что выдаёт и непонятно в чём дело. А у Вас точно парковка отключилась, а была 8 секунд?

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

58

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
Не пойму, возможно просто статус в DiskInfo погашен из-за отсутствия поддержки опции.
Но у меня всего 186 циклов загрузки/выгрузки при 97 запусках/остановках шпинделя.

59 (изменено: Waveshaper, 2016-05-24 01:57:46)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Flasher
А Вы сами не чувствуете, при навигации по папкам, щелчкам или диспетчеру задач?

Судя по количеству, у Вас совсем новый диск?

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

60 (изменено: Flasher, 2016-05-24 11:40:18)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Waveshaper
При просыпании чувствую. При навигации не особо, иногда - слабый стук, но не щелчки. Диспетчер как к этому относится? Это же не системник, там, как полагается, - SSD. А этому диску 1.5 года. Компьютер сам по себе тихий, там кроме пары спящих Green-дисков на звук работают только пару почти неслышных 120-х кулеров, поэтому щелчки вполне будут различимы.

61

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Flasher
Вам видимо повезло с диском и частота парковки выставлена на 5 минут (а не 8 секунд), WD, похоже, у одной и той же модели устанавливает разные значения, были даже Red-ы с 8 секундами.

YMP
Поработал я пару дней с Вашим скриптом, и наконец-то могу вздохнуть с облегчением, раньше, при обработке большого массива файлов, было разумней копировать их на нормальный HDD и обратно, а это 200-300ГБ, или элементарный просмотр фотографий портил нервы постоянными щелчками, а сейчас всё спокойно. Спасибо Вам огромное!


В процессе использования, появилось пару хотелок, это кнопка стоп/старт в GUI, которая нужна, при копировании большого количества файлов, можно ли её встроить в код? И секундомер, показывающий в GUI сколько времени прошло с начала запуска.

Вот текущий код:

Gui, Add, Text,, Диск (D:) в работе
Gui, Show, Restore w450 h300
Gui, Add, Picture, x0 y0 h350 w450, D:\disk.ico

FileName = D:\DRIVE_AWAKE
FileSize := 4096    ; Должен быть кратен 4096.
Timeout = 5000

pBuf := DllCall("VirtualAlloc", "ptr", 0
                              , "ptr", FileSize
                              , "uint", 0x3000  ; MEM_RESERVE | MEM_COMMIT
                              , "uint", 4       ; PAGE_READWRITE
                              , "ptr")
If (pBuf = 0) {
    MsgBox, Ошибка VirtualAlloc.
    ExitApp
}
hFile := DllCall("CreateFile", "str", FileName
                             , "uint", 0xC0000000   ; GENERIC_READ | GENERIC_WRITE
                             , "uint", 0
                             , "ptr", 0
                             , "uint", 2            ; CREATE_ALWAYS
                             , "uint", 0x20000000   ; FILE_FLAG_NO_BUFFERING
                             , "ptr", 0
                             , "ptr")
If (hFile = -1) {   ; INVALID_HANDLE_VALUE
    MsgBox, Ошибка CreateFile.
    ExitApp
}
If !DllCall("WriteFile", "ptr", hFile
                       , "ptr", pBuf
                       , "uint", FileSize
                       , "uint *", BytesWritten
                       , "ptr", 0)
{
    MsgBox, Ошибка WriteFile.
    ExitApp
}

Loop
{
    DllCall("SetFilePointer", "ptr", hFile
                            , "int", 0
                            , "ptr", 0
                            , "uint", 0)        ; FILE_BEGIN
    If !DllCall("ReadFile", "ptr", hFile
                          , "ptr", pBuf
                          , "uint", FileSize
                          , "uint *", BytesRead
                          , "ptr", 0)
    {
        MsgBox, Ошибка ReadFile.
        ExitApp
    }
    Sleep, %Timeout%
}
	
GuiClose:
ExitApp
OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

62 (изменено: YMP, 2016-05-26 14:03:59)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

Кнопку можно так.  Секундомер или часы? Какое конкретно время измерять?


Gui, Add, Text,, Диск (D:) в работе
Gui, Add, Button, w80 h20 vStartStop gStartStop, Старт
Gui, Show, Restore w450 h300
Gui, Add, Picture, x0 y0 h350 w450, D:\disk.ico

FileName = D:\DRIVE_AWAKE
FileSize := 4096    ; Должен быть кратен 4096.
Timeout = 5000
hFile := pBuf := Running := 0
Return

StartStop:
    If (Running = 1) {
        SetTimer, ReadTimer, Off
        Gosub, Cleanup
        Return
    }
    pBuf := DllCall("VirtualAlloc", "ptr", 0
                                  , "ptr", FileSize
                                  , "uint", 0x3000      ; MEM_RESERVE | MEM_COMMIT
                                  , "uint", 4           ; PAGE_READWRITE
                                  , "ptr")
    If (pBuf = 0) {
        Gosub, Cleanup
        MsgBox, Ошибка VirtualAlloc.
        Return
    }
    hFile := DllCall("CreateFile", "str", FileName
                                 , "uint", 0xC0000000   ; GENERIC_READ | GENERIC_WRITE
                                 , "uint", 0
                                 , "ptr", 0
                                 , "uint", 2            ; CREATE_ALWAYS
                                 , "uint", 0x20000000   ; FILE_FLAG_NO_BUFFERING
                                 , "ptr", 0
                                 , "ptr")
    If (hFile = -1) {   ; INVALID_HANDLE_VALUE
        Gosub, Cleanup
        MsgBox, Ошибка CreateFile.
        Return
    }
    If !DllCall("WriteFile", "ptr", hFile
                           , "ptr", pBuf
                           , "uint", FileSize
                           , "uint *", BytesWritten
                           , "ptr", 0)
    {
        Gosub, Cleanup
        MsgBox, Ошибка WriteFile.
        Return
    }
    Running := 1
    SetTimer, ReadTimer, %Timeout%
    GuiControl,, StartStop, Стоп

ReadTimer:
    DllCall("SetFilePointer", "ptr", hFile
                            , "int", 0
                            , "ptr", 0
                            , "uint", 0)        ; FILE_BEGIN
    If !DllCall("ReadFile", "ptr", hFile
                          , "ptr", pBuf
                          , "uint", FileSize
                          , "uint *", BytesRead
                          , "ptr", 0)
    {
        SetTimer, ReadTimer, Off
        Gosub, Cleanup
        MsgBox, Ошибка ReadFile.
    }
    Return

Cleanup:
    If (hFile > 0) {
        DllCall("CloseHandle", "ptr", hFile)
    }
    If (pBuf != 0) {
        DllCall("VirtualFree", "ptr", pBuf, "ptr", 0, "uint", 0x8000)   ; MEM_RELEASE
    }
    hFile := pBuf := Running := 0
    GuiControl,, StartStop, Старт
    Return
    
GuiClose:
    ExitApp

63

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Вообще отлично получается, а можно старт/стоп инвертировать, т.е. чтобы после запуска скрипт сразу работал, а кнопка была стоп, сейчас же, после запуска нужно нажимать старт.

А часы, показывать сколько времени прошло после начала работы скрипта, при нажатии кнопки стоп, его обнулять, а при нажатии старт, начинать отсчёт сначала. В виде ЧЧ:ММ:СС (01:27:55).

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).

64 (изменено: YMP, 2016-05-26 17:35:55)

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?


Gui, Add, Text, x4 h20, Диск (D:) в работе
Gui, Add, Text, yp x+8 w50 h20 vTimeText, 00:00:00
Gui, Add, Button, x4 w80 h20 vStartStop gStartStop, Стоп
Gui, Show, Restore w450 h300
Gui, Add, Picture, x0 y0 h350 w450, D:\disk.ico

FileName = D:\DRIVE_AWAKE
FileSize := 4096    ; Должен быть кратен 4096.
Timeout = 5000
hFile := pBuf := Running := 0

StartStop:
    If (Running = 1) {
        SetTimer, ReadTimer, Off
        SetTimer, ClockTimer, Off
        Gosub, Cleanup
        Return
    }
    pBuf := DllCall("VirtualAlloc", "ptr", 0
                                  , "ptr", FileSize
                                  , "uint", 0x3000      ; MEM_RESERVE | MEM_COMMIT
                                  , "uint", 4           ; PAGE_READWRITE
                                  , "ptr")
    If (pBuf = 0) {
        Gosub, Cleanup
        MsgBox, Ошибка VirtualAlloc.
        Return
    }
    hFile := DllCall("CreateFile", "str", FileName
                                 , "uint", 0xC0000000   ; GENERIC_READ | GENERIC_WRITE
                                 , "uint", 0
                                 , "ptr", 0
                                 , "uint", 2            ; CREATE_ALWAYS
                                 , "uint", 0x20000000   ; FILE_FLAG_NO_BUFFERING
                                 , "ptr", 0
                                 , "ptr")
    If (hFile = -1) {   ; INVALID_HANDLE_VALUE
        Gosub, Cleanup
        MsgBox, Ошибка CreateFile.
        Return
    }
    If !DllCall("WriteFile", "ptr", hFile
                           , "ptr", pBuf
                           , "uint", FileSize
                           , "uint *", BytesWritten
                           , "ptr", 0)
    {
        Gosub, Cleanup
        MsgBox, Ошибка WriteFile.
        Return
    }
    Running := 1
    SetTimer, ReadTimer, %Timeout%
    GuiControl,, StartStop, Стоп
    TickCount0 := A_TickCount
    SetTimer, ClockTimer, 1000

ReadTimer:
    DllCall("SetFilePointer", "ptr", hFile
                            , "int", 0
                            , "ptr", 0
                            , "uint", 0)        ; FILE_BEGIN
    If !DllCall("ReadFile", "ptr", hFile
                          , "ptr", pBuf
                          , "uint", FileSize
                          , "uint *", BytesRead
                          , "ptr", 0)
    {
        SetTimer, ReadTimer, Off
        Gosub, Cleanup
        MsgBox, Ошибка ReadFile.
    }
    Return

Cleanup:
    If (hFile > 0) {
        DllCall("CloseHandle", "ptr", hFile)
    }
    If (pBuf != 0) {
        DllCall("VirtualFree", "ptr", pBuf, "ptr", 0, "uint", 0x8000)   ; MEM_RELEASE
    }
    hFile := pBuf := Running := 0
    GuiControl,, StartStop, Старт
    GuiControl,, TimeText, 00:00:00
    Return

ClockTimer:
    Time := (A_TickCount - TickCount0) // 1000
    Time := Format("{1:02i}:{2:02i}:{3:02i}"
                    , Time // 3600
                    , Mod(Time, 3600) // 60
                    , Mod(Time, 60) )
    GuiControl,, TimeText, %Time%
    Return

GuiClose:
    ExitApp

65

Re: AHK: Подача сигнала чтения на жёсткий диск каждые 5с, возможно ли это?

YMP
Спасибо большое, всё работает отлично!

OS: Win8.1x64, AutoHotkey v1.1.21.03 (Unicode 64-bit).