diff --git a/README.md b/README.md index 077983b..6ec352b 100644 --- a/README.md +++ b/README.md @@ -39,33 +39,33 @@ autoPriority.exe -dry-run ## Журнал -События одного скана выводятся боксом во временной папке Windows: **`%TEMP%\autopriority.log`**. При каждом запуске файл очищается. Шапка подгоняется под самую длинную строку. Порядок групп строгий: PROMOTE -> DEMOTE -> SKIP -> BLOCK. Пустой скан ничего не пишет. +События одного скана выводятся боксом во временной папке Windows: **`%TEMP%\autopriority.log`**. При каждом запуске файл очищается. Шапка подгоняется под самую длинную строку. Порядок групп строгий: ПРИОРИТЕТ ПОВЫШЕН -> ПРИОРИТЕТ ПОНИЖЕН -> ОШИБКА ЧТЕНИЯ -> ОШИБКА ЗАПИСИ. Пустой скан ничего не пишет. ```text -┌─ 04.10.2026 19:33:39 ───────────────────────────────────────────────┐ -├ GAME MODE ON — EoCApp.exe (PID 6200) RSS=2.2GB, NORMAL -> HIGH │ -│ │ -├ DEMOTE │ -│ ├ Hermes.exe (PID 10220) RSS=166MB, ABOVE_NORMAL -> IDLE │ -│ └ librewolf.exe (PID 6216) RSS=524MB, HIGH -> IDLE │ -│ │ -├ SKIP │ -│ └ csrss.exe (PID 524): OpenProcess(524) failed: Access is denied. │ -│ │ -├ BLOCK │ -│ └ winlogon.exe (PID 792): OpenProcess(792) failed: Access is denied.│ -└─────────────────────────────────────────────────────────────────────┘ +┌─ 04.10.2026 20:19:15 ──────────────────────────────────────────────────┐ +├ ИГРОВОЙ РЕЖИМ ВКЛЮЧЁН — EoCApp.exe (PID 6200) RSS=2.2GB, NORMAL -> HIGH│ +│ │ +├ ПРИОРИТЕТ ПОНИЖЕН │ +│ ├ Hermes.exe (PID 10220) RSS=166MB, ABOVE_NORMAL -> IDLE │ +│ └ librewolf.exe (PID 6216) RSS=524MB, HIGH -> IDLE │ +│ │ +├ ОШИБКА ЧТЕНИЯ │ +│ └ csrss.exe (PID 524): OpenProcess(524) failed: Access is denied. │ +│ │ +├ ОШИБКА ЗАПИСИ │ +│ └ winlogon.exe (PID 792): OpenProcess(792) failed: Access is denied. │ +└────────────────────────────────────────────────────────────────────────┘ ``` -Триггер игрового режима не дублируется в PROMOTE: его исход уже вписан в строку `GAME MODE ON` (`NORMAL -> HIGH`, `уже HIGH` или `в блоклисте`). Выключение режима — секция `GAME MODE OFF — восстановление`, восстановленные процессы идут в PROMOTE/DEMOTE как обычно. +Триггер игрового режима не дублируется в повышении: его исход уже вписан в строку `ИГРОВОЙ РЕЖИМ ВКЛЮЧЁН` (`NORMAL -> HIGH`, `уже HIGH` или `в блоклисте`). Выключение режима — секция `ИГРОВОЙ РЕЖИМ ВЫКЛЮЧЁН — восстановление`, восстановленные процессы идут в повышении/понижении как обычно. -Запуск программы оформлен отдельным боксом START: +Запуск программы оформлен отдельным боксом ЗАПУСК: ```text ┌─ 04.10.2026 19:58:36 ──────────────────────────────────────────────┐ -├ START │ -│ ├ started (mem=512MB, game-mem=2.0GB, interval=1m0s, dry-run=false)│ -│ └ own priority set to IDLE │ +├ ЗАПУСК │ +│ ├ запущен (mem=512MB, game-mem=2.0GB, interval=1m0s, dry-run=false)│ +│ └ собственный приоритет: IDLE │ └────────────────────────────────────────────────────────────────────┘ ``` diff --git a/main.go b/main.go index 266676f..69e72cf 100644 --- a/main.go +++ b/main.go @@ -368,7 +368,7 @@ func (a *app) setPriority(p *procInfo, target uint32) error { return err } if created != p.Key.Created { - return fmt.Errorf("process instance changed; refusing to write") + return fmt.Errorf("экземпляр процесса сменился; запись отклонена") } return setPrio(h, p.PID, target) } @@ -472,17 +472,17 @@ func (a *app) failed(s *processState, target uint32, err error) { a.bufBlock = append(a.bufBlock, cleanDetail(detail)) return } - logf("BLOCK %s (повторов не будет)", detail) + logf("ОШИБКА ЗАПИСИ: %s (без повторов)", detail) } func actionName(hasGame bool, target uint32) string { if hasGame { - return "GAME" + return "ИГРОВОЙ РЕЖИМ" } if target == PriorityClassHigh { - return "PROMOTE" + return "ПРИОРИТЕТ ПОВЫШЕН" } - return "DEMOTE" + return "ПРИОРИТЕТ ПОНИЖЕН" } func (a *app) change(s *processState, target uint32, kind changeKind, hasGame bool) bool { @@ -505,7 +505,7 @@ func (a *app) change(s *processState, target uint32, kind changeKind, hasGame bo return true } if a.dryRun { - a.emitChange(hasGame, target, fmt.Sprintf("[DRY-RUN] %s (PID %d) RSS=%s, %s -> %s", + a.emitChange(hasGame, target, fmt.Sprintf("[ПРОБНЫЙ ЗАПУСК] %s (PID %d) RSS=%s, %s -> %s", s.info.Name, s.info.PID, formatMemSize(s.info.RSS), prioName(current), prioName(target))) return true @@ -647,7 +647,7 @@ func (a *app) emitPromote(detail string) { a.bufPromote = append(a.bufPromote, detail) return } - logf("PROMOTE %s", detail) + logf("ПРИОРИТЕТ ПОВЫШЕН: %s", detail) } func (a *app) emitDemote(detail string) { @@ -656,7 +656,7 @@ func (a *app) emitDemote(detail string) { a.bufDemote = append(a.bufDemote, detail) return } - logf("DEMOTE %s", detail) + logf("ПРИОРИТЕТ ПОНИЖЕН: %s", detail) } func (a *app) emitSkip(detail string) { @@ -665,7 +665,7 @@ func (a *app) emitSkip(detail string) { a.bufSkip = append(a.bufSkip, detail) return } - logf("SKIP %s (повторов не будет)", detail) + logf("ОШИБКА ЧТЕНИЯ: %s (без повторов)", detail) } func (a *app) emitBlock(detail string) { @@ -674,7 +674,7 @@ func (a *app) emitBlock(detail string) { a.bufBlock = append(a.bufBlock, detail) return } - logf("BLOCK %s (повторов не будет)", detail) + logf("ОШИБКА ЗАПИСИ: %s (без повторов)", detail) } func (a *app) emitChange(hasGame bool, target uint32, detail string) { @@ -700,7 +700,7 @@ func (a *app) emitChange(hasGame bool, target uint32, detail string) { } // flushScan выводит события одного скана одним боксом. -// Порядок групп строгий: PROMOTE -> DEMOTE -> SKIP -> BLOCK. +// Порядок групп строгий: повышение -> понижение -> ошибки чтения -> ошибки записи. type logGroup struct { name string rows []string @@ -755,10 +755,10 @@ func (a *app) flushScan() { head := a.gameHead a.gameHead = "" groups := []logGroup{ - {"PROMOTE", a.bufPromote}, - {"DEMOTE", a.bufDemote}, - {"SKIP", a.bufSkip}, - {"BLOCK", a.bufBlock}, + {"ПРИОРИТЕТ ПОВЫШЕН", a.bufPromote}, + {"ПРИОРИТЕТ ПОНИЖЕН", a.bufDemote}, + {"ОШИБКА ЧТЕНИЯ", a.bufSkip}, + {"ОШИБКА ЗАПИСИ", a.bufBlock}, } a.bufPromote, a.bufDemote, a.bufSkip, a.bufBlock = nil, nil, nil, nil renderBox(head, groups) @@ -792,7 +792,7 @@ func (a *app) scan() { defer a.flushScan() entries, err := allProcs() if err != nil { - logf("process scan error: %v", err) + logf("ошибка снимка процессов: %v", err) return } pids := make(map[uint32]bool, len(entries)) @@ -882,7 +882,7 @@ func (a *app) scan() { if !a.anyOverlay() { a.gameMode = false if !a.offAnnounced { - a.gameHead = "GAME MODE OFF — восстановление" + a.gameHead = "ИГРОВОЙ РЕЖИМ ВЫКЛЮЧЁН — восстановление" a.offAnnounced = true } } else { @@ -917,9 +917,9 @@ func (a *app) scan() { } if enteringGame { if len(a.triggerOutcomes) > 0 { - a.gameHead = "GAME MODE ON — " + strings.Join(a.triggerOutcomes, "; ") + a.gameHead = "ИГРОВОЙ РЕЖИМ ВКЛЮЧЁН — " + strings.Join(a.triggerOutcomes, "; ") } else { - a.gameHead = "GAME MODE ON" + a.gameHead = "ИГРОВОЙ РЕЖИМ ВКЛЮЧЁН" } } a.releaseUnused() @@ -988,7 +988,7 @@ func (a *app) shutdown() { } a.adoptInherited(live) } else { - logf("final scan error: %v", err) + logf("ошибка финального снимка: %v", err) } unrestored := 0 for _, s := range a.ordered() { @@ -1026,7 +1026,7 @@ func (a *app) shutdown() { } } if unrestored > 0 { - logf("warning: %d process priorities could not be restored", unrestored) + logf("предупреждение: не восстановлены приоритеты %d процессов", unrestored) } } for _, s := range a.states { @@ -1094,7 +1094,7 @@ func main() { fmt.Fprintln(logFile, s) } - startRows := []string{fmt.Sprintf("started (mem=%s, game-mem=%s, interval=%s, dry-run=%v)", + startRows := []string{fmt.Sprintf("запущен (mem=%s, game-mem=%s, interval=%s, dry-run=%v)", formatMemSize(mem), formatMemSize(gameMem), *interval, *dryRun)} if !*dryRun { @@ -1105,18 +1105,18 @@ func main() { closeH(h) } if err != nil { - startRows = append(startRows, fmt.Sprintf("warning: could not set own priority to IDLE: %v", err)) + startRows = append(startRows, fmt.Sprintf("предупреждение: не удалось установить собственный приоритет IDLE: %v", err)) } else { - startRows = append(startRows, "own priority set to IDLE") + startRows = append(startRows, "собственный приоритет: IDLE") } } - renderBox("", []logGroup{{"START", startRows}}) + renderBox("", []logGroup{{"ЗАПУСК", startRows}}) a := newApp(mem, gameMem, *dryRun) defer func() { a.shutdown() - logf("autoPriority stopped") + logf("autoPriority остановлен") logFile.Sync() }() @@ -1130,7 +1130,7 @@ func main() { for { select { case <-stop: - logf("received shutdown signal") + logf("получен сигнал завершения") return case <-ticker.C: a.scan()