1 (изменено: Foma, 2014-11-01 16:51:56)

Тема: AHK: Передача данных через общую папку в локальной сети

Наладил передачу данных из одного скрипта на компьютере 1 в скрипт на компьютере 2 через общую папку в локальной сети.
   На 1 создаётся файл с нужной информацией, на 2 этот файл читается и удаляется. Считал, что сработать должно очень быстро. Рассчитывал, что при скорости в локальной сети в мегабиты в секунду, время реакции будет в десятые доли секунды.
      Оказалось, что всё совсем не так. Для теста стал создавать файл из 1 каждые 3 секунды. И вот так искал его с 2:

#Persistent
settimer,Timer2,1

Return


Timer2:
settimer,Timer2,Off
IfExist,...общая папка локальной сети...\1.txt    
    {
    Time := A_TickCount - mem
    mem := A_TickCount
    FileAppend,%Time%`n,2.txt
    FileDelete,...общая папка локальной сети...\1.txt    
    Sleep, 1000
    }
settimer,Timer2,On    
Return

Паузы между обнаружениями нового файла из 2 получаются в миллисекундах вот такими:

7005
3026
1981
6225
6895
3011
1981
7004
6100
3011
1997
6131
6910
3074
2043
7005
3010
2013

   Пробовал менять приоритет скрипта обнаружения. Не помогает.
Как можно добиться более быстрой реакции?
Может существует более быстрый способ передачи информации до 1КБ из 1 в 2?

2

Re: AHK: Передача данных через общую папку в локальной сети

Ознакомься с этой темой.

3

Re: AHK: Передача данных через общую папку в локальной сети

Длинные паузы - скорее всего из-за особенностей работы оповещателя службы "общие папки". Победить вряд ли удастся.
А зачем Вы всё время удаляете файл, создаёте новый и проверяете его наличие? Просто изменяйте старый файл и ставьте в нём отметку времени. Второй компьютер увидит, что файл "свежий" и обработает информацию. А если файл "старый", проигнорирует информацию.

Есть ещё передача данных по TCP/IP - поищите по форуму. Но с этим скорее всего возникнут трудности. На англоязычном форуме гораздо больше идей на эту тему, но там понадобится переводить и вникать.

4

Re: AHK: Передача данных через общую папку в локальной сети

ypppu пишет:

Длинные паузы - скорее всего из-за особенностей работы оповещателя службы "общие папки". Победить вряд ли удастся.

  Очень печально. Не думал, что задержки будут до 4 секунд на пустом месте. Нельзя всё-таки как-то ускорить? Я, например, проводил такой эксперимент. Создавал файл в этой же папке, расположенной физически на компьютере 1, из  компьютера 2, где работает скрипт обнаружения. Изменения происходили мгновенно и скрипт обнаружения срабатывал тоже сразу же. Как влияет такая "инициализация" не ясно. Может можно как-то инициировать службу оповещателя  производя непрерывно какие-то действия в этой папке из компьютера 2?

А зачем Вы всё время удаляете файл, создаёте новый и проверяете его наличие? Просто изменяйте старый файл и ставьте в нём отметку времени. Второй компьютер увидит, что файл "свежий" и обработает информацию. А если файл "старый", проигнорирует информацию.

    Первая причина - не очень хочется, чтобы этот файл долгое время "светился" в системе. Почему так,  я хотел бы умолчать. Вторая причина, я не знаю как можно обновить файл не удаляя его, кроме как дописывая через FileAppend. Не хочется увеличивать объём файла и время его чтения. А разве можно как-то иначе его менять? И будет ли при этом способе обнаруживаться изменения быстрее, чем обнаруживается само наличие файла?


Есть ещё передача данных по TCP/IP - поищите по форуму. Но с этим скорее всего возникнут трудности. На англоязычном форуме гораздо больше идей на эту тему, но там понадобится переводить и вникать.

    С английским не справлюсь, к сожалению.

5

Re: AHK: Передача данных через общую папку в локальной сети

Irbis пишет:

Ознакомься с этой темой.

   Много информации, не всё понял. Этот метод не будет зависеть от пауз в работе оповещателя службы "общие папки"?

6

Re: AHK: Передача данных через общую папку в локальной сети

Скорее всего, будет. Но проверить стоит, код из поста #15 достаточно прозрачен. По крайней мере видно, куда путь к общей папке подставить )

7

Re: AHK: Передача данных через общую папку в локальной сети

Irbis пишет:

Скорее всего, будет. Но проверить стоит, код из поста #15 достаточно прозрачен. По крайней мере видно, куда путь к общей папке подставить )

  Спасибо, попробую. Я думал, что этот код не годится, там столько раз всё менялось после него.

8 (изменено: ypppu, 2015-04-07 15:02:01)

Re: AHK: Передача данных через общую папку в локальной сети

AHK: Отправка сообщений в порт
AHK: Портовый приёмник
AHK: Прослушивание сетевых пакетов, реагирование на получение пакета
AHK: Синхронизация посылания клавиш на удалённом и локальном компьютер

9 (изменено: Foma, 2014-11-02 12:40:16)

Re: AHK: Передача данных через общую папку в локальной сети

Irbis пишет:

Скорее всего, будет. Но проверить стоит, код из поста #15 достаточно прозрачен. По крайней мере видно, куда путь к общей папке подставить )


  У меня никак не реагирует на появление и переименование файлов в общей папке.
Из 21 работает. Как именно, напишу позже.

10 (изменено: Foma, 2014-11-02 13:19:56)

Re: AHK: Передача данных через общую папку в локальной сети

Тест показал, что скрипт работает без задержек. По крайней мере на глаз они абсолютно не заметны. Точнее отследить не удалось, поскольку многие команды просто не срабатывают внутри этого кода:

while DllCall("WaitForSingleObject", "int", x, "int", INFINITE, "Cdecl int") = 0
    {
    Time := A_TickCount - mem
    mem := A_TickCount
    FileAppend,%Time%`n,2.txt
    FileDelete,общая папка\1.txt    
    ToolTip,: %A_TickCount%

    DllCall("FindNextChangeNotification", "int", x, "Cdecl int")
    }

Запись не производится, ToolTip выводится, но всё время с одним и тем же значением - первоначальным.  Как это можно исправить?

  И gosub тоже не работает.

11 (изменено: Foma, 2014-11-03 14:12:32)

Re: AHK: Передача данных через общую папку в локальной сети

Не могу разобраться с

dir =  ; указать директорию для мониторинга без кавычек
 
OnExit, Exit
 
Script =
(
   #NoTrayIcon
   dir = %dir%
   FILE_NOTIFY_CHANGE_FILE_NAME :=  1            ; любые изменения связанные с именами файлов
   INFINITE                     := -1            ; неограниченное время ожидания
    
   x:=DllCall("FindFirstChangeNotification" . (A_IsUnicode ? "W" : "A")
      , "str", dir, "int", 0, "int", FILE_NOTIFY_CHANGE_FILE_NAME, "Cdecl int")
   while DllCall("WaitForSingleObject", "int", x, "int", INFINITE, "Cdecl int") = 0
   {
      MsgBox 4, , Был создан, удалён или переименован какой-то файл``nВы хотите продолжить мониторинг?
      IfMsgBox, No, break
      DllCall("FindNextChangeNotification", "int", x, "Cdecl int")
   }
   x:=DllCall("FindCloseChangeNotification", "int", x)
)
 
FileDelete, %A_Temp%\Viewer.ahk
FileAppend, % Script, %A_Temp%\Viewer.ahk, % A_IsUnicode ? "UTF-8" : ""
Run, "%A_AhkPath%" "%A_Temp%\Viewer.ahk",,, PID
Return
 
Exit:
   FileDelete, %A_Temp%\Viewer.ahk
   Process, Close, %PID%
   ExitApp
 
F11:: ExitApp

.
  Есть у кого-то мысли, как можно наладить с помощью этого метода мониторинг папки или файла?

12

Re: AHK: Передача данных через общую папку в локальной сети

Сейчас просто при обнаружении изменений отправляю сочетание клавиш, на которое реагирует другой скрипт, который пытается читать обнаруженный файл. И он его не читает, поскольку не видит, как и раньше.
   Что можно сделать?

13

Re: AHK: Передача данных через общую папку в локальной сети

Foma пишет:

я не знаю как можно обновить файл не удаляя его, кроме как дописывая через FileAppend. Не хочется увеличивать объём файла и время его чтения. А разве можно как-то иначе его менять? И будет ли при этом способе обнаруживаться изменения быстрее, чем обнаруживается само наличие файла?

Вообще-то менять только так и можно - удалить старый, затем записать новый с таким же именем. Суть моего предложения - не проверять существование файла. Просто периодически выполняйте FileRead и проверяйте ErrorLevel.

14 (изменено: Foma, 2014-11-03 15:56:16)

Re: AHK: Передача данных через общую папку в локальной сети

Сам по себе FileRead работает с такими же задержками как и ifExit. А в сочетании с вышеприложенным кодом пока нормально наладить не получилось.

И ещё. Я не уверен, что при частых чтениях FileRead не случится такое, что прочитается часть из необходимого текста пока файл ещё пишется. Этого категорически хотелось бы избежать. Есть надежда, что проверка наличия с последующим чтением увеличивает временной интервал настолько, что шанс попасть в описанную ситуацию значительно уменьшается. Не знаю насколько ситуация отличается от моих представлений о ней.

15

Re: AHK: Передача данных через общую папку в локальной сети

Я не уверен, что при частых чтениях FileRead не случится такое, что прочитается часть из необходимого текста пока файл ещё пишется.

По идее, пока файл пишется, он недоступен для чтения. Об этом подскажет ErrorLevel.

Сам по себе FileRead работает с такими же задержками как и ifExit.

Тогда всё печальнее. Где-то на локальной сети слабое место, которое тормозит трафик. Перегруженный роутер или какой коммутатор с "поплывшими мозгами". Или тот компьютер, на котором создаётся файл, перегружен.

16

Re: AHK: Передача данных через общую папку в локальной сети

ypppu пишет:

Сам по себе FileRead работает с такими же задержками как и ifExit.

Тогда всё печальнее. Где-то на локальной сети слабое место, которое тормозит трафик. Перегруженный роутер или какой коммутатор с "поплывшими мозгами". Или тот компьютер, на котором создаётся файл, перегружен.

  Ещё интереснее. Я на втором компе вижу появление нового файла в проводнике практически сразу же. А скрипт его может обнаруживать как сразу же, так и через любой промежуток времени до четырёх секунд.


FileRead, если работает тот код, который приведен  выше, из поста 21 другой темы, срабатывает, насколько я понял, почти мгновенно. Не знаю как происходит эта "инициализация" системы, но это происходит.

  Пока скрипт тестирования не идеален, но похоже что всё именно так.

17

Re: AHK: Передача данных через общую папку в локальной сети

Можно попробовать подключить общую папку как диск.

18

Re: AHK: Передача данных через общую папку в локальной сети

Можно в сторону этой темы обратить внимание - AHKSock.
Как говорит автор, работоспособность проверялась и через LAN, и через интернет.

19

Re: AHK: Передача данных через общую папку в локальной сети

Irbis пишет:

Можно в сторону этой темы обратить внимание - AHKSock.
Как говорит автор, работоспособность проверялась и через LAN, и через интернет.

  Спасибо, попробую хоть что-то там понять.

20

Re: AHK: Передача данных через общую папку в локальной сети

Вариант с "обнаружителем" из #11 так и не смог приспособить. Если оттуда отсылать нажатие клавиш в отдельный скрипт, этот отдельный скрипт читает с такими же задержками, как и без этой хитрости. Читать изнутри цикла не получается: то срабатывает мгновенно, то вообще пропускает, половина команд не срабатывает.

21

Re: AHK: Передача данных через общую папку в локальной сети

В AHKSock разобраться не удалось. Вопрос по прежнему открыт.

22

Re: AHK: Передача данных через общую папку в локальной сети

Ещё раз обращаюсь к местным знатокам вот с такими уточнениями.
1.  Общая папка создана на компьютере 1.
2. Отсылать информацию нужно с 1 на 2.
3. Как только я на 1 в проводнике или из FileAppend создаю файл, он практически мгновенно отображается в проводнике на 2. Это значит, что информация передаётся своевременно и второй компьтер видит эти файлы СРАЗУ.
4. Код из #11 на втором компьютере видит эти изменения сразу.
    Почему ifExit и FileRead там же не видят того же самого в течение 1-5 секунд?

23

Re: AHK: Передача данных через общую папку в локальной сети

Добавление на 2 общей папки как диск,  не помогло.

Но корень проблемы найден. Не знаю по каким причинам, но мешало своевременному обнаружению или чтению файла его удаление или перемещение на 2. Когда поставил его удаление из 1 всё заработало стабильно.

Пока не знаю как согласовать действия по удалению из 1 после прочтения из 2 не пересылая данные назад, но это уже другой вопрос.

24

Re: AHK: Передача данных через общую папку в локальной сети

ifExit уже который раз пишете...
А если есть возможность пользоваться AHK, почему бы не установить какой-нибудь минималистичный чат?