Autorun

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Ну что, покажем Гислеру, как надо цвет панелей менять?

[cut]

Код: Выделить всё

RegisterCommand 70052 "BackColorSelect"

Func BackColorSelect(lParam)
    Local bkg1, bkg2
    IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
    IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
    
    Local oCC = Callback("ColorChooseProc", "hwnd;uint;wparam;lparam")    
    Local cls = Buffer(64), buf = Buffer(auX64 ? 72 : 36)
    cls.Zero()
    cls.SetNum(0, "dword", 0x000000FF, _
                  "dword", 0x0000FF00, _
                  "dword", 0x00FF0000, _
                  "dword", 0x00FFFFFF, _                  
                  "dword", 0x00808080)
    buf.Zero()                    
    If auX64 Then
        buf.SetNum(0,  "dword", buf.size)
        buf.SetNum(8,  "hwnd", AUTORUN_TCHANDLE)
        buf.SetNum(16, "hwnd", 0, _
                       "uint", bkg1)
        buf.SetNum(32, "ptr", cls.ptr, _                      
                       "dword", 0x00000113)
        buf.SetNum(48, "lparam", 0, _
                        "ptr", oCC.ptr)
    Else
        buf.SetNum(0, "dword", buf.size, _   
                      "hwnd", AUTORUN_TCHANDLE, _         
                      "hwnd", 0, _
                      "uint", bkg1, _
                      "ptr", cls.ptr, _
                      "dword", 0x00000113, _
                      "lparam", 0, _
                      "ptr", oCC.ptr)
    EndIf    
    If Not DllCall("comdlg32.dll\ChooseColorW", "ptr", buf.ptr, "bool") Then
       WriteBackground(bkg1, bkg2)
    EndIf    
    Free(buf, cls, oCC)
EndFunc

Func ColorChooseProc(hWnd, uMsg, wParam, lParam)
    Static IDOK = 1, IDCANCEL = 2, WM_COMMAND = 0x0111
    Static r, g, b, c, max = 1*255 + 256*255 + 65536*255, last = -2
    If uMsg = WM_COMMAND Then
       If wParam = IDOK Or wParam = IDCANCEL Then Return 0
       r = WinGetText(WinFind(hWnd, "Edit", 4))
       g = WinGetText(WinFind(hWnd, "Edit", 5))
       b = WinGetText(WinFind(hWnd, "Edit", 6))
       If StrLen(r) = 0 Then r = 0
       If StrLen(g) = 0 Then g = 0
       If StrLen(b) = 0 Then b = 0
       c = 1*r + 256*g + 65536*b      
       WinSetText("RGB: " & r & ", " & g & ", " & b, hWnd)
       If Not IsInt(c) Then Return 0
       If c = last Then Return 0       
       If c >= -1 And c <= max Then
          WriteBackground(c, c)
          last = c
       Endif       
    EndIf  
    Return 0
EndFunc

Func WriteBackground(Color1, Color2)
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %Color1%
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %Color2%
     # обновление панелей
     SendCommand 2957
     SendCommand 2957
EndFunc
[/cut]
[cut]TOTALCMD#BAR#DATA
70052

%COMMANDER_EXE%
Смена фона панелей

1
-1[/cut]
Ну вот. А то всё диалоги да диалоги. Не по-швейцарски это. Или по-швейцарски?

A55555
Новая функция работает только с Everything, проверять условие не требуется. Т.е. вместо:

Код: Выделить всё

If bEverything Then CommandExec em_everything
Можно просто посылать em_команду, например, после отображения прогресс-бара:

Код: Выделить всё

RunThread "WinFindTorrentData"
While g_FindTorrTask = 0
    Sleep(50)
Wend

CommandExec em_everything
А в конце выгружать Everything после подсчета времени операции:

Код: Выделить всё

T2 = Round(GetUptime() - T1, 0) / 1000
T3 = "Время поиска: " &  StrFormat("%.3f", T2) & " sec"

CommandExec em_everything
Старый поиск без Everything не может работать дольше прежнего, ничего вроде не менялось. Возможно, у вас диски другие добавились или буквы изменились. Для ускорения поиска на HDD тома NTFS должны индексироваться (эта галочка обычно стоит по умолчанию в Windows) и лучше исключить системный раздел из поиска, особенно если на нем не хранятся торрент-данные. Другие логические диски, где тоже ничего нет, лучше тоже исключить из поиска.

Для обратного поведения CapsLock нужно поставить "Not" после условия, т.е. заменить

Код: Выделить всё

# проверка CapsLock
If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then
на

Код: Выделить всё

# проверка CapsLock
If Not BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then
И вы были правы. В старой функции поиска была ошибка и CapsLock работал наоборот. В последней версии модуля я исправил эту оплошность:

Код: Выделить всё

IniRead gDriveInclude %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
If Not BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then

Код: Выделить всё

If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then
         SetHintParam("ShowHint", "Font", 15, "Arial")
Вам тоже нужно добавить "Not" во втором случае, а в первом его убрать.

Что касается недокаченных раздач, то термин изначально был выбран неправильно. Речь идет о частично закаченных раздачах, как вы верно определили. Соответственно, поиск по размеру не будет давать результата. Можно попробовать в клиенте поставить опцию, чтобы дисковое пространство распределялось сразу, но не уверен, что это поможет.

Да, если в торрент-файле много мелких файлов, то поиск может длиться долго, но не бесконечно. Чем больше мелких файлов, тем больше результатов возвращает Everything и тем медленне все делается. К сожалению, Blu-Ray диски этим грешат. Они содежат много мелких файлов, которые ко всему прочему совпадают по именам и структуре каталогов с другими Blu-Ray дисками. Алгоритм поиска нужно улучшать, чтобы принимать во внимание только большие файлы. Но можно в настройках Everything исключить ненужные диски из индексации. Это должно ускорить поиск. В принципе режим "Имя+размер" должен быстро работать по сравнению с другими режимами, и достоверности от него больше, если какие-то файлы были полностью закачены.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555
Проблему с зависанием удалось воспроизвести. Один раз у меня действительно зависло на поиске Blu-Ray, но больше, сколько бы я не пытался повторить, этого не произошло. Пока не ясно, в чем причина, но было похоже, что Everything просто перестала отвечать на запросы. Вернее, она не ответила на последний запрос, в результате все так и зависло к концу операции. Это навело меня на мысль, что нужно сделать проценты поиска и какую-то информацию по памяти (хоть какую-то, вдруг она там очень сильно отжирается). Замените эти два блока.

Код: Выделить всё

# локальные переменные
Local T1 = GetUptime(), T2 = T1, T3, bSpeed = 0, bDbg = 1, nRes = 0
Local bName = Not b_Shift, bSize = Not b_CTRL, sSize, sMode, sMem, sDbg
Local j, nCount, sRes, nError, sList, sDirs, aQuery = List(), aCount = List()

Код: Выделить всё

# размер файла
If bSize Then
   sSize = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr")
EndIf

sDbg = Round(j/(nCount-1)*100,0) & '% - '
If bDbg Then
   nRes += StrLen(sRes) + 8
   sMem = StrLen(sList) + StrLen(sDirs) + nRes
   sDbg &= SizeFormat(sMem*2, 1, 'G', 2) &  ' - '        
EndIf

# меньше сообщений окну прогресса
If bSpeed Then
   T3 = GetUptime()
   If Round(T3 - T2, 0) > 250 Then 
      WinSetText(sDbg & sRes, h_WinFindTorr)
      T2 = T3
   EndIf
Else
   WinSetText(sDbg & sRes, h_WinFindTorr)
EndIf
Позже, когда информация о памяти не будет нужна, поменяйте bDbg = 1 на bDbg = 0. Если это действительно проблема взаимодействия с Everything (какой-то баг), то скорее всего ничего не поделаешь.
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):A55555
Новая функция работает только с Everything, проверять условие не требуется. Т.е. вместо:

Код: Выделить всё

If bEverything Then CommandExec em_everything
Можно просто посылать em_команду, например, после отображения прогресс-бара:

Код: Выделить всё

RunThread "WinFindTorrentData"
While g_FindTorrTask = 0
    Sleep(50)
Wend

CommandExec em_everything
А в конце выгружать Everything после подсчета времени операции:

Код: Выделить всё

T2 = Round(GetUptime() - T1, 0) / 1000
T3 = "Время поиска: " &  StrFormat("%.3f", T2) & " sec"

CommandExec em_everything
Orion9
спасибо, но стартовать не успевает, поставил буквально в самое начало функции запуск

Код: Выделить всё

CommandExec em_everything
выход в том месте где вы подсказали нормально срабатывает

Код: Выделить всё

CommandExec em_everything_exit
Orion9 писал(а):Для обратного поведения CapsLock нужно поставить "Not" после условия, т.е. заменить

Код: Выделить всё

# проверка CapsLock
If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then
на

Код: Выделить всё

# проверка CapsLock
If Not BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) Then
Спасибо, помогло и на старом и на новом поиске.
Orion9 писал(а):Что касается недокаченных раздач, то термин изначально был выбран неправильно. Речь идет о частично закаченных раздачах, как вы верно определили. Соответственно, поиск по размеру не будет давать результата. Можно попробовать в клиенте поставить опцию, чтобы дисковое пространство распределялось сразу, но не уверен, что это поможет.
Да, вроде как сразу распределяет, размер показывает полный, но не на 100% совпадающий с тем что на сайте раздачи указан.
Я больше про то, что функция не найдя по размеру, сама не попыталась найти вторым способом по имени. Или тут имеется ввиду, что они друг без друга не могут в по умолчанию режиме?
Когда я её заставляю именно по имени при помощи Crtl поискать, то находит.
Orion9 писал(а):A55555
Проблему с зависанием удалось воспроизвести. Один раз у меня действительно зависло на поиске Blu-Ray, но больше, сколько бы я не пытался повторить, этого не произошло.
Да, зависание не стабильное, сегодня нормально работало, летало, потом снова зависло на этом Blu-Ray.
Orion9 писал(а):Замените эти два блока.

Код: Выделить всё

# локальные переменные
Local T1 = GetUptime(), T2 = T1, T3, bSpeed = 0, bDbg = 1, nRes = 0
Local bName = Not b_Shift, bSize = Not b_CTRL, sSize, sMode, sMem, sDbg
Local j, nCount, sRes, nError, sList, sDirs, aQuery = List(), aCount = List()

Код: Выделить всё

# размер файла
If bSize Then
   sSize = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr")
EndIf

sDbg = Round(j/(nCount-1)*100,0) & '% - '
If bDbg Then
   nRes += StrLen(sRes) + 8
   sMem = StrLen(sList) + StrLen(sDirs) + nRes
   sDbg &= SizeFormat(sMem*2, 1, 'G', 2) &  ' - '        
EndIf

# меньше сообщений окну прогресса
If bSpeed Then
   T3 = GetUptime()
   If Round(T3 - T2, 0) > 250 Then 
      WinSetText(sDbg & sRes, h_WinFindTorr)
      T2 = T3
   EndIf
Else
   WinSetText(sDbg & sRes, h_WinFindTorr)
EndIf
Позже, когда информация о памяти не будет нужна, поменяйте bDbg = 1 на bDbg = 0. Если это действительно проблема взаимодействия с Everything (какой-то баг), то скорее всего ничего не поделаешь.
Ошибку при запуске поиска выкинуло
[cut]Изображение[/cut]
OK нажал и всё равно нашло.
Выскакивает только когда ищется одиночный безпапковый например mkv файл.
Папки ищет без ошибки.
Нужно наблюдать, время покажет, но ту Blu-Ray папку теперь ищет нормально.

Эх, всё-таки снова подвисло
[cut]Изображение[/cut]
закрыл, снова запустил, на 58% зависло.
Закрыл 58%, снова запустил, нормально нашло.

В любом случае, даже вот так как сейчас, это просто супер. Спасибо.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):Ошибку при запуске поиска выкинуло
Типичная ошибка ночных версий ) Вместо

Код: Выделить всё

sDbg = Round(j/(nCount-1)*100,0) & '% - '
должно быть

Код: Выделить всё

sDbg = Round((j+1)/nCount*100,0) & '% - '
Исправил первым делом. Хотя изменений еще много. Судя по скрину, вы подключили модуль - правильно сделали, теперь обновляться будет легче.
A55555 писал(а):спасибо, но стартовать не успевает, поставил буквально в самое начало функции запуск
А зачем вам запускать и выгружать Everything в каждой операции? Меня не напрягает ручное включение и выключение. Но в обновленном модуле предусмотрел такую опцию.

Код: Выделить всё

Global gEvPath = COMMANDER_PATH & "\Everything.exe", gEvAuto = 0, gEvDelay = 100
Если gEvAuto = 1, то будет автозапуск и выгрузка Everything при каждой операции. gEvDelay - задержка в миллисекундах после запуска на случай, если Everything не успевает стартовать.

Также добавил опцию для CapsLock.

Код: Выделить всё

Global gTorrentDbg = 0, gDbgStep, gCapsReverse = 0
gCapsReverse = 1 задает обратное поведение. gTorrentDbg и gDbgStep используются для отладочной информации. Alt+0 - включает и выключает режим отладки, а Alt+Win+0 выводит информацию на экран и копирует ее в буфер. Когда в следующий раз зависнет, не помешает посмотреть на каком шаге зависло.
A55555 писал(а):Да, вроде как сразу распределяет, размер показывает полный, но не на 100% совпадающий с тем что на сайте раздачи указан.
В клиенте есть опция для полного распределения дискового пространства для новой раздачи сразу после ее старта. На бумаге должно работать, но надо проверять. Могут быть нюансы.
A55555 писал(а):Я больше про то, что функция не найдя по размеру, сама не попыталась найти вторым способом по имени. Или тут имеется ввиду, что они друг без друга не могут в по умолчанию режиме?
Было отдельно, сейчас немного подправил. Теперь предлагается продолжить с другим режимом, если не было ничего найдено в текущем. Автоперехода между режимами не будет - может произойти прыжок не пойми куда, особенно если искать только по размерам. Какой-никакой контроль со стороны пользователя все-таки нужен.
A55555 писал(а):закрыл, снова запустил, на 58% зависло.
Закрыл 58%, снова запустил, нормально нашло.
Теперь можно будет перед началом операции включить отладку (Alt+0), и когда зависнет Alt+Win+0. На экране и в буфере будет информация, запостите ее на форум. Последняя версия модуля:
[cut="Torrent.aucfg"]

Код: Выделить всё

#Pragma IncludeOnce

# 70500-70599

RegisterCommand 70500 "TorrentFindData" 0
RegisterCommand 70501 "TorrentFindData" 1
RegisterCommand 70502 "GoToPathFromTextFile"
RegisterCommand 70503 "ToggleEverything"
RegisterCommand 70504 "FindTorrentParts"
RegisterCommand 70505 "TorrentSize"
RegisterCommand 70506 "TorrentFindOptions"
RegisterCommand 70507 "TorrentDebugInfo"

SetHotkeyAction /K:A /H:0 /DM /S TorrentDebugInfo
SetHotkeyAction /K:A /K:W /H:0 /DM /S TorrentFindOptions

Global gEvPath = COMMANDER_PATH & "\Everything.exe", gEvAuto = 0, gEvDelay = 100

Global gTorrentDbg = 0, gDbgStep, gCapsReverse = 0
Global gTorrentSize = 0, gTorrentCount = 0, gDriveInclude = "e:\;f:\;g:\;h:\;i:\;j:"

Global h_WinFindTorr = 0
Global g_WinFindTorr = 0, g_FindTorrTask = 0
Global o_WinFindTorr = Callback("WinFindTorrProc", "hwnd;uint;wparam;lparam")

Func WinFindTorrProc(hWnd, uMsg, wParam, lParam)
    Static WM_CLOSE = 0x0010
    If uMsg = WM_CLOSE Then
       If DllCall("DestroyWindow", "handle", hWnd) Then
          h_WinFindTorr = 0        
          g_FindTorrTask = 0
       EndIf   
       Return 0
    EndIf
    Return DllCall("CallWindowProcW", "ptr", g_WinFindTorr, _
                                      "hwnd", hWnd, "uint", uMsg, "wparam", wParam, "lparam", lParam)
EndFunc

Func WinFindTorrentData()
    Local hIco    
    h_WinFindTorr = DllCall("CreateWindowExW", _
                            "dword", 0, _
                            "wstr", "msctls_progress32", _
                            "wstr", "", _
                            "dword", 0x00C80000, _
                            "int", 200, "int", 100, "int", Scale(400), "int", Scale(50), _
                            "handle", AUTORUN_TCHANDLE, _
                            "handle", 0, "handle", 0, "ptr", 0, "handle")
    If h_WinFindTorr = 0 Then Return 0
    
    WinAlign(h_WinFindTorr, 0, DllCall("GetDesktopWindow"))
    WinSetPos("", -Scale(50), "", "", 1, h_WinFindTorr)
    WinSetState(5, h_WinFindTorr)
    
    g_WinFindTorr = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
                            "hwnd", h_WinFindTorr, _
                            "int", -4, _
                            "long_ptr", o_WinFindTorr.Ptr, "ptr")
                            
    Static PBS_MARQUEE     =  0x08, _
           PBM_SETMARQUEE  =  1034, _
           WM_GETICON      =  0x7f, _
           WM_SETICON      =  0x80
           
    hIco = SendMessage(AUTORUN_TCHANDLE, WM_GETICON, 2, 0)                     
    SendMessage(h_WinFindTorr, WM_SETICON, 0, hIco)
    
    WinSetStyle(PBS_MARQUEE, 2, h_WinFindTorr)    
    SendMessage(h_WinFindTorr, PBM_SETMARQUEE, 1, 0)
    
    WinSetText("Searching...", h_WinFindTorr)
    
    g_FindTorrTask = 1
    While g_FindTorrTask
        Sleep(50)
    Wend
    h_WinFindTorr = 0
EndFunc

Func TorrentFindData(lParam, nMode)
    If IsPressed(0x10) And Not nMode Then
       SetTorrentDrives()
       Return
    EndIf
    Local bEverything = nMode
    If h_WinFindTorr Then
       SendMessage(h_WinFindTorr, 0x0010, 0, 0)
       g_FindTorrTask = 0  
       Return
    Endif
    Static buf = Buffer(256)
    buf.Zero()
    Local nSymb = DllCall("GetLogicalDriveStringsW", "dword", buf.size, "ptr", buf.ptr)    
    If Not nSymb Then
       MsgBox("Не удалось получить список логических дисков" & auCRLF "SYSERROR: " & SYSERROR, "Autorun")
       Return
    EndIf
    Static aDrive = List(), aFound = List()
    Local i = 0, sz, sDrives
    aDrive.Count = 0
    While 1
       sDrive = buf.GetStr(i)
       sz = StrLen(sDrive)
       If sz = 0 Then break
       aDrive.add(sDrive)
       i = i + sz*2 + 2
    Wend
    sDrives = aDrive.text
    #MsgBox(sDrives)    
    Local obj = Plugin("TCTorrent")
    If ERROR <> 0 Then
       ShowHint("TCTorrent.wdx plugin error " & ERROR)
       Return
    Endif
    Local lRet = false 
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    If Not FileExist(sFile) Then 
       ShowHint("Файл не существует " & sFile)
       lRet = true
    ElseIf StrPos(FileGetAttr(sFile), "D") Then
       ShowHint("Каталог " & sFile)
       lRet = true
    ElseIf FileGetSize(sFile) > 1024*1024*5 Then
       ShowHint("Размер файла больше 5 Мб " & sFile)
       lRet = true
    Else
       obj.FileName = sFile
       Local name =  obj.GetValue(0)
       Local size = obj.GetValue(2,0)	# size -> bytes       
       Local files = obj.GetValue(1)
       If files < 1 Then
          ShowHint("Файл не является торрент-файлом " & sFile)
          lRet = true        
       EndIf
    Endif
    Free(obj)
    If lRet Then Return
    IniRead gDriveInclude %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
    Local bCaps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
    If gCapsReverse Then bCaps = Not bCaps
    If Not bCaps Then
       MsgBox("Поиск данных торрента:" & auCRLF & auCRLF & _
              "Имя: "    & name & auCRLF & _
              "Размер: " & size & auCRLF & _
              "Файлов: " & files & auCRLF & auCRLF & _ 
              "Диски поиска: " & gDriveInclude & auCRLF & auCRLF & _       
              "Продолжить?", "Autorun", 3+32+0)
       If EXTENDED <> 6 Then Return
    Endif
    If bEverything Then 
       If gEvAuto And Not ProcessExist("Everything.exe") Then 
          ShellExec(gEvPath, "-startup")
          Sleep(gEvDelay)
       EndIf   
    EndIf      
    aFound.Count = 0    
    gTorrentSize = size
    h_WinFindTorr = 0
    gTorrentCount = 0
    RunThread "WinFindTorrentData"
    While g_FindTorrTask = 0
        Sleep(50)
    Wend
    Local found
    If bEverything Then      
       found = FileFindEv("size:" & gTorrentSize, "", "sort:3")
       Local nError = ERROR
       If nError = 1 Then MsgBox("Не найдено окно Everything.")
       If nError = 2 Then MsgBox("Ошибка выполнения запроса к IPC Everything.")  
       If nError > 0 Then 
          g_FindTorrTask = 0
          Return
        EndIf  
    Else   
       For i = 0 to aDrive.Count -1
           If StrPos(gDriveInclude, aDrive[i]) Then
            If files > 1 Then
               found &= FileFind(aDrive[i], "*.*", 1, 2, "PathList", "Func:FindTorrentDir") & auCRLF
            Else
               found &= FileFind(aDrive[i], "*.*", 1, 1, "PathList", "Func:FindTorrentFile") & auCRLF
            EndIf   
           Endif   
       Next
    EndIf   
    found = StrTrim(found)
    aFound.Text = found
    If bEverything Then gTorrentCount = aFound.Count
    If bEverything And gEvAuto Then ShellExec(gEvPath, "-exit")     
    If g_FindTorrTask = 0 Then
       If gTorrentCount = 0 Then
          MsgBox("Поиск отменен" & auCRLF & auCRLF & _
                 "Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 48)
       
       Else
          MsgBox("Поиск отменен" & auCRLF & auCRLF & _
                 "Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _       
                 "Сохранить в текстовый файл?", "Autorun", 3+48+0)
          If EXTENDED = 2 Then Return
          If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
          If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
       EndIf
    Else 
       g_FindTorrTask = 0
       SendMessage(h_WinFindTorr, 0x0010, 0, 0)
       If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0
       If gTorrentCount = 0 Then       
          MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 64)
       Else
          bCaps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
          If gCapsReverse Then bCaps = Not bCaps
          If bCaps Then      
             SetHintParam("ShowHint", "Font", 15, "Arial")
             SetHintParam("ShowHint", "BackColor", 0xFF0000)
             SetHintParam("ShowHint", "Text", 0xFFFFFF)     
             ShowHint("Автопереход к найденному", 0, 0, 1000, 1)
             WinAlign(LAST_HINT_WINDOW)
             Sleep(100)         
             SetHintParam("ShowHint", "Reload")             
             GoToPathFromMsg(aFound[0])
             Return
          EndIf
          MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _       
                 "Сохранить в текстовый файл?", "Autorun", 3+64+0)
          If EXTENDED = 2 Then Return
          If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
          If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
       EndIf
    EndIf
EndFunc

Func SaveDataPathToText(Filename, DataPath)
     Local file = FileChangeExt(Filename, "txt"), bGoto = false
     If FileExist(file) Then
        MsgBox("Файл существует" & auCRLF & auCRLF & _
                file & auCRLF & auCRLF & "Перезаписать?", "Autorun", 3+32+0)
        If EXTENDED <> 6 Then Return
     EndIf
     FileWrite(file, DataPath)
     #MsgBox("Файл сохранен " & auCRLF & auCRLF & file, "Autorun", 64)
     SetHintParam("ShowHint", "Font", 15, "Arial")
     SetHintParam("ShowHint", "BackColor", 0xFF0000)
     SetHintParam("ShowHint", "Text", 0xFFFFFF)     
     ShowHint("Файл сохранен", 0, 0, 1000, 1)
     WinAlign(LAST_HINT_WINDOW)
     Sleep(100)         
     SetHintParam("ShowHint", "Reload")
     If bGoto Then
        If RequestInfo(1000) = 1 Then
           CommandExec /CD %'file'
        Else
           CommandExec /CD '' %'file'
        Endif
     Endif   
EndFunc

Func GoToPathFromTextFile()
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    If Not FileExist(sFile) Then 
       ShowHint("Файл не существует " & sFile)
       Return
    ElseIf StrPos(FileGetAttr(sFile), "D") Then
       ShowHint("Файл является каталогом " & sFile)
       Return
    ElseIf FileGetExt(sFile) <> "TXT" Then
       ShowHint("Расширение файла не .txt " & sFile)
       Return
    ElseIf FileGetSize(sFile) > 1024*2 Then
       ShowHint("Размер файла больше 2 Кб " & sFile)
       Return       
    EndIf
    Local txt = FileRead(sFile)
    Local target = StrPart(txt, auCRLF, 1)
    If target <> "" Then
       GoToPathFromMsg(target)
    Else   
       ShowHint("Пустой путь" & target)  
    EndIf    
EndFunc

Func GoToPathFromMsg(Target)
    If FileExist(Target) Then
       If RequestInfo(1000) = 2 Then
          CommandExec /CD %'Target'
       Else
          CommandExec /CD '' %'Target'
       Endif
       SendCommand(4006)
       If StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
    Else
       ShowHint("Путь не существует " & Target)
    EndIf    
EndFunc

Func FindTorrentFile(file)
    Static T1 = GetUptime()
    If Not g_FindTorrTask Then Return 0
    If Round(GetUptime() - T1, 0) > 200 Then 
       WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
       T1 = GetUptime()
       Sleep(5)
    EndIf         
    If file.size = gTorrentSize Then 
       gTorrentCount += 1
       Return 1
    EndIf
    Return 2
EndFunc

Func FindTorrentDir(file)
    Static T2 = GetUptime()
    If Not g_FindTorrTask Then Return 0
    If Round(GetUptime() - T2, 0) > 200 Then 
       WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
       T2 = GetUptime()
       Sleep(5)
    EndIf   
    Local sz = FileFind(file.FullPath, "*.*", 1, 0, "TotalSize")  
    If sz = gTorrentSize Then 
       gTorrentCount += 1
       Return 1
    EndIf    
    Return 2
EndFunc

Global gVbsInputBox

Func SetTorrentDrives()
    Local out, drives, vbs
    
    IniRead drives %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"    
    vbs = '/c ECHO Wscript.Echo Inputbox("Search on these disks:","Autorun","' & drives & '")>%TEMP%\~auto_0001.vbs'
    
    ProcessExecGetOutput out %COMSPEC% %vbs%
    
    gVbsInputBox = 1
    RunThread("WinVbsInputBoxActivate")
    ProcessExecGetOutput /OEM out "cscript.exe" "/nologo ~auto_0001.vbs" %TEMP%
    gVbsInputBox = 0
    
    out = StrTrim(out)
    If out = "" Then Return
    
    IniWrite %COMMANDER_INI% "Autorun" "TorrentDrives" %out%
    Sleep(50)
    MsgBox("Ключ сохранен.", "Autorun", 64)           
EndFunc

Func WinVbsInputBoxActivate()
    Local hVbs
    While gVbsInputBox
        hVbs = WinFind(0, "#32770", "Autorun")
        If hVbs > 0 Then
           WinSetState(23, hVbs)
           Break
        EndIf
        Sleep(50)
    Wend
EndFunc

Func TorrentSize(lParam)
    Local T1 = GetUptime()
    Local obj = Plugin("TCTorrent")
    If ERROR <> 0 Then
       ShowHint("TCTorrent.wdx plugin error " & ERROR)
       Return
    Endif
    Local size = 0, files = 0
    Local aSel = List()
          aSel.Text = GetSelectedItems(3, 0)       
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    Local lRet = false
    If aSel.Count = 0 Then
       If Not FileExist(sFile) Then 
          ShowHint("Файл не существует " & sFile)
          lRet = true
       ElseIf StrPos(FileGetAttr(sFile), "D") Then
          ShowHint("Каталог " & sFile)
          lRet = true       
       Else
          obj.FileName = sFile
          files = obj.GetValue(1)
          size = obj.GetValue(2,0)	# size -> bytes
          Free(obj)
       Endif
    EndIf
    If lRet Then
       Free(obj, aSel)
       Return
    EndIf
    If aSel.Count > 10 Then
       ShowHint("Выделено: " & aSel.Count & auCRLF & "Подсчёт времени...")
    EndIf    
    Local j, k = 0, dirs = 0, torrs = 0
    If aSel.Count > 0 Then
       For j = 0 To aSel.Count - 1
          sFile = sPath & aSel[j]
          If FileExist(sFile) Then 
             k += 1
             If Not StrPos(FileGetAttr(sFile), "D") Then
               obj.FileName = sFile
               s = obj.GetValue(2,0)
               If s > 0 Then 
                  size += s
                  files += obj.GetValue(1)
                  torrs += 1 
               Endif  
             Else   
               dirs += 1
             Endif   
          EndIf
       Next
       sName = "S/A: " & aSel.Count & "/" & k	# Selected / Available
    Else
       SetHintParam("ShowHint", "Font", 10, "")
       ShowHint("" & sName & auCRLF & _
                "Размер: " & SizeFormat(size, 1, 'G', 2, 1) & auCRLF & _
                "Файлов: " & files)
       Sleep(100)
       SetHintParam("ShowHint", "Reload")
       Free(aSel)
       Return
    EndIf
    Local tl = Round(GetUptime() - T1, 0) / 1000
    SetHintParam("ShowHint", "Font", 10, "")
    ShowHint((k = aSel.Count ? "" : "Файл " & sName & auCRLF) & _
             "Элементов: " & aSel.Count & auCRLF & _
             "Обработано: " & torrs & auCRLF & _
             "Каталогов: " & dirs & auCRLF & _              
             "Размер: " & SizeFormat(size, 0, 'M', 2) & auCRLF & _
             "Размер: " & SizeFormat(size, 0, 'G', 2) & auCRLF & _
             "Размер: " & SizeFormat(size, 0, 'T', 4) & auCRLF & _
             "Файлов: " & files & auCRLF & _                       
             "Powered by TCTorrent.wdx" & auCRLF & _
             "Время операции: " &  StrFormat("%.3f", tl) & " sec")
    Sleep(100)
    SetHintParam("ShowHint", "Reload")          
    Free(obj, aSel)
EndFunc

Func ToggleEverything()    
    If Not ProcessExist("Everything.exe") Then
       CommandExec em_everything
    Else
       CommandExec em_everything_exit
    Endif    
EndFunc 

Func TerminateEverything()
    CommandExec em_everything_exit
EndFunc

# original function by Loopback
Func TorrentInfo(sFile)
    Static aFixed = List('Name', 'TotalSize', 'FileCount', 'BlockSize', 'BlockCount', _
                         'Created', 'Creator', 'Hash', 'Comment', 'Encoding', _
                         'Multifile', 'PrivateTorrent', 'Publisher', 'PublisherURL')
    Static aMulti = List('Tracker', 'Webseed', 'Error', 'CustomField')

    Static sLibName = "TCTorrent.wlx" & (auX64 ? "64" : "")
    Static sLibPath = COMMANDER_PATH & "\Plugins\wlx\TCTorrent" & sLibName

    Local hDll = DllCall("LoadLibrary", "wstr", sLibPath, "handle")
    If hDll = 0 Then Return

    Local hHandle = DllCall(sLibName & "\TorrentOpen", "wstr", sFile, "handle")
    If hHandle = 0 Then
        DllCall("FreeLibrary", "handle", hDll)
        Return
    EndIf

    Local nCount, sRes

    For i = 0 to aFixed.Count - 1
        sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", aFixed[i], "int", 0, "wstr")
        OutputDebugString(aFixed[i] & ": " & sRes)
    Next

    OutputDebugString(auCRLF & 'Files:')
    nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", "File", "uint")
    For j = 0 To nCount - 1
        sRes = StrFormat("[%12s] %s", _
                 DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr"), _
                 DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "File", "int", j, "wstr"))
        OutputDebugString(sRes)
    Next

    For i = 0 to aMulti.Count - 1
        OutputDebugString(auCRLF & aMulti[i] & 's:')
        nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", aMulti[i], "uint")
        For j = 0 To nCount - 1
            sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", aMulti[i], "int", j, "wstr")
            OutputDebugString(sRes)
        Next
    Next

    DllCall(sLibName & "\TorrentClose", "handle", hHandle)
    DllCall("FreeLibrary", "handle", hDll)
EndFunc 

Func FindTorrentParts(lParam)
    # модификаторы вызова
    Local b_CTRL = IsPressed (0x11), b_Shift = IsPressed (0x10)
    If lParam = 1 Then b_CTRL = true
    If lParam = 2 Then b_Shift = true    
    
    # повторный вызов при запущенной задаче
    If h_WinFindTorr Then
       SendMessage(h_WinFindTorr, 0x0010, 0, 0)
       g_FindTorrTask = 0  
       Return
    Endif
    
    If gEvAuto And Not ProcessExist("Everything.exe") Then 
       ShellExec(gEvPath, "-startup")
       Sleep(gEvDelay)       
    Endif
    
    # имя файла под курсором
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    
    # файл не существует или является каталогом
    If Not FileExist(sFile) Then 
       ShowHint("File doesn't exist " & sFile)
       Return
    ElseIf StrPos(FileGetAttr(sFile), "D") Then
       ShowHint("Not a torrent file " & sFile)
       Return
    ElseIf FileGetSize(sFile) > 1024*1024*5 Then
       ShowHint("File size > 5 Mb " & sFile)
       Return
    EndIf    
    
    # путь к библиотеке плагина
    Static sLibName = "TCTorrent.wlx" & (auX64 ? "64" : "")
    Static sLibPath = COMMANDER_PATH & "\Plugins\wlx\TCTorrent" & sLibName

    # не удалось загрузить библиотеку
    Local hDll = DllCall("LoadLibrary", "wstr", sLibPath, "handle")
    If hDll = 0 Then 
       ShowHint("TCTorrent.wlx can't load library " & sLibPath)
       Return
    EndIf    

    # библиотеке не удалось открыть файл
    Local hHandle = DllCall(sLibName & "\TorrentOpen", "wstr", sFile, "handle")
    If hHandle = 0 Then
        ShowHint("TCTorrent.wlx can't open file " & sFile)    
        DllCall("FreeLibrary", "handle", hDll)
        Return
    EndIf
    
    # файл не является торрент-файлом
    Local nFiles
    nFiles = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileCount", "int", 0, "wstr")
    If nFiles < 1 Then
       ShowHint("Corrupt torrent file " & sFile)
       DllCall(sLibName & "\TorrentClose", "handle", hHandle)       
       DllCall("FreeLibrary", "handle", hDll)       
       Return             
    EndIf

    # окно прогресса операции
    h_WinFindTorr = 0
    RunThread "WinFindTorrentData"
    While g_FindTorrTask = 0
        Sleep(50)
    Wend

    # локальные переменные
    Local T1 = GetUptime(), T2 = T1, T3, bSpeed = 0, nRes = 0
    Local bName = Not b_Shift, bSize = Not b_CTRL, sSize, sMode, sMem, sDbg
    Local j, nCount, sRes, nError, sList, sDirs, aQuery = List(), aCount = List()
    
    Static aMode = List("«Имя и размер»", "«Только имя»", "«Только размер»")    
    If bName And bSize Then
       nMode = 0
    ElseIf bName Then
       nMode = 1    
    Else
       nMode = 2
    EndIf
    sMode = aMode[nMode]
    
    # количество файлов в торренте
    nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", "File", "uint")

    # перечисление файлов в торренте
    For j = 0 To nCount - 1
        
        If gTorrentDbg Then gDbgStep = "Step 1. TorrentGet j=" & j & auCRLF
        
        # имя файла
        sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "File", "int", j, "wstr")
        
        # размер файла
        If bSize Then
           sSize = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr")
        EndIf
        
        sDbg = Round((j+1)/nCount*100,0) & '% - '
        If gTorrentDbg Then
           nRes += StrLen(sRes) + 8
           sMem = StrLen(sList) + StrLen(sDirs) + nRes
           sDbg &= SizeFormat(sMem*2, 1, 'G', 2) &  ' - '        
        EndIf

        If gTorrentDbg Then gDbgStep &= "Step 2. WinSetText " & sRes & auCRLF
        
        # меньше сообщений окну прогресса
        If bSpeed Then
           T3 = GetUptime()
           If Round(T3 - T2, 0) > 250 Then 
              WinSetText(sDbg & sRes, h_WinFindTorr)
              T2 = T3
           EndIf
        Else
           WinSetText(sDbg & sRes, h_WinFindTorr)
        EndIf

        If gTorrentDbg Then gDbgStep &= "Step 3. FileFindEv " & sRes & auCRLF
                
        # запрос к Everything
        If bName And bSize Then
           aQuery.Text = FileFindEv('*"' & sRes & '" size:' & sSize, "", "")
        ElseIf bName Then
           aQuery.Text = FileFindEv('*"' & sRes & '"', "", "")        
        Else
           aQuery.Text = FileFindEv('size:' & sSize, "", "")
        EndIf
        
        # ошибка запроса
        nError = ERROR
        If nError > 0 Then Break

        If gTorrentDbg Then gDbgStep &= "Step 4. aCount.Add" & auCRLF
        
        # обработка запроса
        aCount.Add("[" & aQuery.Count & "] " & sRes)        
        If aQuery.Count > 0 Then 
           If gTorrentDbg Then gDbgStep &= "Step 5. sList" & auCRLF
           sList &= aQuery.Text & auCRLF
           If gTorrentDbg Then gDbgStep &= "Step 6. sDirs" & auCRLF
           If nFiles > 1 Then 
              If gTorrentDbg Then gDbgStep &= "Step 7. StrReplace" & auCRLF
              sDirs &= StrReplace(aQuery.Text, sRes, "") & auCRLF
           Else
              sDirs &= aQuery.Text & auCRLF
           EndIf
        Else
           If gTorrentDbg Then 
              gDbgStep &= "Step 5. Skip" & auCRLF
              gDbgStep &= "Step 6. Skip" & auCRLF
              gDbgStep &= "Step 7. Skip" & auCRLF              
           EndIf             
        EndIf  

        If gTorrentDbg Then gDbgStep &= "Step 8. Next"
        #Sleep(3000)
        
        # опрерация прервана закрытием окна прогресса
        If g_FindTorrTask = 0 Then Break
    Next
       
    If nError = 1 Then MsgBox("Everything window not found.")
    If nError = 2 Then MsgBox("IPC Everything query execution error.")  
    If nError > 0 Then 
       g_FindTorrTask = 0
       Free(aCount, aQuery)
       DllCall(sLibName & "\TorrentClose", "handle", hHandle)
       DllCall("FreeLibrary", "handle", hDll)           
       Return
    EndIf

    Local c = 0, m = Map(), top5 = List(), sTop5, bDirs = StrLen(StrTrim(sDirs))
    
    # суммирование путей при непустом результате
    If g_FindTorrTask And bDirs Then 
       aQuery.Text = sDirs
       For value In aQuery
           c = 1
           If m.Has(value) Then c += m.Get(value)
           m.Set(value, c)
       Next
    EndIf
    
    # сортировка путей по убыванию
    If g_FindTorrTask And bDirs Then
       top5.SortMethod = 1 
       For key, value In m          
           top5.Add("[" & value & "]" & Chr(160) & key)
       Next
       top5.Sort(1)
       
       # выбор верхних пяти путей
       For j = 0 To top5.Count - 1
          sTop5 &= top5[j] & auCRLF
          If j >= 5 Then Break
       Next   
    EndIf
    
    c = top5.Count
    Local top1, files = aCount.Text
    If c > 0 Then top1 = StrTrim(StrPart(top5[0], Chr(160), 2))

    # освобождение объектов и библиотеки    
    Free(aCount, aQuery, top5, m)    
    DllCall(sLibName & "\TorrentClose", "handle", hHandle)
    DllCall("FreeLibrary", "handle", hDll)
    
    # время операции    
    T2 = Round(GetUptime() - T1, 0) / 1000
    T3 = "Время поиска: " &  StrFormat("%.3f", T2) & " sec"
    
    If gEvAuto Then ShellExec(gEvPath, "-exit")    
    
    If g_FindTorrTask = 0 Then
       MsgBox("Поиск отменен", "Autorun", 48)
    Else        
       # закрытие окна прогресса
       g_FindTorrTask = 0
       SendMessage(h_WinFindTorr, 0x0010, 0, 0)
       If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0
       
       # ничего не найдено
       If c = 0 Then
          If nMode < 2 Then
             MsgBox("Найдено: " & c & auCRLF & auCRLF & _
                    "Торрент: " & nCount & " файлов" & auCRLF & T3 & auCRLF & _
                    "Режим: " & sMode & auCRLF & auCRLF & _                
                    "Продолжить в режиме " & aMode[nMode+1] & "?", "Autorun", 3+64+0)
             If EXTENDED = 6 Then Return FindTorrentParts(nMode+1)                
          Else
             MsgBox("Найдено: " & c & auCRLF & auCRLF & _
                    "Торрент: " & nCount & " файлов" & auCRLF & T3 & auCRLF & _
                    "Режим: " & sMode, "Autorun", 64)
          EndIf           
       Else          
          # проверка CapsLock
          Local bCaps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
          If gCapsReverse Then bCaps = Not bCaps
          If bCaps Then
             ShowRedHint("Автопереход к найденному")
             GoToPathFromMsg(top1)
             Return
          EndIf          
          MsgBox("Найдено: " & c & auCRLF & auCRLF & sTop5 & auCRLF & _
                 "Торрент: " & nCount & " файлов" & auCRLF & T3 & auCRLF & _
                 "Режим: " & sMode & auCRLF & auCRLF & _                
                 "Сохранить в текстовый файл?", "Autorun", 3+64+0)
          If EXTENDED = 2 Then Return
          If EXTENDED = 7 Then GoToPathFromMsg(top1)
          If EXTENDED = 6 Then
             Local txt
             txt &= top1 & auCRLF & auCRLF
             txt &= "-----------------" & auCRLF             
             txt &= "Top 5 locations:" & auCRLF 
             txt &= "-----------------" & auCRLF             
             txt &= sTop5 & auCRLF
             txt &= "-----------------" & auCRLF             
             txt &= "Torrent files:" & auCRLF     
             txt &= "-----------------" & auCRLF             
             txt &= files & auCRLF & auCRLF
             txt &= "-----------------" & auCRLF                          
             txt &= "Full list:" & auCRLF
             txt &= "-----------------" & auCRLF                
             txt &= sList             
             SaveDataPathToText(sFile, txt)
          EndIf   
       EndIf
    EndIf
EndFunc

Func TorrentFindOptions()
     gTorrentDbg = Not gTorrentDbg
     ShowRedHint("Торрент Debug " & (gTorrentDbg ? "включен" : "выключен"))
EndFunc

Func TorrentDebugInfo()
    If Not gTorrentDbg Then gDbgStep = "Торрент Debug выключен"
    If gDbgStep = "" Then gDbgStep = "Empty"
    SetHintParam("ShowHint", "Font", 13, "Arial")
    SetHintParam("ShowHint", "BackColor", 0x000000)
    SetHintParam("ShowHint", "Text", 0xFFFFFF)
    ShowHint(gDbgStep)
    WinAlign(LAST_HINT_WINDOW)    
    ClipPut(gDbgStep)  
    SetHintParam("ShowHint", "Reload") 
EndFunc
[/cut]
[cut]

Код: Выделить всё

Func GetDPI()
    Local DC = DllCall("GetDC", "int", 0)
    Local lpy = DllCall("GetDeviceCaps", "handle", DC, "int", 88) # LOGPIXELSX
    DllCall("ReleaseDC", "int", 0, "handle", DC)
    Return lpy
EndFunc

Func Scale(nValue)
    Static dpi = GetDPI()
    Return DllCall("MulDiv", "int", nValue, "int", dpi, "int", 96)
EndFunc 

Func ShowRedHint(HintText)
    SetHintParam("ShowHint", "Font", 15, "Arial")
    SetHintParam("ShowHint", "BackColor", 0xFF0000)
    SetHintParam("ShowHint", "Text", 0xFFFFFF)
    ShowHint(HintText, "", "", 1000, 1)
    WinAlign(LAST_HINT_WINDOW)    
    Sleep(50)            
    SetHintParam("ShowHint", "Reload") 
EndFunc
[/cut]
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555
Я вчера неправильно написал про комбинации клавиш, но, возможно, вы разобрались, если было время попробовать.
Теперь можно будет перед началом операции включить отладку (Alt+0), и когда зависнет Alt+Win+0.
Все как раз наоборот. Alt+Win+0 включает режим отладки, Alt+0 выводит информацию на экран и копирует ее в буфер. Эти комбинации пришлось жестко прописать в модуль, потому что использование обычных em_команд не подходит для этих целей. Окно прогресса перехватывает фокус и em_команды не срабатывают, пока главное окно ТС не активно. Активировать его можно вручную, но это очень неудобно, поэтому нет смысла использовать интерфейс ТС для назначения горячих клавиш, как это делалось с предыдущими командами. Т.е. такая прописка в usercmd.ini и wincmd.ini не даст хорошего результата:

Код: Выделить всё

[em_torrent_data_options]
cmd=70506
[em_torrent_data_dbginfo]
cmd=70507

Код: Выделить всё

[Shortcuts]
A+0=em_torrent_data_dbginfo
[ShortcutsWin]
A+0=em_torrent_data_options
Но саму кнопку с последней функцией можно так назначить, и она будет работать. Например Alt+N:

Код: Выделить всё

[em_torrent_data_name_size]
cmd=70504

Код: Выделить всё

[Shortcuts]
A+N=em_torrent_data_name_size
CA+N=em_torrent_data_name_size
SA+N=em_torrent_data_name_size
Модификаторы Ctrl и Shift тоже будут работать.

Вчера не было времени об этом написать, но сейчас отвечу.
A55555 писал(а):В любом случае, даже вот так как сейчас, это просто супер. Спасибо.
Ну тут и Loopback надо говорить огромное спасибо. Супер результат мог только случиться на супер плагинах TCTorrent и Autorun. Второй - это вообще нечто. Это движок без которого мы бы никуда не уехали. И если 10 лет назад на коротких штанцах можно было делать такое:

[cut="Сборка TechAdmin"]

Код: Выделить всё

# Enables Process functionality
LoadLibrary Plugins\Autorun_Process.dll
LoadLibrary Plugins\Autorun_Sysinfo.dll
RegWrite "HKLM\SOFTWARE\TechAdmin" "Admin" "REG_DWORD" "1"
IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "TechAdmin" "WriteTest" "1"

# Adding current TC path to PATH environment variable
# Добавляет к переменной окружения PATH текущую папку TC
SetEnv /A /EV PATH ;%COMMANDER_PATH%
SetEnv /EV COMMANDER_HANDLE %AUTORUN_TCHANDLE%
SetEnv /EV COMMANDER_PID %AUTORUN_TCPID%

# Установка архитектуры TC
SetEnv /EV COMMANDER_ARCH %AUTORUN_TCARCH%

# Проверка языка системы
StrUpper OSLANG %SYSINFO_USERLANG%
If %OSLANG% = ENU Then
  SetEnv /EV COMMANDER_OSLANG Eng
Else
  SetEnv /EV COMMANDER_OSLANG %OSLANG%
EndIf

# Проверка версии ОС
If %SYSINFO_OSVERSION% = WIN_XP Then
  SetEnv COMMANDER_OSVER "XP"
ElseIf %SYSINFO_OSVERSION% = WIN_2003 Then
  SetEnv COMMANDER_OSVER "2003"
ElseIf %SYSINFO_OSVERSION% = WIN_VISTA Then
  SetEnv COMMANDER_OSVER "Vista"
ElseIf %SYSINFO_OSVERSION% = WIN_2008 Then
  SetEnv COMMANDER_OSVER "2008"
ElseIf %SYSINFO_OSVERSION% = WIN_2008R2 Then
  SetEnv COMMANDER_OSVER "2008R2"
ElseIf %SYSINFO_OSVERSION% = WIN_7 Then
  SetEnv COMMANDER_OSVER "7"
ElseIf %SYSINFO_OSVERSION% = WIN_8 Then
  SetEnv COMMANDER_OSVER "8"
ElseIf %SYSINFO_OSVERSION% = WIN_2012 Then
  SetEnv COMMANDER_OSVER "2012"
Else
  SetEnv COMMANDER_OSVER "Unknown"
EndIf

# Определение работы из PE
If %SYSTEMDRIVE% = X: Then
  SetEnv COMMANDER_OSVER "PE"
EndIf

# Проверка архитектуры ОС
If %SYSINFO_OSARCH% = 64 Then
  SetEnv COMMANDER_OSARCH x64
ElseIf %SYSINFO_OSARCH% = 32 Then
  SetEnv COMMANDER_OSARCH x86
EndIf

# Проверка языкового файла TC
IniRead "Commander_LangIni" "%COMMANDER_INI%" "Configuration" "LanguageIni" ""
IniRead "Commander_LangAutoSwitch" "%COMMANDER_INI%" "Admin" "LanguageAutoSwitch" "0"


If (%COMMANDER_LANGINI% = wcmd_rus.lng) Then
  SetEnv COMMANDER_LANG "Rus"
ElseIf (%COMMANDER_LANGINI% = wcmd_rus_PE.lng) Then
  SetEnv COMMANDER_LANG "Rus"
  SetEnv COMMANDER_OSVER "PE"
ElseIf (%COMMANDER_LANGINI% = wcmd_eng.lng) Then
  SetEnv COMMANDER_LANG "Eng"
ElseIf (%COMMANDER_LANGINI% = wcmd_eng_PE.lng) Then
  SetEnv COMMANDER_LANG "Eng"
  SetEnv COMMANDER_OSVER "PE"
Else
  SetEnv COMMANDER_LANG "Default"
EndIf

If (%COMMANDER_OSVER% = PE) AND (%COMMANDER_OSLANG% = RUS) AND (%COMMANDER_LANGINI% <> wcmd_rus_PE.lng) Then
  SetEnv COMMANDER_LANG "Rus"
  IniWrite /EV "%COMMANDER_INI%" "Configuration" "LanguageIni" "wcmd_rus_PE.lng"
  IniWrite /EV "%COMMANDER_INI%" "Configuration" "Mainmenu" "wcmd_rus_PE.mnu"
  SendCommand cm_LanguageConfig
ElseIf (%COMMANDER_OSVER% = PE) AND (%COMMANDER_OSLANG% = ENG) AND (%COMMANDER_LANGINI% <> wcmd_eng_PE.lng) Then
  SetEnv COMMANDER_LANG "Rus"
  IniWrite /EV "%COMMANDER_INI%" "Configuration" "LanguageIni" "wcmd_eng_PE.lng"
  IniWrite /EV "%COMMANDER_INI%" "Configuration" "Mainmenu" "wcmd_eng_PE.mnu"
  SendCommand cm_LanguageConfig
