53766так это ж надо чтоб сам CheckDisk это умел) а он разве умеет?
Можно запустить несколько CheckDisk процессов и сканировать все диски одновременно. Я так всегда делаю.
nikzzzz писал(а):
53769Это имеет смысл только при сканировании разделов, находящихся на разных физических дисках ,
Согласен. Хотя я пробовал сканировать несколько разделов на одно диске одновременно (без восстановления поврежденных секторов), и большой разницы во времени не заметил. Можно сделать что-бы параллельное сканированное происходило только с дисками, а не с разделами.
Положил ChkDskGui.exe рядом с ChkDskGui.au3 в X:\Windows\System32 (ядро 8х64 Хемом1) ChkDskGui.au3 - отрабатывает как и положено ChkDskGui.exe - заявляет "chkdsk.exe" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. >> ЧЯДНТ ?
nikzzzz 1. если использовать элемент Edit, в режиме "только чтение", и при вводе данных использовать опцию "вставить в конец строки", то не моргает. 2. Режим ввода в лейбл только если переменная в цикле не равна пустой строке, тогда новые данные присоединяются к общей и выполняется вставка. Этим исключается холостого хода вставка. То есть было 1000 вставок в секунду, стало 2 вставки в секунду, грубо говоря. Без Sleep или Delay будет наверно миллион раз вставлять, число раз ограничивается скоростью вставки. 3. Уменьшить размер обновляемой области. Редкий случай, но когда я делал счётчик времени с миллисекундами и лейбл мерцал, я решил пусть мерцает хотя бы последняя цифра, и разделил лейбл на 4 области: часы, минуты, секунды, миллисекунда, и ещё три области разделитель на ":", в итоге область миллисекунды уже не мерцала. 4. При обработке файлов в статусной строке мерцают данные, думаю надо было сделать функцию выполняющую вставку 3 раза в секунду. То есть файловая функция обновляет некую переменную 100 раз в секунду, а функции вставки по таймеру это будет не важно, она вставит 3 раза те данные, что были в на данный момент в переменной, всё равно глаз пользователя не сможет оценить 100 кратно меняющиеся данные.
Последний раз редактировалось: AZJIO (2018-05-14 12:50), всего редактировалось 1 раз
53791при вводе данных использовать опцию "вставить в конец строки", то не моргает.
К сожалению этот вариант не пройдет, для вывода прогресса курсор возвращается в начало строки, и строка заменяется новой, а в этом варианте новое значение прогресса прогресса будет выводиться на новой строке. Вот, что у меня получилось, за счет правильных задержек мерцание незначительное.
Скрытый текст
Код:
Import "user32.lib" OemToCharBuffA(*Buff,*Buff1,SizeBuff) EndImport Procedure.s ReadProgramStringOem(iPid) Protected Ret$="" Protected SizeBuff=AvailableProgramOutput(iPid) If SizeBuff>0 Protected *Buff=AllocateMemory(SizeBuff) ReadProgramData(iPid,*Buff,SizeBuff) OemToCharBuffA(*Buff,*Buff,SizeBuff) Ret$=PeekS(*Buff,SizeBuff,#PB_Ascii) FreeMemory(*Buff) EndIf ProcedureReturn Ret$ EndProcedure Procedure.s Cn(Str$) Protected i,j=1,Ret$="",Sym$,Str1$="",Flag=0 For i=1 To Len(Str$) Sym$=Mid(Str$,i,1) Select Sym$ Case Chr(10) Ret$+Str1$+Chr(13)+Chr(10) Str1$="" Flag=0 Case Chr(13) Flag=1 Default If Flag:Str1$="":Flag=0:EndIf Str1$+Sym$ EndSelect Next Ret$+Str1$ ProcedureReturn Ret$ EndProcedure Procedure Chkdsk() ; Protected iPid = RunProgram("cmd.exe", "/c tracert usbtor.ru", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) ; Protected iPid = RunProgram("cmd.exe", "/c chkdsk d: /f /x", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) Protected iPid = RunProgram("cmd.exe", "/c chkdsk c: ", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) Protected Str$,Text$="" If iPid While ProgramRunning(iPid) If WaitWindowEvent(100) = #PB_Event_CloseWindow If MessageRequester("Внимание!", "Идет сканирование диска..."+Chr(10)+"Закрыть программу?", #PB_MessageRequester_YesNo | #MB_ICONQUESTION)=6 CloseProgram(iPid) End EndIf EndIf Str$=ReadProgramStringOem(iPid) If Str$ Text$+Str$ SetGadgetText(0,Cn(Text$)+Chr(13)+Chr(10)) SendMessage_(GadgetID(0),#EM_SCROLL,#SB_BOTTOM,0) Sleep_(250) EndIf Wend CloseProgram(iPid) ; Close the connection to the program EndIf EndProcedure Procedure SizeWindowHandler() ResizeGadget(0,0,0,WindowWidth(0),WindowHeight(0)) EndProcedure OpenWindow(0, 44, 16, 700, 300, "CHKDSK GUI", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) SendMessage_(WindowID(0),#WM_SETICON,0,ExtractIcon_(0,"Shell32.dll",270)) BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler()) SmartWindowRefresh(0, #True) WindowBounds(0, 500, 200, #PB_Ignore, #PB_Ignore) EditorGadget(0, 0, 0, 700, 300, #PB_Editor_ReadOnly) SendMessage_(GadgetID(0),#EM_SETTARGETDEVICE, #Null, 0) SetGadgetFont(0, LoadFont(0, "Courier New", 10)) Chkdsk() Repeat Until WaitWindowEvent() = #PB_Event_CloseWindow
Вообще я уже думал об ini, чтобы добавить диски в игнор, галки по умолчанию, цвет консоли, шрифт гуи и консоли и размер. Ещё можно типа продвинутось фейса и сделать иконки опционально, и сделать так чтобы не зависило от разрядности, грубо говоря поиск chkdsk по предполагаемым адресам, допустим вызвать тихое окно если прошло, то молчим, иначе делаем поиск и предлагаем открыть найденный или окно выбора файла, но чтобы ошибку исключал совсем.
Joker-2013 да этот цвет всё напоминает, в убунту обновление, консоль тоже. Я беру "свой" стиль 3F3F3F и 999999 или быстро подобрал похожие. nikzzzz 1. я пока не понимаю, зачем делать окно, когда вполне устраивает cmd-консоль, можно сделать галку чтобы при запуске скомпоновать окна, переместить к примеру влево, не суть. Я за надёжность, чтобы в какой нибудь PE это не вызывало проблем, при почти отсутствии каких то фишек. 2. Разные потоки я думаю много мороки, чтобы отправлять выбор логического диска если он на одном физическом во второй список, чтобы запустить во втором потоке, но тогда нужно 2 и более консоли. Думаю это решать как решают пользователи сами, запустив второй раз утилиту. С последовательной очередью было бы не плохо, поставив к пример все логические диски на проверку и не бегать проверять, закончился ли первый диск. Думаю можно в ini добавить режим компоновки 0-не компоновать, 1-компоновать сверху гуи, под ним консоль, 2-слева гуи справа консоль (для малой высоты в нетбуков) Хотя можно сделать в разных потоках два и более cmd-консолей. Но тогда надо делать множественный выбор дисков, то есть от элемента листвью не уйти.
AZJIO, "Consolas" может отсутствовать в PE , "Courier New" есть почти везде.
AZJIO писал(а):
53795грубо говоря поиск chkdsk по предполагаемым адресам
Там всего два адреса, \Windows\System32 и для X64 \Windows\Sysnative .
AZJIO писал(а):
53798Хотя можно сделать в разных потоках два и более cmd-консолей.
Вообще-то я думаю, это лишнее, но если уж делать, нужно делать отдельные очереди для каждого физического диска, и запускать отдельный процесс для каждой очереди.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы