Что нового

Запись в память и чтение из нее разными скриптами

maddoc

Новичок
Сообщения
48
Репутация
2
Добрый.
Хочу научить скрипты общаться между собой. Ака иногда нужно забрать управление , если это делают 2 одновременно скрипта, то происходит кака.
В данный момент научил их писать в файл свой статус, и остальные скрипты, ждут пока статус не станет Free.

Отлично работает при 2-3 скриптах. ПРи 7-10 все равно происходит путаница.

Думаю что запись не в файл, а в память, ускорит процесс. Но не соображу как писать в определенный адресс и читать потом из него "string"
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
А действительно ли вам нужны 7 запущенных скриптов? Что они делают-то.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
maddoc сказал(а):
В данный момент научил их писать в файл свой статус, и остальные скрипты, ждут пока статус не станет Free.

Специально для этого есть семафоры (Semaphore). Вот простой пример, для его запуска понадобиться библиотека WinAPEx. Также, для демонстрации того, как все это работает, я использовал функцию _NotifyBox(). Запусти несколько (7 :smile:) раз этот пример, растащи поудобнее все окна и далее, можешь закрывать окна, которые "перехватили управление" для освобождения процесса...

Код:
#NoTrayIcon

#Include <NotifyBox.au3>
#Include <WinAPIEx.au3>

$hSemaphore = _WinAPI_CreateSemaphore('MyUniqueName', 1, 1)

$hWnd = _NotifyBox(0, 'MyLog', 'Процесс занят другой программой. Жду...')

_WinAPI_WaitForSingleObject($hSemaphore)

ControlSetText($hWnd, '', 'Static1', 'Перехватил управление!')
WinWaitClose($hWnd)

_WinAPI_ReleaseSemaphore($hSemaphore)
_WinAPI_CloseHandle($hSemaphore)
 
Автор
M

maddoc

Новичок
Сообщения
48
Репутация
2
Спасибо, хороший вариант решения, но опять же сложный. Вплане у меня лично скрипт умирает ( зависает ) если ему приходится стоять в очереди больше 5 секунд.

Сделать как то короче возможно? Возможно ли читать и писать в 1 ячейку памяти всем скриптам?
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
OffTopic:
Yashied Спасибо, полезная иформация. +1 не ставится 24 ч.

А все-таки, возвращаясь к изначальному вопросу: возможно ли в AutoIt обращаться к участкам оперативной памяти (может по-средством того же WinApi?)? Т.е. использовать ее как буфер данных, доступный для нескольких потоков (использовать обычный буфер, как-то некрасиво)?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Можно писать в память другог процесса, но во-первых, вы непременно столкнетесь с проблемами прав доступа, а во-вторых, в любом случае, придется держать еще один пустой процесс в качестве сервера. Я думаю будет проще создать скрытое окно с одним единственным элементом Label, и все процессы будут читать/писать в него свой статус с помощью Control... функций. Но следует учесть, что между чтением из Label и записи туда состояния "Занто", другой процесс тоже может вклиниться, и снова получится каша.

P.S

Вот еще один способ итеракции процессов. Правда тоже не самый простой.

P.S.S

А еще можно тупо писать в реестр...

:smile:
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Yashied [?]
А еще можно тупо писать в реестр...

В реестре сорить по моему тоже не лучший вариант. А вот использовать GUI для коммуникации процессов замечательная идея (особенно на стадии отладки) - намедни я пришел к такому же выводу.:blum: И ни каких тебе заморочек с выделением памяти, забыванием ее очищать и т.п. :beer:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Чтобы не создавать лишьний Label можно использовать AutoItWinSetTitle и -GetTitle.
Ещё есть функции _NamedPipes*, но примеров к ним нет, надо разбираться.
 
Верх