Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: xinyiman - Luglio 11, 2019, 09:33:37 am

Titolo: Problema KeyInput
Inserito da: xinyiman - Luglio 11, 2019, 09:33:37 am
Ciao ragazzi, ho il seguente problema su ubuntu 19.04
Ho un programma che simula l'iterazione utente con mouse e tastiera (LazMouseInputKey package). Capita a volte che eseguo dei comandi in successione ma vengono eseguiti errati. Faccio un esempio

KeyInput.Apply([ssCtrl]);
KeyInput.Press('V');
KeyInput.UnApply([ssCtrl]);

KeyInput.Apply([ssCtrl]);
KeyInput.Press('A');
KeyInput.UnApply([ssCtrl]);

KeyInput.Apply([ssCtrl]);
KeyInput.Press('C');
KeyInput.UnApply([ssCtrl]);

Questo codice dovrebbe incollare, selezionare tutto e poi copiare il contenuto. A volte capita che prima seleziona tutto, poi incolla e poi copia. Come se le chiamate fossero asincrone. Qualcuno sa come rendere queste chiamate sincrone?
Titolo: Re:Problema KeyInput
Inserito da: bonmario - Luglio 11, 2019, 10:59:05 am
Ciao,
io ho avuto un  problema simile, ma in Windows.

Nel mio programma, mettevo del testo negli appunti, e poi lo incollavo, inviando la sequenza "CTRL + V"

Alla fine ho risolto parzialmente mettendo uno "sleep(200);", seguito da un "Application.ProcessMessages".

Supponiamo che io debba eseguire questo pseudo codice:
per indice che va da 1 a 30, copia negli appunti il numero e poi incolla il testo presente negli appunti usando la sequenza "CTRL + V"

La maggior parte delle volte, mi ritrovo effettivamente i numeri che vanno da 1 a 30.
Ogni tanto manca qualche numero.
Ogni tanto manca qualche numero, ed altri sono stati incollati 2 volte.

La mia ipotesi è che gli "Appunti" del sistema operativo non supportino letture e scritture troppo veloci e, ogni tanto, diano questi problemi.

Ciao, Mario

Titolo: Re:Problema KeyInput
Inserito da: SB - Luglio 12, 2019, 08:10:39 am
Ci vorrebbe un XFlush(display) dopo ogni invocazione a Press() in modo da garantire l'invio degli eventi.
Da quel che ho capito, ad ogni evento è associato un timestamp per stabilire la corretta sequenza temporale. Eventi in sequenza rapida hanno lo stesso timestamp e quindi la corretta sequenza temporale non è più garantita.
Le librerie che wrappano librerie che wrappano le api portano a nascondere troppi dettagli
Titolo: Re:Problema KeyInput
Inserito da: bonmario - Luglio 12, 2019, 08:20:43 am
Ci vorrebbe un XFlush(display) dopo ogni invocazione a Press() in modo da garantire l'invio degli eventi.

Se non ho capito male, è già chiamata da questa:
Codice: [Seleziona]
procedure TXKeyInput.DoDown(Key: Word);

P.S. Nel post di prima ho dimenticato che, dopo la Sleep, ho messo anche una "Application.ProcessMessages". Adesso sistemo il post precedente ...

Ciao, Mario.
Titolo: Re:Problema KeyInput
Inserito da: xinyiman - Luglio 14, 2019, 12:18:41 pm
Ci vorrebbe un XFlush(display)

Provato anche questo, ma purtroppo non risolve il problema. Spero di risolvere diversamente ma questo mi obbligherà a provare a far girare il mio programma su windows.
Titolo: Re:Problema KeyInput
Inserito da: bonmario - Luglio 14, 2019, 12:30:48 pm
Se risolvi, fai sapere ... come scrivevo, ho lo stesso problema !!!

Grazie, Mario
Titolo: Re:Problema KeyInput
Inserito da: xinyiman - Luglio 15, 2019, 12:04:08 pm
Ho fatto questo semplice test. Secondo voi è indicativo? A me tarando il ciclo su 1000 iterazioni non ha dato errori. Ora è a 10000, invito anche voi a testarlo per sapere se qualcuno ha avuto problemi.

Lo compilate, lo lanciate, poi cliccate sul button2, poi cliccate sul button3
(serve per salvare le posizioni dei due bottoni)

A questo punto lanciate il vero test premendo su button1. Se vi riporta 0 [10001/10001] vuol dire che è andato tutto bene.
Titolo: Re:Problema KeyInput
Inserito da: bonmario - Luglio 15, 2019, 03:39:50 pm
Ciao,
il programma che mi da problemi lo uso al lavoro, e questa settimana sono in ferie.
La settimana prossima faccio le prove e vi faccio sapere.

Ciao, Mario
Titolo: Re:Problema KeyInput
Inserito da: bonmario - Luglio 16, 2019, 09:02:11 am
Ho fatto questo semplice test. Secondo voi è indicativo? A me tarando il ciclo su 1000 iterazioni non ha dato errori. Ora è a 10000, invito anche voi a testarlo per sapere se qualcuno ha avuto problemi.

Lo compilate, lo lanciate, poi cliccate sul button2, poi cliccate sul button3
(serve per salvare le posizioni dei due bottoni)

A questo punto lanciate il vero test premendo su button1. Se vi riporta 0 [10001/10001] vuol dire che è andato tutto bene.

Ciao,
stavo guardando/provando il tuo codice:
se non ho capito male, il "trucco" è quello di inizializzare gli appunti, e poi continuare a fare il "CTRL + C" fino a quando gli appunti sono compilati o sono stati fatti 10 tentativi.
E' corretto?

Grazie, Mario
Titolo: Re:Problema KeyInput
Inserito da: xinyiman - Luglio 16, 2019, 12:04:09 pm
Concettualmente si, lasciandoli un numero massimo di tentativi per non incorrere in un loop infinito. Spero che funzioni.
Titolo: Re:Problema KeyInput
Inserito da: bonmario - Luglio 16, 2019, 03:27:51 pm
Il problema che avevo io era sull'incolla: mettevo qualcosa negli appunti, e poi inviavo la sequenza CTRL + V per incollare, il tutto per circa 50 volte.
A memoria avevo fatto anche io qualcosa di simile a quello che hai fatto tu: un loop in cui, dopo ogni assegnazione del testo agli appunti, verificavo che il testo negli appunti fosse quello corretto.
Quando torno al lavoro verifico.

Ciao, Mario
Titolo: Re:Problema KeyInput
Inserito da: bonmario - Luglio 22, 2019, 03:13:09 pm
Concettualmente si, lasciandoli un numero massimo di tentativi per non incorrere in un loop infinito. Spero che funzioni.

Ciao, sono appena riuscito a fare qualche prova, e sembra funzionare.
Visto che questo programma lo uso solo io, e nemmeno troppo spesso, non ho messo il n° di tentativi: continuo a riprovare fino a quando negli appunti con c'è quello che mi aspetto.
Se un domani dovesse andare in loop, lo metto in debug ed amen !!!

Ciao, Mario