Jump to content
Pedro Pinheiro

Multi-thread em autoit

Recommended Posts

Eu não manjo muito de multi-thread, mas alguém sabe se tem como fazer no autoit? Queria executar uma função que possui um delay de 1000ms, mas meu código não pode ter esse delay. Com o adlib eu meio que vou chamar a função toda hora sem necessidade.

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

A função "AdlibRegister()" tem um segundo parâmetro que define a frequência (em milissegundos com padrão de 250ms) que ela será chamada.

AdlibRegister ( "function" [, time = 250] )
Quote

Parâmetros

function O nome da adlib functiona ser registrada.
time [opcional] com que frequência, em milissegundos, será chamada a função. Padrão é 250 ms.

Doc: https://www.autoitscript.com/autoit3/docs/functions/AdlibRegister.htm

Não seria isso?

Share this post


Link to post
Share on other sites

Acredito que o Pedro quer ter 2 threads para não ficar usando a AdLibRegister, seja com qualquer  tempo.

Assim uma das threads seria a principal e o outra ficaria responsável pelo atendimento a um determinado evento.

Porém pelo que eu saiba AutoIt não é e nem será multi-thread (https://www.autoitscript.com/trac/autoit/wiki/AutoItNotOnToDoList), mas existem meios para "simular" isso.

Mais informações e exemplo aqui = https://www.autoitscript.com/forum/topic/177771-autoit-multithreaded/?tab=comments#comment-1311382, mas não recomendo.

Afinal, qual é a situação que vc precisaria de muti-thread Pedro? Quem sabe podemos te ajudar?

 

Share this post


Link to post
Share on other sites
3 hours ago, Manimal said:

Acredito que o Pedro quer ter 2 threads para não ficar usando a AdLibRegister, seja com qualquer  tempo.

Assim uma das threads seria a principal e o outra ficaria responsável pelo atendimento a um determinado evento.

Porém pelo que eu saiba AutoIt não é e nem será multi-thread (https://www.autoitscript.com/trac/autoit/wiki/AutoItNotOnToDoList), mas existem meios para "simular" isso.

Mais informações e exemplo aqui = https://www.autoitscript.com/forum/topic/177771-autoit-multithreaded/?tab=comments#comment-1311382, mas não recomendo.

Afinal, qual é a situação que vc precisaria de muti-thread Pedro? Quem sabe podemos te ajudar?

 

Capturas de teclas de joysticks sem delay para manter a precisão e reprodução de vídeo sem que a leitura do arquivo trave a execução do programa. No caso do vídeo eu uso o adlib, mas meio que o programa sofre um pouco ao ler o arquivo, isso mais pela velocidade de leitura do HD.

Share this post


Link to post
Share on other sites

Olá Pedro.

   Em relação a captura de teclas sem delay, não poderia utilizar a solução apontada pelo Mutleey no tópico Aliviar uso da CPU?

   Quanto à reprodução do vídeo, são muito grandes os arquivos a serem carregados?

   Penso que talvez poderia haver várias alternativas (a depender da funcão de playback) como:

a) pré-carregamento

b) carregamento a partir de drive virtual (RAM)

d) re-renderização para uma qualidade inferior de vídeo (isso depende do tamanho da janela a ser mostrada)

 Qual função que vc está usando para mostrar os vídeos?

Share this post


Link to post
Share on other sites
On 30/05/2018 at 3:36 PM, Manimal said:

Olá Pedro.

   Em relação a captura de teclas sem delay, não poderia utilizar a solução apontada pelo Mutleey no tópico Aliviar uso da CPU?

   Quanto à reprodução do vídeo, são muito grandes os arquivos a serem carregados?

   Penso que talvez poderia haver várias alternativas (a depender da funcão de playback) como:

a) pré-carregamento

b) carregamento a partir de drive virtual (RAM)

d) re-renderização para uma qualidade inferior de vídeo (isso depende do tamanho da janela a ser mostrada)

 Qual função que vc está usando para mostrar os vídeos?

Eu fiz esse programa aqui (postei o vídeo ali em baixo). Basicamente ele abre um vídeo cada vez que eu seleciono um item novo, a média de tamanho do vídeo é de 1~3 megas, isso dá +- 200 milésimos usando HD. A unica opção que eu achei foi abrir  o vídeo em um adlib, mas mesmo lá o programa da uma travadinha quando ele for carregar.

a) Não posso pré carregar já que a seleção de reprodução é definido pelo usuário.

b) Eu não consegui executar um arquivo de vídeo direto da memória,  a quantidade de arquivos é gigantesca para jogar na memória.

d) Re-renderização...a demora na execução é baseado na velocidade de leitura do HD, então se eu ler e renderizar, mais tempo perdido

 

