Что нового

Работа с функциями, вызванными из внешних dll

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Интересуют некоторые особенности взаимодействия Autoit и внешних dll.

Например, есть DSEngine_UDF.dll
http://www.autoitscript.com/forum/topic/97487-directshow-udf/?p=700963
Из скрипта на Autoit можно вызвать функцию создания, если по-простому, элемента-видеоплеера. Допустим, создали такой элемент, загрузили в него видеофайл, и продолжаем в скрипте делать какие-либо другие действия. Но при необходимости можно в любой момент обратиться к этому элементу, например, узнать, сколько времени файл будет еще проигрываться или изменить громкость.
Получается что-то вроде многопоточности.

Вопрос - как можно создавать такие dll?

Создать обычную dll, например, на PureBasic, не проблема.
Но получается пока также как и при обычных функциях Autoit: вызывешь функцию из dll, и скрипт ждет окончания ее работы, т.е. процесс продолжает быть последовательным.
 

sims

Осваивающий
Сообщения
184
Репутация
24
WSWR [?]
Получается что-то вроде многопоточности.
Ага. В dll.
Т. е. в dll запускается поток, который работает независимо от основного.

Вопрос - как можно создавать такие dll?
Как обычно, но в dll необходимо создать поток.
Для примера, реализован счетчик, считающий независимо от работы скрипта.
Код:
CompilerIf #PB_Compiler_Thread = 0
  CompilerError "Включите поддержку многопоточности"
CompilerEndIf

Global x, ThreadID

Procedure Counter(z)
  Repeat
    x+1
    Delay(10)
  ForEver
EndProcedure

ProcedureDLL Start()
  If ThreadID=0 Or IsThread(ThreadID)=0
    ThreadID=CreateThread(@Counter(), 0)
  EndIf
EndProcedure

ProcedureDLL Get()
  ProcedureReturn x
EndProcedure
Код:
$dll = dllopen("dll.dll")
DllCall($dll, "none", "Start")
sleep(1000)
$Result = DllCall($dll, "Int", "Get")
MsgBox(0, "", $Result[0]*10)
$Result = DllCall($dll, "Int", "Get")
MsgBox(0, "", $Result[0]*10)
DllClose($dll)

Файлы. http://rghost.ru/53711178
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
sims
Отличный пример!
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Кстати, а никто не работал с dll, написанных на языке Freebasic?
Неплохо бы пример работы Autoit с такими dll.
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Продолжаю разобираться с Freebasic-ком и dll. Dll создавать удается, и даже работает)

Допустим, скрипт Autoit вызывает из dll две функции (из одного файла или из разных, значения не имеет). Одна функция - рисование через gdip, другая - показ картинок или видео.
Внутри dll функции работают в отдельных потоках, как выше в примере от sims, т.е. скрипт Autoit по ходу выполнения запускает эти функции в "свободное плавание", и на дальнейшую работу скрипта они, на первый взгляд, не влияют.

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

Можно было бы списать на ограничения компьютера, но если создать два процесса с теми же задачами, то параллельная работа идет без каких-либо проблем, даже если грузятся видеофайлы большого размера.

Спрашиваю здесь, возможно кто-то (кто знает тот же PureBasic) подскажет куда копать, где посмотреть или почитать. Форумы Freebasic мертвы(
 

Naisho

Знающий
Сообщения
86
Репутация
12
WSWR
Маленький вопрос - во Freebasic-е есть регулярные выражения?
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Naisho сказал(а):
WSWR
Маленький вопрос - во Freebasic-е есть регулярные выражения?

Как раз встроенных, как в Autoite, нет, и это очень большой недостаток.
Перерыл форумы, есть ссылки на две библиотеки для работы регулярными выражениями, но ни один пример не заработал. Там все пользуются функциями типа InsertString, Mid, Trim.
 

sims

Осваивающий
Сообщения
184
Репутация
24
WSWR [?]
Но возникла проблема: при загрузке картинок или видео отмечаю притормаживание рисования.
Может в коде dll есть ошибки?
Неплохо бы на него взглянуть.

Если переписать с FreeBasic на PureBasic или другой ЯП, так же тормозит?
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
sims сказал(а):
Может в коде dll есть ошибки?
Неплохо бы на него взглянуть.
Если переписать с FreeBasic на PureBasic или другой ЯП, так же тормозит?

Во вложении пример au3, dll, и файл bas Freebasic
А с PureBasic я не так хорошо знаком, да и платный он.

В скрипте au3 в начале нужно указать какую-нибудь папку с картинками jpg
При нажатии клавиши pause картинки будут грузиться в окно, созданное через вызов из dll.
В этом случае заметны притормаживания рисуемого текста. А если переключить показ картинок на Pic в Autoit-окне, то тормоза отсутствуют.

Ошибки в алгоритме вполне могут быть - не очень мне понятно взаимодействие потоков: в одном рисуется текст, в другом создается окно для картинки, а в третьем я пытаюсь загружать картинку.
В bas-файле для отображения картинки используются функции из библиотеки Window9, которые имитируют функции из PureBasic - возможно, дело в них.

А здесь http://free-basic.ru/download.html сборка Freebasic (80 Мб) со всеми библиотеками и русским редактором
 

sims

Осваивающий
Сообщения
184
Репутация
24
Отображать картинку (и создавать ImageGadget) нужно в потоке создавшем окно. Загружать можно в другом потоке. Иначе тратится время на межпотоковую синхронизацию.
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
sims
Пытался по всякому: тормоза остаются
Не могу понять, почему при загрузке в обычный Pic в окне Autoit все нормально
Тогда можно пример на PureBasic загрузки картинок в разны потоках.
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Еще интересно, почему друг на друга влияют функции из разных загруженных dll.
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
WSWR сказал(а):
Еще интересно, почему друг на друга влияют функции из разных загруженных dll.
Все оказалось просто: разные потоки, использующие рисование и загрузку картинок, все равно в какой-то момент упираются в GDI, и создается очередь с задержкой.
Проблема решается использованием альтернативных технологий рисования и загрузки картинок.
 
Верх