ElseIf (%COMMANDER_LANGAUTOSWITCH% <> 0) AND (%COMMANDER_OSLANG% = RUS) AND (%COMMANDER_LANG% <> Rus) Then
  SetEnv COMMANDER_LANG "Rus"
  IniWrite /EV "%COMMANDER_INI%" "Configuration" "LanguageIni" "wcmd_rus.lng"
  IniWrite /EV "%COMMANDER_INI%" "Configuration" "Mainmenu" "wcmd_rus.mnu"
  SendCommand cm_LanguageConfig
ElseIf (%COMMANDER_LANGAUTOSWITCH% <> 0) AND (%COMMANDER_OSLANG% <> %COMMANDER_LANG%) AND (%COMMANDER_OSLANG% <> RUS) Then
  SetEnv COMMANDER_LANG "Eng"
  IniWrite /EV "%COMMANDER_INI%" "Configuration" "LanguageIni" "wcmd_eng.lng"
  IniWrite /EV "%COMMANDER_INI%" "Configuration" "Mainmenu" "wcmd_eng.mnu"
  SendCommand cm_LanguageConfig
EndIf


# Определение первого запуска
IniRead COMMANDER_FIRSTSTART "%COMMANDER_INI%" "Admin" "FirstStart" "1"

If (%COMMANDER_FIRSTSTART% = 1) AND (%COMMANDER_OSLANG% <> %COMMANDER_LANG%) Then
 SendCommand cm_LanguageConfig
 ShellExec /EV /T '%COMMANDER_PATH%\Soft\NirSoft\WakeMeOnLan.exe' '/scan /UseNetBios 0' '%COMMANDER_PATH%\Soft\NirSoft'
EndIf

# Получение SID текущего пользователя
ProcessExecGetOutput /OEM USERSID cscript.exe '//Nologo "%commander_path%\Macroses\get_usersid.vbs"' '%commander_path%'

# Установка версии TC
SetEnv /EV COMMANDER_VER "8.52 - TechAdmin RC12 %COMMANDER_LANG% %COMMANDER_ARCH% bit (28.08.2015)"


# Проверка наличия прав Администратора
RegRead COMMANDER_ISADMIN "HKLM\SOFTWARE\TechAdmin" "Admin" "REG_DWORD" "0"
If (COMMANDER_OSVER = XP) AND (%AUTORUN_ISADMIN% = 1) Then
  SetEnv /EV COMMANDER_ASADMIN "Admin"
ElseIf (COMMANDER_OSVER <> XP) AND (%AUTORUN_ISADMIN% = 1) AND (%COMMANDER_ISADMIN% = 1)  Then
  SetEnv /EV COMMANDER_ASADMIN "Admin"
  RegWrite "HKLM\SOFTWARE\TechAdmin" "Admin" "REG_DWORD" "0"
Else 
  SetEnv /EV COMMANDER_ASADMIN "User"
EndIf

# Проверка наличия прав записи
IniRead COMMANDER_WRITEABLE "%COMMANDER_PATH%\Admin.ini" "TechAdmin" "WriteTest" "0"
If (%COMMANDER_WRITEABLE% = 1) Then
  SetEnv /EV COMMANDER_SOFT "%COMMANDER_PATH%\Soft"
  IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "TechAdmin" "WriteTest" "0"
Else 
  SetEnv /EV COMMANDER_SOFT "%TEMP%\Soft"
  IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "TechAdmin" "WriteTest" "0"
EndIf

# Чтение параметров настройки
IniRead AskIfTCNotAsAdmin "%COMMANDER_INI%" "Admin" "AskIfTCNotAsAdmin" "1"
IniRead OnlyUserTCMode "%COMMANDER_INI%" "Admin" "OnlyUserTCMode" "0"
IniRead ShowHiddensOnStart "%COMMANDER_INI%" "Admin" "ShowHiddensOnStart" "1"
IniRead ShowTrayHint "%COMMANDER_INI%" "Admin" "ShowTrayHint" "1"

# Всплывающая подсказка при запуске TC
If %ShowTrayHint% = 0 Then
  ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\autoexecmin~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
ElseIf %COMMANDER_ASADMIN% = Admin Then
  ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\autoexecadm~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
Else
  ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\autoexec~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
EndIf

# Запрос на запуск с правами Администратора
If %AskIfTCNotAsAdmin% = 0 Then
ElseIf %COMMANDER_ASADMIN% = User Then
  ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\RunAsAdmin~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
EndIf

# Отображение всех скрытых окон TC при запуске новой копии TC с правами админа
If %ShowHiddensOnStart% = 0 Then
ElseIf %COMMANDER_ASADMIN% = Admin Then
  ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "win show class TTOTAL_CMD"
EndIf

If %OnlyUserTCMode% = 1 Then
  ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "script ~$sys.COMMANDER_PATH$\Macroses\UserTCMode~$sys.COMMANDER_ARCH$_~$sys.COMMANDER_LANG$.cfg"
  Set AskIfTCNotAsAdmin 0
  Set ShowTrayHint 0
  Set ShowHiddensOnStart 0
EndIf

# Настройки беспроводных сетей (Wi-Fi)
IniRead WLanProfile "%COMMANDER_PATH%\wincmd.ini" "WLan" "WLanProfile" ""
IniRead WLanImportProfile "%COMMANDER_PATH%\wincmd.ini" "WLan" "ImportProfileAtStart" "0"
IniRead WLanDeleteProfile "%COMMANDER_PATH%\wincmd.ini" "WLan" "DeleteProfileAtExit" "0"
If %WLanProfile% = "" Then
ElseIf %WLanImportProfile% = 1 Then
  SetEnv /EV COMMANDER_WLAN "%WLanProfile%"
  ShellExec /EV /SW_HIDE 'netsh.exe' 'wlan add profile filename="%commander_path%\Configs\WLan\%WLanProfile%.xml"'
Else
  SetEnv /EV COMMANDER_WLAN "%WLanProfile%"
EndIf

# Функции для работы с оффлайн (отключенной) системой
IniRead OfflineSystemDir "%COMMANDER_PATH%\wincmd.ini" "OFFLINESYSTEM" "OfflineSystemDir" "C:\Windows"
If %OfflineSystemDir% = "" Then
  SetEnv COMMANDER_OFFLINESYSTEM "C:\Windows"
Else
  SetEnv /EV COMMANDER_OFFLINESYSTEM "%OfflineSystemDir%"
EndIf

 
# Автоматически сканировать сеть и получать MAC-адреса локальных компьютеров
IniRead RefreshLanMACsOnStart "%COMMANDER_PATH%\wincmd.ini" "Admin" "AutoRefreshLanMACs" "1"
If (%RefreshLanMACsOnStart% = 1) AND (%COMMANDER_FIRSTSTART% <> 1) Then
  ShellExec /EV /SW_HIDE '%COMSPEC%' '/c del WakeMeOnLan.cfg /f /q' '%COMMANDER_PATH%\Soft\NirSoft' 
  ShellExec /EV /T '%COMMANDER_PATH%\Soft\NirSoft\WakeMeOnLan.exe' '/scan' '%COMMANDER_PATH%\Soft\NirSoft' 
EndIf


# Создание переменной содержащей SID текущего пользователя
SetEnv /EV COMMANDER_USERSID "%USERSID%"

# Расшифровывать Admin.ini при запуске TC
IniRead EncryptAdminINI "%COMMANDER_PATH%\wincmd.ini" "Admin" "EncryptAdminINI" "0"
IniRead EncryptAdminINI_SID "%COMMANDER_PATH%\wincmd.ini" "Admin" "EncryptAdminINIWithSID" "0"

If %EncryptAdminINI% = 0 Then
ElseIf %EncryptAdminINI_SID% = 1 Then
  ShellExec /EV /WAIT /SW_HIDE '%COMMANDER_PATH%\Macroses\ccrypt.exe' '-d -v -r -s -K "%COMMANDER_USERSID%" "%commander_path%\Admin.ini"'
Else
  ShellExec /EV /WAIT /SW_HIDE '%COMMANDER_PATH%\Macroses\ccrypt.exe' '-d -v -r -s -K "%USERNAME%" "%commander_path%\Admin.ini"'
EndIf

# Проверка включения функции удаленного администрирования
IniRead RemoteAdminEnable "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminEnable" "0"
# Установка пароля и имени пользователя для удаленного администрирования
If %RemoteAdminEnable% = 1 Then
  IniRead RemoteAdminName "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminName" "Администратор"
  IniRead RemoteAdminPWD "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminPwd" "0"
  IniRead RemoteAdminSys "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteSystems" "%commander_path%\Admin.lst"
  IniRead RemoteDomain "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteDomain" ""
  IniRead RemoteListRefreshAtStart "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RefreshAdminListAtStart" "0"
  IniRead RemoteDefaultUseAdminList "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "DefaultUseAdminList" "1"
  SetEnv /EV COMMANDER_ADMINNAME "%RemoteAdminName%"
  SetEnv /EV COMMANDER_ADMINPWD "%RemoteAdminPwd%"
  SetEnv /EV COMMANDER_ADMINSYSTEMS "%RemoteAdminSys%"
EndIf
# Использовать по умолчанию список из Admin.lst
If %RemoteDefaultUseAdminList% = 1 Then
  SetEnv /EV COMMANDER_ADMINSYSTEMS "%COMMANDER_PATH%\Admin.lst"
EndIf

If %RemoteListRefreshAtStart% = 1 Then
  ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "execmd NET VIEW | FINDSTR ~q\\~q > ~q~$sys.COMMANDER_PATH$\Admin.lst~q"
EndIf


# Шаблоны переименования
IniRead RENAMETEMPLATE1 "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate1" "шаблон1"
IniRead RENAMETEMPLATE2 "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate2" "шаблон2"
IniRead RENAMETEMPLATE3 "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate3" "шаблон3"

SetEnv /EV COMMANDER_RENAMETEMPLATE1 "%RENAMETEMPLATE1%"
SetEnv /EV COMMANDER_RENAMETEMPLATE2 "%RENAMETEMPLATE2%"
SetEnv /EV COMMANDER_RENAMETEMPLATE3 "%RENAMETEMPLATE3%"

IniRead SaveTemplateSettings "%COMMANDER_INI%" "Admin" "SaveTemplateSettings" "0"

IniRead RUNASDATE "%COMMANDER_PATH%\wincmd.ini" "Admin" "RunAsDate" "01\12\1991"

SetEnv /EV COMMANDER_RUNASDATE "%RUNASDATE%"



# After this line all actions are performed when TC closing
# После этой строки все действия выполняются при закрытии TC
Pragma AutorunFinalizeSection

# Шифрование Admin.ini
If %EncryptAdminINI% = 0 Then
ElseIf %EncryptAdminINI_SID% = 1 Then
  ShellExec /EV /SW_HIDE '%COMMANDER_PATH%\Macroses\ccrypt.exe' '-e -v -r -s -K "%COMMANDER_USERSID%" "%commander_path%\Admin.ini"'
Else
  ShellExec /EV /SW_HIDE '%COMMANDER_PATH%\Macroses\ccrypt.exe' '-e -v -r -s -K "%USERNAME%" "%commander_path%\Admin.ini"'
EndIf

# Удаление профиля беспроводной сети
If %WLanProfile% <> "" Then
  ShellExec /EV /SW_HIDE 'netsh.exe' 'wlan delete profile name="%WLanProfile%"'
EndIf

# Сохранение временных настроек
If %SaveTemplateSettings% = 1 Then
  IniWrite /EV "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate1" "%COMMANDER_RENAMETEMPLATE1%"
  IniWrite /EV "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate2" "%COMMANDER_RENAMETEMPLATE2%"
  IniWrite /EV "%COMMANDER_PATH%\wincmd.ini" "RenameTemplates" "RenameTemplate3" "%COMMANDER_RENAMETEMPLATE3%"
  IniWrite /EV "%COMMANDER_PATH%\wincmd.ini" "OFFLINESYSTEM" "OfflineSystemDir" "%COMMANDER_OFFLINESYSTEM%"
  IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminName" "%COMMANDER_ADMINNAME%"
  IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteAdminPwd" "%COMMANDER_ADMINPWD%"
  IniWrite /EV "%COMMANDER_PATH%\Admin.ini" "RemoteAdministration" "RemoteSystems" "%COMMANDER_ADMINSYSTEMS%"
  IniWrite /EV "%COMMANDER_INI%" "WLan" "WLanProfile" "%COMMANDER_WLAN%"
EndIf

# Удаление списка MAC-адресов машин
If %RefreshLanMACsOnStart% = 1 Then
  ShellExec /EV /SW_HIDE '%COMSPEC%' '/c del WakeMeOnLan.cfg /f /q' '%COMMANDER_PATH%\Soft\NirSoft' 
EndIf

If %COMMANDER_FIRSTSTART% = 1 Then
 IniWrite /EV "%COMMANDER_INI%" "Admin" "FirstStart" "0"
EndIf
[/cut]
То сейчас о чем говорить? )

[cut]Изображение[/cut]
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):A55555
Я вчера неправильно написал про комбинации клавиш, но, возможно, вы разобрались, если было время попробовать.
Теперь можно будет перед началом операции включить отладку (Alt+0), и когда зависнет Alt+Win+0.
Все как раз наоборот. Alt+Win+0 включает режим отладки, Alt+0 выводит информацию на экран и копирует ее в буфер.
Orion9
спасибо, всё работает как вы сказали.
Спасибо за опции удобной настройки.
Alt+Win+0 достаточно один раз в данной копии TC активировать и для всех торрент-поисков через 70504 в рамках данной копии TC оно будет мониторить?
Orion9 писал(а):А зачем вам запускать и выгружать Everything в каждой операции?
Просто максимум возможной автоматизации.

Прикладываю скрин, на 88% остановилось
[cut]Изображение

Изображение
[/cut]
перед этим на 98% было, хаотично в общем продолжает место остановки случаться.
Orion9 писал(а):В клиенте есть опция для полного распределения дискового пространства для новой раздачи сразу после ее старта. На бумаге должно работать, но надо проверять. Могут быть нюансы.
Указал в клиенте и теперь все виды поиска находят едва начавшийся качаться файл.
Но попробовал и до установки опции в торрент-клиенте, поиск 70504 предложение выкинул попробовать поискать через "Название" и нашло.

Появился не стабильно случающийся баг, нашло, написало Автопереход, но противоположную панель не обновило визуально.
Ничего не сдвинулось никуда на противоположной панели, не выделило файл или папку, плюс при попытке на этой противоположной панели что-то сделать она не выполняет то что ты от неё хочешь, например зайти внутрь какой-то случайной папки. Не прям висит, но отказывается правильно работать.
Нужно свернуть и развернуть окно TC (вручную т.е. сделать визуальное обновление) и получаешь правильного вида противоположную панель с выделенным найденным файлом или папкой.
Не только 70504, через 70501 тоже такое случается.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):Alt+Win+0 достаточно один раз в данной копии TC активировать и для всех торрент-поисков через 70504 в рамках данной копии TC оно будет мониторить?
Да. При этом в заголовок рядом с процентами будет добавлена информация по памяти. Толку от этой информации никакой, но зато видно, что включен режим отладки. Сегодня утром запустил на торренте с 10000 файлами в режиме "только размер", долго пришлось ждать - два сообщения успел на форум запостить - но ничего не зависло и дошло до конца с 55 Мб памяти. Так что памяти не должно много расходоваться, даже если будут найдены десятки тысяч файлов и путей. Проблема в другом.

У вас на скрине видно, что зависло на третьем шаге, т.е. на функции FileFindEv, которая запрашивает данные у Everything. Как я и думал, проблема именно в этом, и мне тоже удалось ее повторить. В первом случае зависло на 5%, во втором на 23%

Код: Выделить всё

Step 1. TorrentGet j=516
Step 2. WinSetText Components\2k10\Programs-2k10\Games\cards.dll
Step 3. FileFindEv Components\2k10\Programs-2k10\Games\cards.dll

Код: Выделить всё

Step 1. TorrentGet j=2272
Step 2. WinSetText Components\2k10\User.Win\Win-XP\XPpSP3\I386\LEGITCC.DL_
Step 3. FileFindEv Components\2k10\User.Win\Win-XP\XPpSP3\I386\LEGITCC.DL_
Но важный момент. К зависаниям больше или только склонен ТСх64, в ТСх86 мне не удается добиться зависаний на разных торрентах, включаяя и тот, что с 10000 файлами.

В общем, с такой проблемой нужно обращаться к Loopback. Может быть он найдет причину, почему FileFindEv виснет, и починит, если это вообще возможно. А может и не возможно.
A55555 писал(а):Не только 70504, через 70501 тоже такое случается.
Эту я проблему совсем не понял, у меня такого вроде нет. Но могу предположить, что переход происходит медленно и команда перехода (CommandExec /CD %'file') просто не успевает доработать до конца. Такое может случиться, например, если переход осуществляется в архив, т.е. курсор ставится не на файл архива, а происходит заход именно в архив, поэтому так долго. А может просто зависает где чего, как в случаее с Everything. Попробуйте в 32-битном ТС, будет такая проблема повторяться или нет.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Loopback
Runtime error 216 at 06CC22E7
Это у меня стабильно происходит с 32-битным TC когда RegExpReplace вызывается 51 раз подряд. [cut="Вот кусок кода:"]

Код: Выделить всё

    # WinMerge Light
    FC = FileRead(COMMANDER_PATH & '\Profile\tools\WINMERGE\WinMerge.ini', 0, 'ANSI')
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Bold07)=.+$', '$1=1', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color01)=.+$', '$1=16777215', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color02)=.+$', '$1=16777215', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color03)=.+$', '$1=0', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color04)=.+$', '$1=15790320', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color05)=.+$', '$1=14120960', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color06)=.+$', '$1=16777215', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color07)=.+$', '$1=16711680', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color08)=.+$', '$1=8388736', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color09)=.+$', '$1=32768', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color10)=.+$', '$1=255', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color11)=.+$', '$1=6316128', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color12)=.+$', '$1=128', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color13)=.+$', '$1=12615680', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color20)=.+$', '$1=8388608', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color21)=.+$', '$1=12615680', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color22)=.+$', '$1=8388607', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color23)=.+$', '$1=8388479', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color24)=.+$', '$1=8355839', 1)
        FC = RegExpReplace(FC, '(?m-s)^(DefaultSyntaxColors/Color25)=.+$', '$1=16744319', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DefaultTextColoring)=.+$', '$1=1', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DifferenceColor)=.+$', '$1=14548957', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DifferenceDeletedColor)=.+$', '$1=16769248', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemDiffColor)=.+$', '$1=14548957', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemDiffTextColor)=.+$', '$1=0', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemEqualColor)=.+$', '$1=16777215', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemEqualTextColor)=.+$', '$1=0', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemFilteredColor)=.+$', '$1=14153210', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemFilteredTextColor)=.+$', '$1=0', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemNotExistAllColor)=.+$', '$1=16769248', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DirItemNotExistAllTextColor)=.+$', '$1=0', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/DirMarginColor)=.+$', '$1=16777215', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/MovedBlockColor)=.+$', '$1=12638448', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/MovedBlockDeletedColor)=.+$', '$1=12632256', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SNPColor)=.+$', '$1=14678779', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SNPDeletedColor)=.+$', '$1=15329769', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedDifferenceColor)=.+$', '$1=14540287', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedDifferenceDeletedColor)=.+$', '$1=12632304', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedMovedBlockColor)=.+$', '$1=5140728', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedMovedBlockDeletedColor)=.+$', '$1=10728956', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedSNPColor)=.+$', '$1=11843567', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedSNPDeletedColor)=.+$', '$1=14737648', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedWordDifferenceColor)=.+$', '$1=11184895', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SelectedWordDifferenceDeletedColor)=.+$', '$1=9213670', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/TrivialDifferenceColor)=.+$', '$1=12579579', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/TrivialDifferenceDeletedColor)=.+$', '$1=15329769', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/WordDifferenceColor)=.+$', '$1=11206570', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/WordDifferenceDeletedColor)=.+$', '$1=10544800', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SysColorHookEnabled)=.+$', '$1=0', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/ColorScheme)=.+$', '$1=Modern', 1)
        FC = RegExpReplace(FC, '(?m-s)^(Settings/SysColorHookColors)=.+$', '$1=2:0x00d1b499,3:0x00dbcdbf,5:0x00ffffff,8:0x00000000,9:0x00000000,12:0x00ababab,13:0x00d77800,14:0x00ffffff,15:0x00f0f0f0,16:0x00a0a0a0,17:0x006d6d6d,18:0x00000000,19:0x00000000,20:0x00ffffff,21:0x00696969,27:0x00ead1b9,28:0x00f2e4d7', 1)
    FileWrite(COMMANDER_PATH & '\Profile\tools\WINMERGE\WinMerge.ini', FC, 'ANSI')
[/cut]
Закомментирую этот кусок — нет Runtime error. Раскомментирую — получите, распишитесь. На 64-битном TC этого нет. Только на х32. После перезагрузки компьютера запускаю TC — сбой не происходит, затем пара перезапусков проходят гладко. Но стоит TC постоять открытым некоторое время и тогда при перезапусках начинает появляться Runtime error.
Amo ergo sum
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yozhik писал(а):Это у меня стабильно происходит с 32-битным TC когда RegExpReplace вызывается 51 раз подряд.
А на предыдущей версии то же самое проявляется? Или только на последней?

И еще, хорошо бы для теста сам файл WinMerge.ini.
yozhik писал(а):тогда при перезапусках
При перезапусках тотала?

Orion9 писал(а):Может быть он найдет причину, почему FileFindEv виснет
В таком виде это слишком сложно для повторения, нужно что-то более короткое, где проблема функции (если это проблема в ней) сможет проявиться. У меня просто нет массивов блюреев, я их вообще не качаю, и торренты долго не храню.

Впрочем, есть одно предположение. Не может ли быть такого, что список файлов FileFindEv получает дольше 5 секунд? Просто сейчас стоит жёстко заданный таймаут, после этого операция прерывается. Этот момент уже отметил для себя в процессе ревизии кода, таймаут сделаю настраиваемым, но пока вот так.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Loopback писал(а):А на предыдущей версии то же самое проявляется? Или только на последней?
Воспроизводится на 2.2.20.0, т.е. с момента появления RegExp.dll. Вчера также воспроизвёл на 2.2.20.3 и 2.2.21.0. Сейчас у меня 2.2.21.1. А раньше я не сигнализировал по 2м причинам: 1) этот кусок обработки WinMerge.ini я написал всего несколько дней назад; 2) у меня Windows на виртуалке, и потому я приучил себя не рефлексировать легко на сбои, а перепроверять на случай, если причина сбоя не в Винде, а в виртуализации, хотя вообще этот конкретный механизм (Parallels) — очень качественный.
Loopback писал(а):сам файл WinMerge.ini
https://send.vis.ee/download/00d7e31e23 ... jk9-W6PADg
WinMerge.ini, autorun.aucfg и кнопка.
Loopback писал(а):При перезапусках тотала?
Да. Я так себе настроил, что между тёмной и светлой темами переключаюсь перезагрузкой Тотала ("cm_SwitchDarkmode, cm_exit 25"), во время которой перезаписываются все *.ini wd-плагинов и сторонних утилит. (Можно, конечно, настроить переключение и без перезагрузки Тотала, но пока руки не дошли.) Я, собственно, для этого и свой aucfg прикрепил (вместе с кнопкой перезапуска), чтобы Вы могли глянуть, если понадобится, для чего вообще эти перезапуски.

Добавлено:
См. ниже пост: кажется разобрался.
Последний раз редактировалось yozhik Вс окт 05, 2025 18:54, всего редактировалось 1 раз.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):Просто максимум возможной автоматизации.
Но тогда получается, что если вы хотите найти 10 торрентов, то Everything будет запускаться и выгружаться 10 раз.

Мне проще один раз запустить вручную и видеть значок в трее. Когда утилита больше не нужна, выгрузить ее по Ctrl+Alt+E. Или другую комбинацию для этого назначить.
A55555 писал(а):Появился не стабильно случающийся баг, нашло, написало Автопереход, но противоположную панель не обновило визуально.
Сейчас на свежую голову больше понимаю о чем речь, но проблему воспроизвести не удалось. Похоже, ТС просто не обновляет окно, не перерисовывает его. Надеялся в 64-версии поймать эту проблему (ТСх64 известем такими неприятными косяками), но не смог. А главное зависаний больше никаких не было, не смотря на то, что я с полчаса гонял различные торрент-файлы.

Ну, с зависаниями еще могу объяснить. Отключил в настройках Everything индексацию томов с установленными системами, теперь поиск просто летает. Bluray с 1200 файлами проходит буквально на глазах. Про сотню файлов и меньше и говорить нечего - операция длится всего пару секунд. Кроме того сегодня тестировал на спокойной системе (ничего в фоне не качалось, не игралось, не сжималось и вообще не делалось), отсюда, вероятно, такой хороший и стабильный результат, т.е. без каких-либо зависаний.

A55555
Сейчас у меня не будет времени на Autorun, но если вы и дальше будете пользоваться, фиксируйте косяки и баги, а также где и что можно улучшить. Надеюсь, доберусь до всего со временем.
Loopback писал(а):У меня просто нет массивов блюреев, я их вообще не качаю, и торренты долго не храню.
Наличие самих данных, конечно, желательно, но для тестов не требуется. Можно просто взять торрент-файл от Bluray диска, например тот, который упоминал A55555, или любой другой. Ссылку на файл с 10000 файлами я тоже постил на предыдущей странице.
Loopback писал(а):Не может ли быть такого, что список файлов FileFindEv получает дольше 5 секунд? Просто сейчас стоит жёстко заданный таймаут, после этого операция прерывается.
Даже не знаю. 5 секунд вроде нормально, но многое ведь может зависить от загруженности процессора в конкретный момент и количества файлов в базе Everything. Может и в самой Everything есть какой-то баг. Но в любом случае если долго нет ответа, FileFindEv должна это обрабатывать и возвращать результат. Сейчас похоже она просто висит и ждет данных на свой запрос. Хотя нужно еще обратить внимание, что в строке вызова присутствует объект List со свойством текст

Код: Выделить всё

aQuery.Text = FileFindEv('*"' & sRes & '" size:' & sSize, "", "")
Может в нем причина?
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Loopback
Ох, наконец-то у меня получилось, кажется, разобраться! Методом научного тыка столько всего перепробовал — и кол-во вызовов RegExpReplace, и замену RegExpReplace на StrReplace (без регулярок, конечно, но опять выскакивал Runtime error), и длину строк в частях <что_найти> и <чем_заменить>. А оказалось то что? Переменные. В своём aucfg я для манипуляций с содержимым файла использую переменную FC (от File Content) — в неё читаю, в ней меняю, из неё записываю. И она у меня там в двух блоках, т.е. в общей сложности 15 + 51 = 66 обращений — 66 перезаписей содержимого. Заменил в одном блоке на другую переменную, другое имя — всё, с того момента Runtime error прекратились.
Amo ergo sum
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yozhik
Сдается мне, что это все-таки не решение проблемы и она где-то глубже. Многократное использование переменных не должно приводить к падению, даже при обращении к ним из разных потоков. Я все же попробую код, может и повторится. И функции тоже проверить стоит, хотя я их в цикле гонял по нескольку тысяч раз (для измерения скорости), но там в тесте был только один регэксп.

Во всяком случае вроде ясно, что это не связано с последними внутренними изменениями в работе с параметрами, спасибо за проверку.
Orion9 писал(а):Но в любом случае если долго нет ответа, FileFindEv должна это обрабатывать и возвращать результат.
Для этого и сделан таймаут, но он, конечно, должен настраиваться.
Orion9 писал(а):Сейчас похоже она просто висит и ждет данных на свой запрос.
Это можно попробовать проверить, включив функцию обратного вызова и из нее выводить результат куда-нибудь. Можно и в OutputDebgString, но она прилично замедляет работу, с ней легко можно и не уложиться в 5 секунд.
Orion9 писал(а):присутствует объект List со свойством текст
Он получит текст только после завершения FileFindEv. Но нельзя исключать и его. Чтобы проверить, можно попробовать вывести не в список, а в файл.

Но вообще, код FileFindEv еще глубоко не проверял, может там и так что-то очевидное найдется.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Это можно попробовать проверить, включив функцию обратного вызова и из нее выводить результат куда-нибудь.
Loopback писал(а):Чтобы проверить, можно попробовать вывести не в список, а в файл.
Хорошие идеи, но нет возможности проверить. Зашел только, чтобы о перерисовке написать.

A55555
Если проблема, которую вы описали, будет повторяться, замените функцию GoToPathFromMsg на эту:
[cut]

Код: Выделить всё

Func GoToPathFromMsg(Target)
    If FileExist(Target) Then
       If RequestInfo(1000) = 2 Then
          CommandExec /CD %'Target'
       Else
          CommandExec /CD '' %'Target'
       Endif
       SendCommand(4006)
       If StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
       WinRedraw(1)
       SendCommand(540)     # cm_RereadSource
    Else
       ShowHint("Путь не существует " & Target)
    EndIf    
EndFunc
[/cut]
Здесь я добавил всего две строчки: WinRedraw(1) и SendCommand(540). Первая перерисовывает окно, вторая перечитывает панель. Если проблема уйдет, одну из этих команд можно убрать. Вполне возможно, что и на одной команде будет работать.
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):A55555
Сейчас у меня не будет времени на Autorun, но если вы и дальше будете пользоваться, фиксируйте косяки и баги, а также где и что можно улучшить. Надеюсь, доберусь до всего со временем.
Orion9
да, я сразу напишу.
Пока, не считая на Blu-Ray подвисаний, только вот это частенько случающееся именно после последней версии Torrent.aucfg не обновление противоположной панели, при том что сам поиск успешен.
При чём когда это происходит (не обновление противоположной панели), не выполняется даже команда SendCommand(2002), т.е. вручную при помощи свернул/развернул окно TC обновляешь и оказываешься внутри папки искомой папки торрент файла, т.е. оно не смогло из-за этого "НЕобновления" проделать этот момент SendCommand(2002).

Когда, для этого же торрента, благополучно проходит обновление противоположной панели, то и SendCommand(2002) нормально выполняется, выделенной оказывается главная папка с именем торрента.
Толи фокус на главное окно TC не успевает через раз вернуться, не понятно.

Для ручного обновления достаточно также просто нажать на букву диска в панели выбора дисков TC.

Костыль, куда-то с повторной командой обновить панель или перерисовать окно TC временно может можно соорудить в конце 70501 и 70504?

Это НЕобновление панели у меня точно при отключенном dbg, проверю еще если активировать его как будет. Если и с ним проблема, откачусь на предыдущую версию, там про эту проблему и не знал. Потому как по-крайней мере с неактивированным dbg это у меня происходит минимум в 50% случаев поиска.
Ответить