"Qual função que vc está usando para mostrar os vídeos?"
Estou com 3 em teste:

 "DSEnginer.dll" feita por um usuário no forum americano. (usando essa por enquanto, não achei nenhum bug nela)
DirectShow, que é básicamente a mesma coisa do DSEnginer, mas tem uns pequenos bugs de SO para SO.
winmm.dll, a dll que reproduz vídeos.
 

 

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites
Quote

"Qual função que vc está usando para mostrar os vídeos?"
Estou com 3 em teste:

 "DSEnginer.dll" feita por um usuário no forum americano. (usando essa por enquanto, não achei nenhum bug nela)

Eu também estou testando ela e gostei muito pelo fato dela abrir vídeo de qualquer resolução em tela cheia porém achei um bug quando vou abrir arquivos .cdg que precisa instalar o karaokê for directx para rodar.

Spoiler

 

 

Share this post


Link to post
Share on other sites
19 hours ago, Belini said:

Eu também estou testando ela e gostei muito pelo fato dela abrir vídeo de qualquer resolução em tela cheia porém achei um bug quando vou abrir arquivos .cdg que precisa instalar o karaokê for directx para rodar.

  Reveal hidden contents

 

 

Acho que pode ser por causa da configuração da janela que o vídeo está sendo executado, eu tive esse problema quando fiquei testando várias estilos na janela. Olha o outro ali, aquele que usa directShow também, só que ele é todo em autoit ao invés de ser na DLL

 

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

@Pedro Pinheiro, o programa acima foi feito em AutoIt? Show de bola! Parabéns!

 

Lá vou eu dar uma ideia maluca...
@Manimal tem razão, AutoIt não é, e não será multi-thread...
Mas já que você precisa "ler" as teclas de algum lugar... Porque não usa um script separado para fazer isso?
Exemplo:
Em vez de querer tudo em um único script, divide as funções.

Um script apenas lê as teclas, o outros renderiza os gráficos, e quando precisar saber o estado das teclas, ele pega as informações  do primeiro, que só lê.
Ah, mas e como fazer um script conversar com outro? PIPEs, TCP/IP
 

Como disse, uma sugestão doida.

  • Like 1

Share this post


Link to post
Share on other sites
11 hours ago, Luigi said:

@Pedro Pinheiro, o programa acima foi feito em AutoIt? Show de bola! Parabéns!

 

Lá vou eu dar uma ideia maluca...
@Manimal tem razão, AutoIt não é, e não será multi-thread...
Mas já que você precisa "ler" as teclas de algum lugar... Porque não usa um script separado para fazer isso?
Exemplo:
Em vez de querer tudo em um único script, divide as funções.

Um script apenas lê as teclas, o outros renderiza os gráficos, e quando precisar saber o estado das teclas, ele pega as informações  do primeiro, que só lê.
Ah, mas e como fazer um script conversar com outro? PIPEs, TCP/IP
 

Como disse, uma sugestão doida.

 

Ler as teclas não é problema (joystick), eu já faço isso direto no loop com a winmm.dll, o problema é reproduzir videos sem engasgar o loop principal, o adlib ajuda, mas essa divisão que o código faz causa travamento, o único modo que eu achei foi responsabilizando outros programas para reprodução de vídeos EX: Windows Media Player em um Object Internet Explorer no programa, mas isso de responsabilizar programas de terceiros da muito problema

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

@LuigiExcelente sugestão de dividir os scripts!

E como ele comentou existem vários maneiras de conversar de fazer um script conversar com outro, são os chamados IPC (Inter-Process Communication).

São procedimentos que utilizam de diversas técnicas para implementar a comunicação entre programas diferentes, ou no nosso caso, entre scripts diferentes.

A ideia é que nosso programa que tem um conjunto de variáveis próprias e seria muito bom que fosse possível que algumas variáveis pudessem ser "compartilhadas" com outro programa.

Porém o compartilhamento de espaço de memória (shared memory management) apesar de possível não é recomendado, inclusive no Windows existe uma camada de proteção para evitar isto chamada DEP (Data Prevention Execution). Explicar o motivo e como fazer (ou porque evitar) tomaria tempo e não é o objetivo do tópico.

Resta saber que existem vários meios de fazer isso, sendo uma das mais comuns a utilização de Pipes, que inclusive tem funções nativas no AutoIt (ver Help, User Defined Functions, NamedPipes Management).

Outro modo de fazer isso é usando MailSlot, com excelentes funções da Trancexx.

Outras maneiras envolvem compartilhamento de arquivos ou mesmo do próprio registro, ou através de protocolo de rede (TCP) e assim por diante.

É uma área ampla e interessante.

Para saber mais pesquise IPC e AutoIt, existem vários tipos e exemplos.

  • Thanks 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×