PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   iCarDS (http://pccar.ru/forumdisplay.php?f=121)
-   -   iCarDS + Сон, Гибридный сон и Гибернация (http://pccar.ru/showthread.php?t=23331)

seriousstas 28.08.2015 02:50

Цитата:

Сообщение от Lexx09 (Сообщение 336659)
Если я правильно понял, ты хочешь закрывать сам iCarDS из скрипта, который встроен в iCarDS, и который срабатывает при входе в сон? Если да, то:
  1. Закрывать родительский процесс (iCarDS.exe) из дочернего (ahk- или autoit-скрипт) не совсем неправильно. Ведь неизвестно, что там еще iCarDS будет делать после запуска встроенного скрипта. Хотя с ahk-скриптом вроде работает...
  2. Функция Suspend срабатывает в тот момент, когда Windows перед сном рассылает специальное сообщение (PBT_APMSUSPEND) всем процессам в системе. Как реализована обработка этого сообщения в iCarDS - неизвестно. Разработчик практически не участвует в наших дискуссиях.
Для экспериментов - вот код всего скрипта для встраивания в iCarDS:
Код:

WinClose("iCar DS")

If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("iCarDS.exe")
EndIf


iCar DS гарантированно запускает скрипт при входе в сон , но
вопрос успеет-ли скрипт закрыть загруженный окнами Икар ,
поэтому и спросил за SUSPEND . Представляю это так :
по нажатию кнопки или повороте ключа Икар запускает скрипт
и посылается небольшая задержка системе для корректной выгрузки Икара .
Попробовал скрипт выше - работает ! :) Но опять-же у меня нет ни тяжелого Икара ни слабого железа для экспериментов , поэтому спрошу , можно-ли в этот скрипт добавить задержку системе в 2 секунды перед полным отключением питания ?

seriousstas 28.08.2015 04:16

sirota
Спасибо большое! Теперь есть примерная картинка работы Твоей системы ,
будет полезно тем, кто задумал апгрейд .

Krysanov 28.08.2015 05:07

Цитата:

Сообщение от Lexx09 (Сообщение 336653)
Смысл слежения за процессом iCarDS.exe вот в чем:
  • Если в течение заданного определенного времени, например, 3 сек, после выполнения команды WinClose("iCar DS") процесс iCarDS.exe все еще висит в памяти, то он принудительно завершается. Т.е. если iCarDS заглючил и подвис при закрытии, он будет принудительно убит, и только потом Windows уснет.
  • Если же iCarDS закрылся быстрее 3 сек, то скрипт сразу же начинает выполняться дальше, а не ждет истечения 3 сек. В результате - более быстрое наступление сна. :smile2:
Функция Suspend будет такая:
Код:

; Вход в спящий режим
Func Suspend()

    ; Закрываем iCarDS
    WinClose("iCar DS")

    ; Закрываем программу по коннекту интернета
    ;WinClose("SP Dialer")

    ; Закрываем GpsGate
    WinClose("Franson GpsGate")

    ; Закрываем BlueStacks
    ShellExecute("C:\Program Files (x86)\BlueStacks\HD-Quit.exe")

    If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("iCarDS.exe")
    EndIfп

EndFunc

Цифра 3 в команде ProcessWaitClose - это и есть количество секунд ожидания завершения iCarDS до принудительного убития. В принципе, можно и 10 сек поставить, все равно такая пауза будет только тогда, когда iCarDS зависнет.

В варианте просто с паузой скрипт по любому будет ждать 3 сек, даже, если iCarDS закрылся за 1 сек. А если iCarDS заглючил, то при выходе из сна глюки продолжатся.

О, спасибо, очень понятно и полезно

Krysanov 28.08.2015 06:40

Lexx09 :bye:
Есть, например, три чувствительные ко сну программы...."iCar DS", "SP Dialer.exe" и "Franson GpsGate"

Функция Suspend будет такая?:

Код:

; Вход в спящий режим
Func Suspend()

    ; Закрываем iCarDS
    WinClose("iCar DS")

    ; Закрываем программу по коннекту интернета
    ;WinClose("SP Dialer")

    ; Закрываем GpsGate
    WinClose("Franson GpsGate")

 
    If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("iCarDS.exe")
    EndIf

 If (ProcessWaitClose("SP Dialer.exe", 3) == 0) Then
        ProcessClose("SP Dialer.exe")
    EndIf
 If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("Franson GpsGate")
    EndIf

EndFunc

или так ?

Код:

; Вход в спящий режим
Func Suspend()

    ; Закрываем iCarDS
    WinClose("iCar DS")

    ; Закрываем программу по коннекту интернета
    ;WinClose("SP Dialer")

    ; Закрываем GpsGate
    WinClose("Franson GpsGate")

 
    If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("iCarDS.exe")
 
 If (ProcessWaitClose("SP Dialer.exe", 3) == 0) Then
        ProcessClose("SP Dialer.exe")
   
 If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("Franson GpsGate")
   
EndIf

EndFunc


Игорь_К 28.08.2015 09:11

У меня почему то при конвертировании скрипта из au3 в exe выдает ошибку со строкой #include (win8.1 x32)

Krysanov 28.08.2015 10:58

Цитата:

Сообщение от Игорь_К (Сообщение 336676)
У меня почему то при конвертировании скрипта из au3 в exe выдает ошибку со строкой #include (win8.1 x32)

В самом верху кода написано для 64 бит
Код:

#pragma compile(Icon, "C:\Program Files (x86)\AutoIt3\Icons\au3script_v9.ico")
у тебя есть такая папка Program Files (x86)? Если нет (не помню уже:no:), то подправь верхнюю строчку на
Код:

#pragma compile(Icon, "C:\Program Files\AutoIt3\Icons\au3script_v9.ico")

Lexx09 28.08.2015 11:24

Цитата:

Сообщение от seriousstas (Сообщение 336664)
iCar DS гарантированно запускает скрипт при входе в сон , но
вопрос успеет-ли скрипт закрыть загруженный окнами Икар ,
поэтому и спросил за SUSPEND . Представляю это так :
по нажатию кнопки или повороте ключа Икар запускает скрипт
и посылается небольшая задержка системе для корректной выгрузки Икара .
Попробовал скрипт выше - работает ! :) Но опять-же у меня нет ни тяжелого Икара ни слабого железа для экспериментов , поэтому спрошу , можно-ли в этот скрипт добавить задержку системе в 2 секунды перед полным отключением питания ?

Добавление паузы в скрипт ничего не даст, т.к. iCarDS не ждет завершения работы встроенных скриптов. Только что проверил. К тому же iCarDS завершается из встроенного скрипта.

Чтобы задержать уход Windows в сон - нужна отдельная постоянно запущенная программа, отслеживающая переход в сон. Например, для Windows 7 и ниже, такая:
Код:

#include

Global $PBT_APMSUSPEND = 0x0004

$hGUI = GUICreate("StandbyWait", 100, 100, 1, 1)
GUIRegisterMsg($WM_POWERBROADCAST, "Standby")

While 1
    Sleep(100)
WEnd

Func Standby($hWnd, $Msg, $wParam, $lParam)
    Select
        ; Вход в спящий режим
        Case $wParam = $PBT_APMSUSPEND
            Suspend()
        Case Else
    EndSelect
EndFunc

; Вход в спящий режим
Func Suspend()
        Sleep(5000)
EndFunc


Lexx09 28.08.2015 11:29

Цитата:

Сообщение от Krysanov (Сообщение 336669)
Lexx09 :bye:
Есть, например, три чувствительные ко сну программы...."iCar DS", "SP Dialer.exe" и "Franson GpsGate"

Функция Suspend будет такая?:

Код:

; Вход в спящий режим
Func Suspend()

    ; Закрываем iCarDS
    WinClose("iCar DS")

    ; Закрываем программу по коннекту интернета
    ;WinClose("SP Dialer")

    ; Закрываем GpsGate
    WinClose("Franson GpsGate")

 
    If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("iCarDS.exe")
    EndIf

 If (ProcessWaitClose("SP Dialer.exe", 3) == 0) Then
        ProcessClose("SP Dialer.exe")
    EndIf
 If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("Franson GpsGate")
    EndIf

EndFunc

или так ?

Код:

; Вход в спящий режим
Func Suspend()

    ; Закрываем iCarDS
    WinClose("iCar DS")

    ; Закрываем программу по коннекту интернета
    ;WinClose("SP Dialer")

    ; Закрываем GpsGate
    WinClose("Franson GpsGate")

 
    If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("iCarDS.exe")
 
 If (ProcessWaitClose("SP Dialer.exe", 3) == 0) Then
        ProcessClose("SP Dialer.exe")
   
 If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("Franson GpsGate")
   
EndIf

EndFunc


Оба варианта неправильные.

Должно быть так:
Код:

; Вход в спящий режим
Func Suspend()

    ; Закрываем iCarDS
    WinClose("iCar DS")

    ; Закрываем программу по коннекту интернета
    WinClose("SP Dialer")

    ; Закрываем GpsGate
    WinClose("Franson GpsGate")
 
    If (ProcessWaitClose("iCarDS.exe", 3) == 0) Then
        ProcessClose("iCarDS.exe")
    EndIf
 
    If (ProcessWaitClose("SP Dialer.exe", 3) == 0) Then
        ProcessClose("SP Dialer.exe")
    EndIf
   
    If (ProcessWaitClose("GpsGateXP.exe", 3) == 0) Then
        ProcessClose("GpsGateXP.exe")
    EndIf

EndFunc


Игорь_К 28.08.2015 11:30

Цитата:

Сообщение от Krysanov (Сообщение 336686)
В самом верху кода написано для 64 бит
Код:

#pragma compile(Icon, "C:\Program Files (x86)\AutoIt3\Icons\au3script_v9.ico")
у тебя есть такая папка Program Files (x86)? Если нет (не помню уже:no:), то подправь верхнюю строчку на
Код:

#pragma compile(Icon, "C:\Program Files\AutoIt3\Icons\au3script_v9.ico")

В том и загвоздка что все пути поправлены под мою систему

seriousstas 28.08.2015 11:36

Цитата:

Сообщение от Lexx09 (Сообщение 336689)
Добавление паузы в скрипт ничего не даст, т.к. iCarDS не ждет завершения работы встроенных скриптов. Только что проверил. К тому же iCarDS завершается из встроенного скрипта.

Чтобы задержать уход Windows в сон - нужна отдельная постоянно запущенная программа, отслеживающая переход в сон. Например, такая:

Ясно , так и думал , ещё думал, что можно где-то поправить реестр или распаковать iCarMainScript.exe(хотя с последними версиями это наверняка не возможно) и сунуть туда :)


Часовой пояс GMT +4, время: 22:03.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot