Рестарт/перезапуск TC

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

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

Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
Попробовал последний вариант. Кнопка (скрипт с параметром) работает нормально. Но точно такая же юзер-команда вызывает размножение окон TC. В чём может быть дело? Пока использую предыдущую версию, там у меня вроде как всё OK.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada
Так происходит при вызове с хоткея (Какого?) или и с кнопки с юзеркомандой тоже?
Под размножением окон ты подразумеваешь зацикливание создания экземпляров?
На чистом ТС без плагинов подобное наблюдается?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
И с кнопки с юзер-командой, и при её запуске из командной строки TC, и хотееем для неё, без разницы. А с экземплярами там не зацикливание, а именно приращение. Допустим, у меня единственный 32-битный экземпляр без номера в заголовке. Выполняется команда. Открывается второе окно для 64-битного TC с (2) в заголовке. Выполняем в нём команду. 32-битная версия теперь открывается в третьем окне при сохранении прежних окон... и так далее. На чистом TC (только с юзер-командами) — та же история.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada
Т.е. ты просто хочешь сказать, что исходный экземпляр не закрывается? С учётом ProcessWaitClose(WinGetProcess($hWnd)) это довольно странная история, т.к. до открытия нового скрипт должен ждать бесконечно долго, пока не завершится процесс ТС. И только лишь с добавкой двух завершающих в условии элементов активации окна в этой части измениться ничего точно не могло. Либо ты слукавил насчёт последней редакции (дописка была и в предыдущем варианте без шапки).
И речь сейчас идёт только про скомпилированный случай? Или с актуальным AutoIt3.exe та же история? Компилятор Aut2exe.exe тоже актуальный?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
Да, исходный экземпляр не закрывался. Но там, как выяснилось, результаты менялись несколько раз по непонятным причинам. Поэтому сегодня всё протестировал заново на той машине, где AutoIt3.exe и Aut2exe.exe использованы заведомо актуальные. Всё работает отовсюду, в том числе и в варианте c EXE. Видимо, на этом проблему можно считать закрытой.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada
Ну, и отлично. Так и думал, что дело в версии.

Сделал активацию ещё более стабильной.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

http://forum.wincmd.ru/viewpost.php?p=129148

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

Opt("WinWaitDelay", 0)
Бессмысленное число, только процессор тр... теребить, 100 с головой хватит.

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

  WinWaitActive("[CLASS:TTOTAL_CMD]")
  $WSS = ObjCreate('WScript.Shell')
  $WSS.AppActivate($PID)
???
И проще $PID проверить, прежде чем снова теребить, окно не появится быстрее, если искать его в несколько раз чаще.
WinWaitActive() чаще используют если что-то запустили и теперь ждут евонное окно.

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

#NoTrayIcon
Opt("WinWaitDelay", 100)
Local $hWnd = WinGetHandle("[CLASS:TTOTAL_CMD]")
If $hWnd Then
  Local $TC = $CmdLine[1], $PFix = '', $n = 4
  WinClose($hWnd)
  ProcessWaitClose(WinGetProcess($hWnd))
  If @OSArch <> 'x86' Then
    If StringRight($TC, 6) = '64.EXE' Then
      $n = 6
    Else
      $PFix = '64'
    EndIf
  EndIf
  Local $PID = Run(StringLeft($TC, StringLen($TC) - $n) & $PFix & '.EXE')
  If $PID <> 0 Then
    $hWnd = WinWait("[CLASS:TTOTAL_CMD]")
    WinActivate($hWnd)
  EndIf
EndIf
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Skif_off писал(а):только процессор тр... теребить
От несколько миллисекунд ему хуже не станет. Это не проблема. Хотя всегда брал 40, пусть и тут будет.
Skif_off писал(а):И проще $PID проверить, прежде чем снова теребить
Что значит "снова"? Вопрос не в простоте, а в надёжности. В случае возврата 0-ля активации не будет. Логика.
WinActivate(WinWait("[CLASS:TTOTAL_CMD]")) при нескольких экземплярах не годится.
Что делает WinWaitActive я в курсе.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Flasher писал(а):От несколько миллисекунд ему хуже не станет. Это не проблема.
Если окно появляется через 200 мс после запуска, то к чему, грубо говоря, две сотни раз его искать вместо 2-3х?
Flasher писал(а):Вопрос не в простоте, а в надёжности. В случае возврата 0-ля активации не будет. Логика.
В случае возврата 0-ля активация и не нужна: это значит, что функция Run() не сработала и не вернула PID процесса - активировать нечего.
Flasher писал(а):WinActivate(WinWait("[CLASS:TTOTAL_CMD]")) при нескольких экземплярах не годится.
WinWaitActive("[CLASS:TTOTAL_CMD]") при нескольких экземплярах тоже не годится, например, в другой копии любое окно с флагом MB_SYSTEMMODAL или с указанным родительским активирует её. Активность окна в любом случае не самый удачный признак нужного (в начале скрипта при получении дескриптора для WM_CLOSE тоже).
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Skif_off писал(а):то к чему, грубо говоря, две сотни раз его искать вместо 2-3х?
2 сотни с потолка взято, я так понимаю?
Skif_off писал(а):это значит, что функция Run() не сработала
Ничего подобного. Это вполне может значить, что она не успела получить PID.
WinWaitActive годится, т.к. ждёт активации, а не уже активного окна. И модальность тут за уши притягивать смысла нет, т.к. закрывался активный экземпляр. Плюс мне было на чём проверять, это не чьи-то домыслы, а подтверждено на практике.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Flasher писал(а):2 сотни с потолка взято, я так понимаю?
Ты "грубо говоря" забыл зацепить.
Flasher писал(а):Ничего подобного. Это вполне может значить, что она не успела получить PID.
Т.е. процесс создан, во всю рисует окно, а у тебя PID всё ещё не получен? Загугли описание CreateProcess, оно везде одинаковое:
Return Value

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. ...
Note that the function returns before the process has finished initialization.
Flasher писал(а):WinWaitActive годится, т.к. ждёт активации, а не уже активного окна. И модальность тут за уши притягивать смысла нет, т.к. закрывался активный экземпляр. Плюс мне было на чём проверять, это не чьи-то домыслы, а подтверждено на практике.
Годится, если активным не успело вылезти окно другой копии, модальность тут - пример причины, когда это происходит без участия и желания пользователя.
Ну а на моей практике с двумя и более копиями (не только тестов, но просто использования) неприлично часто бывало, что не то окно закрыто или не то активировано. Ты ведь не думаешь, что от нечего делать у себя получаю PID родительской копии TC вместо поиска активного окна?

P.S. К слову, с COM-объектами могут быть сюрпризы в WinPE.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Skif_off
У меня, честно говоря, нет желания тебе разжёвывать всё (невозврат PID, наличие окна другого экземпляра следом за текущим, COM на WinPE), что давно и перед обновлением пройдено мной на практике в разных ипостасях. Я этот скрипт не для себя писал. Мне это обсуждение в рамках темы малоинтересно.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить