У вас есть проблемы напоминаний в MLO-Android? Ответьте: Да/Нет.

[RFC] Дизайн-идея: Интеллектуальная синхронизация

Какие новые функции Вы хотели бы увидеть в MLO для ПК?
Автор темы

dmitriylost
Сообщения: 24
Зарегистрирован: июн 2009

[RFC] Дизайн-идея: Интеллектуальная синхронизация

Сообщение dmitriylost » 22 мар 2011, 09:01

Хотелось бы увидеть в MLO боле развитые встроенные средства синхронизации. Уж слишком, мне кажется, "дешево и сердито" то, что есть сейчас: ручная синхронизация через F9 и полуавтоматическая через параметр командной строки '-quicksync'.

Каким представляется алгоритм работы синхронизации:
- MLO отслеживает изменения локального файла и отражает их в файле на удаленном ПК/FTP/Облаке;
- MLO отслеживает изменения файла на удаленном ПК/FTP/Облаке и переносит их в локальный файл.

Я попытался реализовать такой сценарий с помощью скрипта Autohotkey. Работает он следующим образом: через 5 минут после запуска компьютера (включение или выход из ждущего/спящего режима) выполняется синхронизация, затем отслеживается сохранение (т. е. запись на диск) файла с данными. Если было сохранение - запускается процедура синхронизации.

Скрипт прилагается, для работы нужен Autohotkey http://www.autohotkey.com/

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

; based on: http://www.autohotkey.com/forum/topic7213.html
;           http://www.autohotkey.com/forum/topic21697.html

#Persistent

OnExit, HandleExit

MLO_EXE_PATH := "D:\opt\MLO\mlo.exe"
MLO_DATA_PATH := "D:\opt\MLO\mymlo"
MLO_DATA_FILE := "mlo.ml"

TIMEOUT_INTERVAL := 500               ; ms
SYNC_INTERVAL := 5*60*1000           ; ms

counter := 0
pwr_event := 1

; Listen to the Windows power event "WM_POWERBROADCAST" (ID: 0x218):
OnMessage(0x218, "func_WM_POWERBROADCAST")

handle := DllCall( "FindFirstChangeNotification", "str", MLO_DATA_PATH, "int", 0, "uint", 0x10 )
if ( ErrorLevel or handle = -1 )
{
  MsgBox, [FindFirstChangeNotification] failed: EL = %ErrorLevel% ~ handle = %handle%
  return
}

loop {
  result := DllCall( "WaitForSingleObject", "uint", handle, "uint", TIMEOUT_INTERVAL )

  if(result = 0)                      ; WAIT_IO_COMPLETION
  {
    ;MsgBox, change has been detected: LAST_WRITE
    mlo_quicksync()
  } else if (result = 0x102)          ; WAIT_TIMEOUT
  {
    if(pwr_event != 0)
    {
      counter += 1
      if (counter = SYNC_INTERVAL/TIMEOUT_INTERVAL)
      {
        counter = 0
   pwr_event = 0
        mlo_quicksync()
      }
    }
  } else if (result = 0xffffffff)     ; WAIT_FAILED
  {
    MsgBox, [WaitForSingleObject] failed: EL = %ErrorLevel% ~ result = %result%
    return
  }

  DllCall( "FindNextChangeNotification", "uint", handle )
}

return

HandleExit:
  DllCall( "FindCloseChangeNotification", "uint", handle )
ExitApp

mlo_quicksync()
{
  global
  RunWait, %MLO_EXE_PATH% %MLO_DATA_PATH%\%MLO_DATA_FILE% -quicksync -console
}

func_WM_POWERBROADCAST(wParam, lParam)
{
  global

  ; PBT_APMRESUMESUSPEND oder PBT_APMRESUMESTANDBY? -> System wakes up
  If (wParam = 7 OR wParam = 8)
    pwr_event = 1
}

AlexXF
Сообщения: 72
Зарегистрирован: май 2010

Re: [RFC] Дизайн-идея: Интеллектуальная синхронизация

Сообщение AlexXF » 29 мар 2011, 13:06

Я модифицировал данный скрипт и внес такие коррективы:

+ Если компьютер простаивает 30 секунд, то проверяется - есть ли не сохраненный/модифицированый файл. Если таковой имеется, то выполняется синхронизация в клауд
+ Если компьютер простаивает более 10 минут, то выполняется синхронизация с клаудом

Теперь я могу быть уверен, выйдя из дома, что у меня база синхронизирована (или синхронизируется через 10 минут).

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

; based on: http://www.autohotkey.com/forum/topic7213.html
;           http://www.autohotkey.com/forum/topic21697.html

#Persistent
DetectHiddenWindows, On
OnExit, HandleExit

MLO_EXE_PATH := "C:\Program Files\MyLifeOrganized.net\MLO\mlo.exe"
MLO_DATA_PATH := "E:\My Documents\My Dropbox\MLO"
MLO_DATA_FILE := "MyTasks.ml"

IDDLE_INTERVAL := 30*1000               ; ms
AUTOSYNC_INTERVAL := 10*60*1000      ; ms

pwr_event := 1
start_time := A_TickCount
event_time := 0

; Listen to the Windows power event "WM_POWERBROADCAST" (ID: 0x218):
OnMessage(0x218, "func_WM_POWERBROADCAST")

handle := DllCall( "FindFirstChangeNotification", "str", MLO_DATA_PATH, "int", 0, "uint", 0x10 )
if ( ErrorLevel or handle = -1 )
{
  MsgBox, [FindFirstChangeNotification] failed: EL = %ErrorLevel% ~ handle = %handle%
  return
}

;start timer
SetTimer check_iddle, %IDDLE_INTERVAL%
return


HandleExit:
  DllCall( "FindCloseChangeNotification", "uint", handle )
ExitApp

check_iddle:
   mlo_check_iddle()
return

mlo_check_iddle()
{
  global
  if(A_TimeIdlePhysical < IDDLE_INTERVAL)
  {
   start_time := A_TickCount
   return
  }
  result := DllCall( "WaitForSingleObject", "uint", handle, "uint", 100)

  if(result = 0)                      ; WAIT_IO_COMPLETION
  {
;MsgBox, file changed ...
        mlo_syncfile()
     DllCall( "FindNextChangeNotification", "uint", handle )
   result := DllCall( "WaitForSingleObject", "uint", handle, "uint", 500)
   start_time := A_TickCount

  } else if (result = 0x102)          ; WAIT_TIMEOUT
  {
      mlo_save()

  } else if (result = 0xffffffff)     ; WAIT_FAILED
  {
    MsgBox, [WaitForSingleObject] failed: EL = %ErrorLevel% ~ result = %result%
    return
  }

  DllCall( "FindNextChangeNotification", "uint", handle )

}

mlo_save()
{
  global
   IfWinExist, %MLO_DATA_FILE% - MyLife Organized *
   {
          IfWinActive, %MLO_DATA_FILE% - MyLife Organized *
      {
          Send, ^s
          Sleep, 500
;MsgBox, Save file ...
               mlo_quicksync()
          return
      }else{

      WinShow, %MLO_DATA_FILE% - MyLife Organized
      WinActivate, %MLO_DATA_FILE% - MyLife Organized
      Send, ^s
      Sleep, 500
;MsgBox, Save hidden..
           mlo_quicksync()
      WinHide, %MLO_DATA_FILE% - MyLife Organized
      return
      }
   }else{
      event_time := A_TickCount - start_time
      if( event_time > AUTOSYNC_INTERVAL)
      {
         mlo_quicksync()
         start_time := A_TickCount
      }
   }
}

mlo_syncfile()
{
   global
   IfWinExist, %MLO_DATA_FILE% - MyLife Organized *
   {
      mlo_save()
   }else{
      mlo_quicksync()
   }
}

mlo_quicksync()
{
  global
   If WinExist("ahk_class TfrmProgressIndicatorWnd")
   {
     return

   }else{

   IfWinExist, %MLO_DATA_FILE% - MyLife Organized
   {
          IfWinActive, %MLO_DATA_FILE% - MyLife Organized
      {
          Send, {F9}
          Sleep, 1000
;MsgBox, Sync active..
          while(WinExist("ahk_class TfrmProgressIndicatorWnd"))
          {
         Sleep, 500
          }
          return
      }else{

      WinShow, %MLO_DATA_FILE% - MyLife Organized
      WinActivate, %MLO_DATA_FILE% - MyLife Organized
      Send, {F9}
      Sleep, 1000
;MsgBox, Sync hidden..
      while(WinExist("ahk_class TfrmProgressIndicatorWnd"))
      {
         Sleep, 500
      }
      WinHide, %MLO_DATA_FILE% - MyLife Organized
      return
      }
   }else{

;MsgBox, Sync File..

   RunWait, %MLO_EXE_PATH% "%MLO_DATA_PATH%\%MLO_DATA_FILE%" -quicksync -console
   }

   }
}

func_WM_POWERBROADCAST(wParam, lParam)
{
  global

  ; PBT_APMRESUMESUSPEND oder PBT_APMRESUMESTANDBY? -> System wakes up
  If (wParam = 7 OR wParam = 8)
    pwr_event = 1
}


Вернуться в «Предложения по улучшению»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 15 гостей