[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
ChkDskGui (PureBasic) Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия


Последний раз редактировалось: AZJIO (2023-01-25 16:21), всего редактировалось 43 раз(а)

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Joker-2013,
53774Уменьши цикличность...
Так это неинтересно, задача то как раз и состоит в том, чтобы окно вообще не моргало, можно попробовать пробуферировать вывод, может поможет.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
В строке приема данных если новых данных не получено, не обновлять

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO, тоже вариант...
У меня не сканируются диски, если они уже есть в списке...

[Цитировать]

    Orochi
  • 14100
  • Стаж: 7 лет 10 месяцев
  • Сообщений: 218
  • Репутация:0

    [+] [-]
53766так это ж надо чтоб сам CheckDisk это умел) а он разве умеет?
Можно запустить несколько CheckDisk процессов и сканировать все диски одновременно. Я так всегда делаю.
53769Это имеет смысл только при сканировании разделов, находящихся на разных физических дисках ,
Согласен. Хотя я пробовал сканировать несколько разделов на одно диске одновременно (без восстановления поврежденных секторов), и большой разницы во времени не заметил.
Можно сделать что-бы параллельное сканированное происходило только с дисками, а не с разделами.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
53781Можно сделать что-бы параллельное сканированное происходило только с дисками, а не с разделами.
тут вопрос сразу встаёт... отображение прогресса выполнения...

[Цитировать]

    Orochi
  • 14100
  • Стаж: 7 лет 10 месяцев
  • Сообщений: 218
  • Репутация:0

    [+] [-]
53784тут вопрос сразу встаёт... отображение прогресса выполнения...
Можно сделать закладки (tabs), одна закладка один диск с отображением прогресса выполнения.

[Цитировать]

    gera_serg
  • 1171
  • Стаж: 8 лет 8 месяцев
  • Сообщений: 1421
  • Репутация:9

    [+] [-]
Положил ChkDskGui.exe рядом с ChkDskGui.au3 в X:\Windows\System32 (ядро 8х64 Хемом1)
ChkDskGui.au3 - отрабатывает как и положено
ChkDskGui.exe - заявляет
"chkdsk.exe" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
>>
ЧЯДНТ ?

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
gera_serg,
Если ChkDskGui.exe x86 версии, она будет искать chkdsk.exe в \Windows\SysWOW64\ , а там его нет. ae

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
nikzzzz
1. если использовать элемент Edit, в режиме "только чтение", и при вводе данных использовать опцию "вставить в конец строки", то не моргает.
2. Режим ввода в лейбл только если переменная в цикле не равна пустой строке, тогда новые данные присоединяются к общей и выполняется вставка. Этим исключается холостого хода вставка. То есть было 1000 вставок в секунду, стало 2 вставки в секунду, грубо говоря. Без Sleep или Delay будет наверно миллион раз вставлять, число раз ограничивается скоростью вставки.
3. Уменьшить размер обновляемой области. Редкий случай, но когда я делал счётчик времени с миллисекундами и лейбл мерцал, я решил пусть мерцает хотя бы последняя цифра, и разделил лейбл на 4 области: часы, минуты, секунды, миллисекунда, и ещё три области разделитель на ":", в итоге область миллисекунды уже не мерцала.
4. При обработке файлов в статусной строке мерцают данные, думаю надо было сделать функцию выполняющую вставку 3 раза в секунду. То есть файловая функция обновляет некую переменную 100 раз в секунду, а функции вставки по таймеру это будет не важно, она вставит 3 раза те данные, что были в на данный момент в переменной, всё равно глаз пользователя не сможет оценить 100 кратно меняющиеся данные.


Последний раз редактировалось: AZJIO (2018-05-14 12:50), всего редактировалось 1 раз

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO,
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

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
53776Joker-2013 писал: Уменьши цикличность...
Так это неинтересно
ag
за счет правильных задержек
Как её не назови... az

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
nikzzzz
добавил стиль
SetGadgetColor(0 , #PB_Gadget_BackColor , RGB(55, 55, 55))
SetGadgetColor(0 , #PB_Gadget_FrontColor , RGB(180, 180, 180))
If OSVersion() >= #PB_OS_Windows_7
  SetGadgetFont(0, LoadFont(0, "Consolas", 11))
Else
  SetGadgetFont(0, LoadFont(0, "Courier New", 11))
EndIf
Вообще я уже думал об ini, чтобы добавить диски в игнор, галки по умолчанию, цвет консоли, шрифт гуи и консоли и размер. Ещё можно типа продвинутось фейса и сделать иконки опционально, и сделать так чтобы не зависило от разрядности, грубо говоря поиск chkdsk по предполагаемым адресам, допустим вызвать тихое окно если прошло, то молчим, иначе делаем поиск и предлагаем открыть найденный или окно выбора файла, но чтобы ошибку исключал совсем.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO, что то мне напоминает, цвет фона и текста:

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
Joker-2013
да этот цвет всё напоминает, в убунту обновление, консоль тоже. Я беру "свой" стиль 3F3F3F и 999999 или быстро подобрал похожие.
nikzzzz
1. я пока не понимаю, зачем делать окно, когда вполне устраивает cmd-консоль, можно сделать галку чтобы при запуске скомпоновать окна, переместить к примеру влево, не суть. Я за надёжность, чтобы в какой нибудь PE это не вызывало проблем, при почти отсутствии каких то фишек.
2. Разные потоки я думаю много мороки, чтобы отправлять выбор логического диска если он на одном физическом во второй список, чтобы запустить во втором потоке, но тогда нужно 2 и более консоли. Думаю это решать как решают пользователи сами, запустив второй раз утилиту. С последовательной очередью было бы не плохо, поставив к пример все логические диски на проверку и не бегать проверять, закончился ли первый диск.
Думаю можно в ini добавить режим компоновки 0-не компоновать, 1-компоновать сверху гуи, под ним консоль, 2-слева гуи справа консоль (для малой высоты в нетбуков)
Хотя можно сделать в разных потоках два и более cmd-консолей. Но тогда надо делать множественный выбор дисков, то есть от элемента листвью не уйти.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO,
"Consolas" может отсутствовать в PE , "Courier New" есть почти везде.
53795грубо говоря поиск chkdsk по предполагаемым адресам
Там всего два адреса, \Windows\System32 и для X64 \Windows\Sysnative .
53798Хотя можно сделать в разных потоках два и более cmd-консолей.
Вообще-то я думаю, это лишнее, но если уж делать, нужно делать отдельные очереди для каждого физического диска, и запускать отдельный процесс для каждой очереди.

Страница 5 из 34


Показать сообщения:    

Текущее время: 20-Апр 08:32

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы