Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: tito_livio - Giugno 14, 2023, 07:24:37 pm

Titolo: Esecuzione parallela
Inserito da: tito_livio - Giugno 14, 2023, 07:24:37 pm
Ciao a tutti, ho un dubbio.
Supponiamo di avere un programma Lazarus che ha due bottoni e cliccandoci sopra viene eseguito del codice, diverso, che prende un po' di tempo, per esempio 10 sec.
Se io premo il primo bottone e poi, subito dopo, il secondo, i due sottoprogrammi vengono eseguiti in parallelo?
Io penso di no ma mi sta venendo qualche dubbio.
Grazie a tutti in anticipo.
Titolo: Re:Esecuzione parallela
Inserito da: quack - Giugno 14, 2023, 09:47:43 pm
Le due procedure utilizzerebbero lo stesso thread della form, quindi quello che solitamente succede è che dopo aver premuto il primo pulsante la form si "freezza" (il programma non risponde) e non riesci neanche a premere il secondo pulsante fin quando la prima routine non ha terminato.

Se vuoi una esecuzione in parallelo uno dei metodi è usare i TThread.

Ciao


Titolo: Re:Esecuzione parallela
Inserito da: Avogadro - Giugno 14, 2023, 11:03:01 pm
Lazarus "Multithreaded Application "

https://wiki.freepascal.org/Multithreaded_Application_Tutorial

La memoria va ai tempi del primo fortran che permetteva il calcolo parallelo e vettoriale:

https://it.wikipedia.org/wiki/Cray-1

Tornando con i piedi per terra e pensando alle cose spiccce , c'è un problema analogo  quando si fanno delle operazioni un attimo piu' complesse su delle tabelle di dati:  il sw si blocca in attesa che il processo termini;   a parte l' uso del del cambiare la "forma" del puntatore del mouse ( https://wiki.freepascal.org/Cursor) fin quando il processo non termina,  si puo' usare l' "application.processmessage" (esempio  https://forum.lazarus.freepascal.org/index.php?topic=46524.0 ) , ma va da sè che tutto è perfettibile : https://www.thoughtco.com/dark-side-of-application-processmessages-1058203 .




Titolo: Re:Esecuzione parallela
Inserito da: DragoRosso - Giugno 15, 2023, 12:02:05 am
Dice bene @Quack, ossia che tutti gli eventi della LCL e non solo vengono gestiti in un unico Thread conosciuto come Thread Principale (Main Thread).

Da quel Thread (SOLO DAL QUEL THREAD !!!) e quindi anche per esteso dagli eventi che certamente vengono gestiti dal Main Thread, si possono gestire le funzioni grafiche o qualunque cosa abbia a che fare con la LCL.

Il Main Thread, se non forzato da tentativi di suicidio con "ProcessMessages" e simili, ESEGUE UN SOLO EVENTO ALLA VOLTA.

Vai nel blog del forum e cerca Thread, troverai un articolo (te le linko qui per comodità: https://blog.lazaruspascal.it/2022/04/24/thread/ (https://blog.lazaruspascal.it/2022/04/24/thread/) )

Ciao
Titolo: Re:Esecuzione parallela
Inserito da: tito_livio - Giugno 15, 2023, 12:10:53 am
No, non voglio fare il multithread, voglio che le due parti di programma vengano eseguite in tempi separati.
Non uso, in questo caso, "application.processmessage", volevo solo sapere se sicuramente le due parti venivano eseguite in momenti diversi.
Da quello che mi dite la cosa adesso è chiara, i due eventi sono eseguiti uno alla volta, grazie.
Titolo: Re:Esecuzione parallela
Inserito da: bonmario - Giugno 15, 2023, 08:22:13 am
Il Main Thread, se non forzato da tentativi di suicidio con "ProcessMessages" e simili, ESEGUE UN SOLO EVENTO ALLA VOLTA.

Scusa, per curiosità: a me capita spesso di usare "ProcessMessages" quando sto lanciando un'operazione che può durare parecchio. In pratica, ogni "tot", emetto dei messaggi, e poi un bel "ProcessMessages" per evitare che il programma sembri bloccato.
Ora, supponiamo che io abbia un programma "fatto male" con 2 bottoni, di cui il primo bottone è quello che lancia il processo lungo che dicevo prima.
Mentre questo processo sta ancora girando, io clicco sul secondo bottone.

Cosa succede?
Io ho sempre pensato che partano i lavori del secondo bottone, interrompendo quelli del primo. Quando finiscono le operazioni del secondo bottone, ripartono quelle del primo.
E' corretto?

Grazie, Mario
Titolo: Re:Esecuzione parallela
Inserito da: xinyiman - Giugno 15, 2023, 08:37:28 am
Funziona che porta a termine prima il codice del primo bottone che viene premuto.
Per questo motivo è consigliabile pilotare le proprietà .enabled di tutti i componenti della schermata che possono rompere i maroni.
Esempio se ho button1 e button2, se premo su button1 la prima cosa che deve fare è disabilitare l'operatività di button2 e riattivarla solo alla fine del processo.
Così si evitano comportamenti anomali
Titolo: Re:Esecuzione parallela
Inserito da: bonmario - Giugno 15, 2023, 09:05:48 am
Sì, grazie, di solito faccio così: quando qualcuno clicca su un bottone, disabilito tutti i componenti del dialogo (o la maggior parte di essi), e li riabilito alla fine del suo lavoro.
La mia era solo una curiosità !

Ciao, Mario
Titolo: Re:Esecuzione parallela
Inserito da: nomorelogic - Giugno 15, 2023, 09:34:53 am
ProcessMessages, di fondo, forza l'elaborazione dei messaggi in coda

per fare questo, interrompe il main thread e, se lo si fa in un loop, può allungare di molto la durata del loop stesso
Titolo: Re:Esecuzione parallela
Inserito da: bonmario - Giugno 15, 2023, 09:52:41 am
Normalmente si cerca di bilanciare le cose:
- se non lo metti, l'utente può pensare che il programma è bloccato, e ne forza l'arresto (è capitato troppe volte !!!)
- se lo metti, come hai detto tu, rischi di rallentare il processo principale.

Io di solito lo metto o ogni "tot" secondi, o se sto facendo un ciclo su un elenco di files, ogni "tot" files elaborati. In pratica, emetto un messaggio con cui faccio capire all'utente a che punto sono, e poi un bel "ProcessMessages"
Titolo: Re:Esecuzione parallela
Inserito da: Stilgar - Giugno 15, 2023, 11:43:25 am
Ciao a tutti, ho un dubbio.
Supponiamo di avere un programma Lazarus che ha due bottoni e cliccandoci sopra viene eseguito del codice, diverso, che prende un po' di tempo, per esempio 10 sec.
Se io premo il primo bottone e poi, subito dopo, il secondo, i due sottoprogrammi vengono eseguiti in parallelo?
Io penso di no ma mi sta venendo qualche dubbio.
Grazie a tutti in anticipo.


Ciao Tito.
Cosa intendi di preciso per "sottoprogrammi"?
Se ho intuito correttamente:
vuoi far girare in parallelo parti del processo, devi fare in modo che il "master" richiami l'eseguibile come "slave".
Attraverso dei parametri (riga di comando?) puoi far eseguire un pezzo dell'eseguibile piuttosto che un altro.
In questo modo, con la classe TProcess hai la possibilità di passare sia parametri ed ignorare eventuali "result" dell'elaborazione (vecchio errorcode, per intendeci): modalità spara e dimentica.


Se vuoi recuperare il risultato dell'esecuzione, per lasciare parallela l'esecuzione, mi sa che ti tocca impelagarti con i thread per monitorare in parallelo le esecuzioni, altrimenti il monitorare il risultato porta ad avere una sequenzialità di lancio dei "sottoprogrammi".


Stilgar

Titolo: Re:Esecuzione parallela
Inserito da: tito_livio - Giugno 15, 2023, 05:49:33 pm
Per questo motivo è consigliabile pilotare le proprietà .enabled di tutti i componenti della schermata che possono rompere i maroni.
Esempio se ho button1 e button2, se premo su button1 la prima cosa che deve fare è disabilitare l'operatività di button2 e riattivarla solo alla fine del processo.
Così si evitano comportamenti anomali

Ciao Xinyiman
Io, in questo mio caso, non uso "ProcessMessages".
Quindi, essendo che dopo la pressione di button1 non è possibile cliccare altri bottoni perché è tutto freezzato fino alla fine dell'esecuzione del thread di button1, credo si possa anche non disabilitare gli altri bottoni.
Certo, se l'utente si mette a cliccare qui e là magari altri thread vengono messi in coda ma mai esegiuiti concorrentemente.

Cosa intendi di preciso per "sottoprogrammi"?
Se ho intuito correttamente:
vuoi far girare in parallelo parti del processo, devi fare in modo che il "master" richiami l'eseguibile come "slave".

Ciao Stilgar
Per sottoprogramma intendo il codice (o thread) associato alla pressione di un bottone.
Comunque io non voglio far girare in parallelo nessun processo, anzi volevo essere sicuro che, anche se si cliccava button1 e poi subito dopo button2, l'esecuzione dei due thread fosse avvenuta una alla volta.
Poi @quack e @DragoRosso mi hanno chiarito che effetivamente è così, cioè l'esecuzione avviene sequenzialmente.
Titolo: Re:Esecuzione parallela
Inserito da: DragoRosso - Giugno 16, 2023, 08:09:32 am
......
Per sottoprogramma intendo il codice (o thread) associato alla pressione di un bottone.
......

Ciao, occhio che la pressione del bottone non genera "thread" nè il codice normale "abbinato" è un thread. Il codice abbinato all'evento "gira" all'interno del MAIN THREAD (che però è un thread particolare per la sua funzione).
Il Thread è un processo diciamo autonomo con una sua vita. Ad esempio i thread usati dai componenti di comunicazione, e i loro eventi (come quando arriva un dato) generalmente girano in un thread autonomo (non nel MAIN THREAD per via delle prestazioni normalmente).

E' solo una precisazione per cercare di fare capire meglio il concetto di thread, "non me ne vogliate"  ;)
Titolo: Re:Esecuzione parallela
Inserito da: DragoRosso - Giugno 16, 2023, 08:52:12 am
Scusa, per curiosità: a me capita spesso di usare "ProcessMessages" quando sto lanciando un'operazione che può durare parecchio. In pratica, ogni "tot", emetto dei messaggi, e poi un bel "ProcessMessages" per evitare che il programma sembri bloccato.
Ora, supponiamo che io abbia un programma "fatto male" con 2 bottoni, di cui il primo bottone è quello che lancia il processo lungo che dicevo prima.
Mentre questo processo sta ancora girando, io clicco sul secondo bottone.
Cosa succede?
Io ho sempre pensato che partano i lavori del secondo bottone, interrompendo quelli del primo. Quando finiscono le operazioni del secondo bottone, ripartono quelle del primo.
E' corretto?
Grazie, Mario

Funziona che porta a termine prima il codice del primo bottone che viene premuto.
Per questo motivo è consigliabile pilotare le proprietà .enabled di tutti i componenti della schermata che possono rompere i maroni.
Esempio se ho button1 e button2, se premo su button1 la prima cosa che deve fare è disabilitare l'operatività di button2 e riattivarla solo alla fine del processo.
Così si evitano comportamenti anomali

ProcessMessages, di fondo, forza l'elaborazione dei messaggi in coda
per fare questo, interrompe il main thread e, se lo si fa in un loop, può allungare di molto la durata del loop stesso

L'uso di ProcessMessages genera ben altro, oltre a quanto descritto. Di fatto il suo uso altera la sequenza di esecuzione del MAIN THREAD e può avere effetti difficili da diagnosticare.
Windows si basa sui "messaggi" e molto di ciò che lo riguarda comporta la gestione dei messaggi: un tasto premuto genera un messaggio (anzi più di uno), altri eventi di sistema (ad esempio la chiusura di una form) generano messaggi.

Potrebbe non bastare la disattivazione dei componenti attivi grafici: provate a pensare cosa succede se premo CTRL F4 (dovrebbe chiudere una dialog box aperta) o altri "tasti di sistema" mentre sono a gestire un evento nel thread principale e uso ProcessMessages in quella dialog box ...

Non usate ProcessMessages se non ne avete l'assoluta necessità e ormai tale funzione potrebbe essere tranquillamente "eliminata". Cercate invece di usare le tecniche che ci sono e ormai tali tecniche non hanno segreti o parti oscure ... l'uso dei thread o di altri sistemi per l'esecuzione asincrona di codice particolarmente pesante o lungo risolve tranquillamente il problema del "congelamento" della parte grafica.

Così come si dovrebbe evitare loop "infiniti" (infiniti per modo di dire ovviamente) all'interno del codice: gli eventi risolvono molto spesso benissimo tali casistiche (così come anche i semafori).

Il SO poi farà effettivamente dei loop, ma insieme a mille altre cose non sprecando energie per magari testare in loop una variabile boolena finchè non cambia stato.

Codice: [Seleziona]
var
   test: boolean;

test := true;

//Il codice gira "a manetta" finchè la variabile non diventa false, se fatto in un evento delle LCL il programma si congelerà (oltre che vedere schizzare l'uso della CPU alle stelle).
while test do
   ;

//Peggio che mai fare

while test do
  Application.ProcessMessages;

.....
.....

Ciao ciao
Titolo: Re:Esecuzione parallela
Inserito da: Avogadro - Giugno 16, 2023, 11:01:39 pm
"Non usate ProcessMessages se non ne avete l'assoluta necessità e ormai tale funzione potrebbe essere tranquillamente "eliminata""

Parlo per il caso della mia applicazione rigurdante le carte di controllo di  Shewhart*.

In pratica i dati di una macchina (un centinaio per volta)  vengono copiati , con un banale cut and paste del logout strumentale, in un memo (per semplicità, per non dover gestire file testo et similia) , da lì viene poi fatto il "pump data" in  delle tabelle sqllite (con zeoslib) .

Ma mano che i dati vengono caricati il sw fa delle operazioni matematiche (le normali cose di statistica, media, range etc, tutte cose già implementate in dmath) .

Ovviamente per caricare un centinaio di dati il sw ci mette un po' di tempo - un modesto pc da ipermercato  è mica il cray o il cdc - , e per evitare casini tengo traccia facendo scivere nella status bar, ad ogni passo del loop, il numero di righe/record processati ; il punto è che se non uso l'application.processmessage, per deprecata che sia, le scritte nella status bar non si aggiornano man mano, ma vengono su di colpo alla fine del loop, quindi non servono a nulla  .

Si in lazarus  c'è la progress bar,  ma i tentativi di usarla non sono andati a buon fine, mi cospargo il capo di cenere.

Approcci alternativi che evitino l' uso di application.processmessage per questa situazione  ?

Ossia come tenere  traccia a video del numero di righe/record processati per prevenire  i casini da " ma si è bloccato il pc ? cntr-alt-canc " ? 

Si, sqllite è robusto **, ma è meglio prevenire ***.



*
https://www.itl.nist.gov/div898/handbook/pmc/section3/pmc321.htm

**
https://www.sqlitetutorial.net/sqlite-transaction/


***
con delphi, bdbe e paradox ogni 5 minuti saltavano gli indici, si doveva ricorre all' apposito software "ripara tabelle di paradox"; all' epoca si trovava in un attimo free sul web, oggi sul web ci sono  sono depliants pubblicitari .
Titolo: Re:Esecuzione parallela
Inserito da: DragoRosso - Giugno 17, 2023, 12:21:02 am
Usa il metodo Refresh o Update del componente al posto dell' Application.ProcessMessages.
Inoltre consiglio di cambiare il cursore con il cursore "animato", io lo chiamo "il calamaro che gira" ....  ;D

Esempio:
Codice: [Seleziona]
//Questo evento congela l'applicazione e non fà vedere il conteggio in corso
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
  for i:=0 to 100 do
    begin
      Label1.Caption:=i.ToString;
      sleep(10);
    end;
end;

//Con questo evento invece l'applicazione è congelata ma fà correttamente vedere il conteggio.
procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
  for i:=0 to 100 do
    begin
      Label1.Caption:=i.ToString;
      sleep(10);
      Label1.Refresh;
    end;
end;

Ciao
Titolo: Re:Esecuzione parallela
Inserito da: Avogadro - Giugno 17, 2023, 05:10:49 am
 :)

Grazie.

ps

non ci avevo fatto caso:

":=i.ToString";
 
un cult, ero rimasto a ":=inttostr(i)"


Titolo: Re:Esecuzione parallela
Inserito da: bonmario - Giugno 17, 2023, 07:04:04 am
Approcci alternativi che evitino l' uso di application.processmessage per questa situazione  ?

Confesso che anche io uso il tuo stesso metodo, più che altro per pigrizia.
Potresti risolvere il problema facendo fare il lavoro di copia in un thread secondario che, tramite la "synchronize" scrive sul form fase per fase

Ciao, Mario
Titolo: Re:Esecuzione parallela
Inserito da: tito_livio - Giugno 17, 2023, 10:17:03 am
Lo confesso, anche io, anche se raramente, uso ProcessMessages.
Lo uso per poter interrompere un'operazione (un ciclo) molto lunga tramite la pressione di un bottone.
La barra di progressione funziona ma se voglio annullare l'operazione devo usare ProcessMessages.
Per com'è fatto il ciclo, l'inserimento di  ProcessMessages non prende molto tempo.
Secondo voi c'è un modo alternativo?
Titolo: Re:Esecuzione parallela
Inserito da: DragoRosso - Giugno 17, 2023, 10:59:59 am
Lo confesso, anche io, anche se raramente, uso ProcessMessages.
Lo uso per poter interrompere un'operazione (un ciclo) molto lunga tramite la pressione di un bottone.
La barra di progressione funziona ma se voglio annullare l'operazione devo usare ProcessMessages.
Per com'è fatto il ciclo, l'inserimento di  ProcessMessages non prende molto tempo.
Secondo voi c'è un modo alternativo?

No, non c'è un modo alternativo. Potresti usare la funzione di "presa dei tasti" nel tuo ciclo cercando una determinata sequenza ("CTRL ALT C" ad esempio) e interrompere lo stesso ciclo dopo una dialog di conferma.

Però sono sotterfugi, in quanto l'interfaccia è congelata e anche se impostato il cursore "animato" tipo clessidra o altro la cosa non è certo piacevole.

L'ideale è usare i thread, che sono relativamente semplici da usare in realtà. L'unica cosa a cui bisogna fare attenzione è a non usare i componenti dichiarati nell'interfaccia grafica con i thread direttamente.

Per fare l'esempio di @Avogadro, per usare in un Thread il componente di un database dichiarato in una Form o in un DataModule occorre fare molta attenzione. L'ideale sarebbe dichiarare i componenti a RUNTIME dentro il thread e non gestirli a DesignTime.

Cambiare la modalità in cui il componente si integra con il programma e spostarlo in un thread non è così semplice. Se progettato e fattto "prima" di sviluppare il programma è relativamente semplice, farlo dopo comporta un pò di lavoro.

Ciao
Titolo: Re:Esecuzione parallela
Inserito da: tito_livio - Giugno 17, 2023, 12:26:07 pm
Ok, grazie DragoRosso
Titolo: Re:Esecuzione parallela
Inserito da: DragoRosso - Giugno 17, 2023, 04:40:29 pm
Per chi volesse avere un bel cursore, lascio in allegato lo stesso.

Qui l'esempio.
Create una nuova applicazione in Lazarus, inserite un bottone nella Form e create due eventi (FORMCREATE e BUTTON1CLICK) con il doppio click sulla Form e sul bottone. Sovrascrivete con quanto qui postato nella sezione IMPLEMENTATION.

IL CURSORE DOVETE INSERIRLO NELLE RISORSE DI LAZARUS (ci sono altri modi ma questo è quello usato per default) dal menu "Opzioni progetto" / "Risorse" e dovete chiamarlo PROVA come nel codice.

Codice: [Seleziona]
var
  test: boolean;

procedure TForm1.FormCreate(Sender: TObject);
var newcur: TCursorImage;
begin
  newcur := TCursorImage.Create;
  newcur.LoadFromResourceName(hinstance, 'PROVA');
  Screen.Cursors[1] := newcur.ReleaseHandle;
  Form1.Cursor := 1;
  newcur.Free;
  test := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  test := not test;
  if test then
    Form1.Cursor := 1
  else
    Form1.Cursor := crDefault;
end;

Ciao

P.S.: bel cursore si fà per dire  ;D
Titolo: Re:Esecuzione parallela
Inserito da: Avogadro - Giugno 17, 2023, 09:07:05 pm
Usa il metodo Refresh o Update del componente al posto dell' Application.ProcessMessages.
Inoltre consiglio di cambiare il cursore con il cursore "animato", io lo chiamo "il calamaro che gira" ....  ;D
....
      Label1.Refresh;
 
Ciao

Uso i panel della status bar

"ztable4.First;
form1.Cursor:=crHourGlass;
while not ztable4.eof do begin
         application.ProcessMessages;
         statusbar1.Panels[7].Text:='Record processed: ' + inttostr(n);
"

ma non c'è il "refresh" nel testo della della status bar , il sw non suggerisce nulla  a "statusbar1.Panels[7].text"

faro' un giro sul web , vediamo se si trova qualcosa

E in effetti è la status bar che ha il refresh , faccio qualche prova , vediamo che succede

E in effetti funziona molto meglio con il refresh, non si finisce mai di imparare.

Rimane un problema: mentre il sw "gira" e macina  dati,   come si a disabilitare i vari menu/bottoni  (esempio, evitare di pigiare il tasto logout) senza chiamarli tutti uno per uno per  disattivarli prima e attivarli poi ?
Titolo: Re:Esecuzione parallela
Inserito da: quack - Giugno 18, 2023, 12:27:07 am
Puoi disabilitare i componenti per tipologia aggiungendo eventuali eccezioni per ciò che deve rimanere sempre abilitato:
Codice: [Seleziona]
  for i := 0 to ComponentCount -1 do
  begin
    if Components[i] is TBitBtn then
      TBitBtn(Components[i]).Enabled   := not TBitBtn(Components[i]).Enabled;

    if Components[i] is TMenuItem then
      TMenuItem(Components[i]).Enabled := not TMenuItem(Components[i]).Enabled;
  end; 
  BitBtn1.Enabled := True;
oppure memorizzare lo stato corrente in una variabile
Codice: [Seleziona]
  fLoading := True; // quando inizio a caricare i dati,
  begin
    // caricamento dati ...
  end;
  fLoading := False; // quando finisco di caricare dati 
e poi verificare tale variabile prima di eseguire il codice legato ad un eventuale evento
Codice: [Seleziona]
  if not fLoading then
  begin
    // ... codice da eseguire
  end;
Titolo: Re:Esecuzione parallela
Inserito da: Avogadro - Giugno 18, 2023, 03:54:47 am
 :)

Grazie.

Nell'applicazione per le carte di Shewhart avevo aggirato il problema riducendo al minino  i pulsanti e nella toolbar  ho lasciato giusto quelli per navigare nelle tabelle di zeolib, il logout e quelli per l'edit di testo .

Il resto lo gestisco con dei "pop-up menu" alias il resto è gestito con "il tasto destro del mouse"

Opinione personale: l' interfaccia dev'essere la piu' semplice ed intuitiva possibile, ci sono sempre mille cose inaspettate dietro l' angolo .

Tra le tante la stanchezza/la poca attenzione: stavo provando il suggerimento dell' uso del "refresh" - in giro per il web non trova nulla, che storie -   e ho cliccato sul tasto logout ; la relativa routine si è attivata correttamente alla fine del ciclo di elaborazione dati per il calcolo della statistica e quindi non è successo nulla di irreparabile, ho cliccato su "annulla"   nel relativo messagebox ed è finita lì.

Ecco perchè mi chiedevo se si potevano in certe fasi disabilitare i vari comandi, per prevenire problemi * .

O meglio, negli audit  controllano sempre come si fa a prevenire la modifica accidentale dei dati.

Non è questione di lana caprina, oltreoceano già da decenni vige la "CFR 21 Parte 11" ***  per la registrazione elettronica dei dati; di conseguenza anche da questa parte dell' oceano  ci dobbiamo adeguare.

La sintesi di questa norma è che  i documenti elettronici devono essere affidabili e possano essere archiviati, recuperati e riprodotti in forma esatta; questo affinchè possano avere  valore probatorio in un eventuale contenzioso; i record stessi non possono essere cancellati ma vanno conservati per eventuali future verifiche .

Si, questo complica  i gestionali ma il trend attuale è questo**.

Grazie di nuovo, ciao .

 :)


*
Anche se le leggi di Murphy sono sempre lì,  alais "dentro ogni piccolo problema ce n'è uno più grande che sta lottando per venir fuori."



**
rimpiango il vecchio fortran: file testo con i dati di input, programma lì per fare il mega calcolo, file di logout già stampato sul modulo continuo .

La gestione dell' intefaccia ad elevata interattività è un task difficile, quasi impossibile poi quando poi le linee telematiche sono lente .

Questo fa si che di fatto le interfacce sul web siano spesso l'analogo di quello che si faceva con il fortran: compili una scheda ipersemplificata, premi invio e aspetti la risposta .

***
https://www.fda.gov/regulatory-information/search-fda-guidance-documents/part-11-electronic-records-electronic-signatures-scope-and-application
Titolo: Re:Esecuzione parallela
Inserito da: quack - Giugno 18, 2023, 09:10:30 am
Prego!  :)
PS: Quasi dimenticavo ... ricorda anche di gestire l'eventuale chiusura accidentale del programma:
Codice: [Seleziona]
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := not fLoading;
end;
Ciao
Titolo: Re:Esecuzione parallela
Inserito da: DragoRosso - Giugno 18, 2023, 06:47:01 pm
E in effetti funziona molto meglio con il refresh, non si finisce mai di imparare.

.... stavo provando il suggerimento dell' uso del "refresh" - in giro per il web non trova nulla, che storie -   ....

Origine: https://docwiki.embarcadero.com/Libraries/Alexandria/en/Vcl.Controls.TControl.Refresh (https://docwiki.embarcadero.com/Libraries/Alexandria/en/Vcl.Controls.TControl.Refresh) e collegati.

Citazione
TControl.Refresh
Ridisegna il controllo sullo schermo.
Chiamare il metodo Refresh per ridisegnare immediatamente il controllo. Refresh chiama il metodo Repaint. Utilizzare i metodi Refresh e Repaint in modo intercambiabile.

TControl.Repaint
Forza il controllo a ridisegnare la propria immagine sullo schermo.
Chiama Repaint per forzare il controllo a ridisegnare immediatamente la sua immagine. Se la proprietà ControlStyle include csOpaque, il controllo si dipinge direttamente. In caso contrario, il metodo Repaint chiama il metodo Invalidate e quindi il metodo Update in modo che vengano ridisegnate anche tutte le parti visibili dei controlli sotto il controllo.

TControl.Invalidate
Ridisegna completamente il controllo.
Utilizzare Invalidate quando è necessario ridisegnare l'intero controllo. Quando è necessario ridipingere più di un'area all'interno del controllo, Invalidate causerà il ridisegno dell'intera finestra in un unico passaggio, evitando lo sfarfallio causato da ridisegni ridondanti. Non vi è alcuna riduzione delle prestazioni per la chiamata di Invalidate più volte prima che il controllo venga effettivamente ridisegnato

TControl.Update
Elabora immediatamente tutti i messaggi di disegno in sospeso.
Chiamare Update per forzare il ridisegno del controllo prima che venga eseguita un'ulteriore elaborazione, che potrebbe richiedere molto tempo. Utilizzare Aggiorna per fornire un feedback immediato all'utente che non può attendere l'arrivo del messaggio di Windows Paint.
L'aggiornamento non invalida il controllo, ma forza semplicemente un ridisegno di tutte le regioni che sono già state invalidate. Chiama invece Repaint per invalidare anche il controllo.

Ciao
Titolo: Re:Esecuzione parallela
Inserito da: Avogadro - Giugno 18, 2023, 07:24:34 pm

Origine: https://docwiki.embarcadero.com/Libraries/Alexandria/en/Vcl.Controls.TControl.Refresh (https://docwiki.embarcadero.com/Libraries/Alexandria/en/Vcl.Controls.TControl.Refresh)

...

Delphi è un altro pianeta, io ho cercato sul piu' spartano pianeta lazarus, il sistema solare di delphi è troppo lontano* per i miei  modesti mezzi ....

Comunque grazie  :)

Ciao


*
in illo tempore avevo comprato delphi 4 , volevo fare l' upgrade alle versioni successive ma il tempo è volato; ora c'è embracadero e delphi è arrivato a livelli da fantascienza - anche come prezzi - ;  il cd di delphi 4 è ancora nel cruscotto dell' auto in attesa dell' upgrade. 
 
Titolo: Re:Esecuzione parallela
Inserito da: DragoRosso - Giugno 18, 2023, 07:32:55 pm
Delphi è un altro pianeta, io ho cercato sul piu' spartano pianeta lazarus, il sistema solare di delphi è troppo lontano per i miei  modesti mezzi ....
Comunque grazie  :)
Ciao

Vero, ma Lazarus e FPC di fatto storicamente sono funzionalmente simili a Delphi e quindi anche se non è sempre proprio così le singole procedure e funzioni (in ambito LCL) hanno molto probabilmente la stessa funzionalità.

Non trovando altro, li si potrebbe trovare il coniglio nel cappello.

In ogni caso tutti noi del forum siamo qui proprio per condividere le ns. conoscenze per poter aiutarci / aiutare chi ha problemi e dubbi.

Prego  :D

Ciao
Titolo: Re:Esecuzione parallela
Inserito da: Avogadro - Giugno 18, 2023, 07:44:25 pm
Si, è così, tant'è che cercavo sempre aiuto nelle tante pagine delphi  presenti sul web*.

Poi nel tempo, a furia di frequentare il pianeta lazarus l' effetto ancoraggio ha fatto il resto.

Ciao e grazie ancora

 :)


*
ad esempio questa

http://www.delphibasics.co.uk/index.html

Per delphi c'era un sito poalcco dove si trovavano un sacco di cose interessanti, non so se c'è ancora e non  so  se l'hanno esteso anche a lazarus .

p.s.
ho appena fatto un giro, si trattava della "delphi super page",  il sito c'è ancora ma è abbandonato;
e così ci tocca vedere anche questo, i siti che con il tempo vanno in rovina come le vecchie fabbriche e le veccchie fattorie ;
ci sono ancora le pagine dedicate a "kylix" e a "BC++", non ho mai capito le scelte di marketing che stavano dietro questi ed altri prodotti; e in effetti è proprio il marketing che decide poi il destino di un'attività produttiva, software house che sia o produttrice di automobili; parlare a posteriori è facile, ma  fare le scelte giuste per tempo un po' meno .
Titolo: Re:Esecuzione parallela
Inserito da: DragoRosso - Giugno 19, 2023, 09:58:10 am
ci sono ancora le pagine dedicate a "kylix" e a "BC++", non ho mai capito le scelte di marketing che stavano dietro questi ed altri prodotti; e in effetti è proprio il marketing che decide poi il destino di un'attività produttiva, software house che sia o produttrice di automobili; parlare a posteriori è facile, ma  fare le scelte giuste per tempo un po' meno .

Bhè diciamo che sono stati dei tentativi di fare concorrenza a Visual Studio di Microsoft, allora agli albori e nella bufera per lo stacco totale dal passato (abbandono di VB6), usando gli stessi strumenti (.net framework). Poi abbiamo visto come sono progredite le cose (NB: ci sono ancora tracce di Kylix nei sorgenti di Delphi).

Sinceramente non mi preoccupano gli abbandoni, anche se fanno un pò di nostalgia, ma mi preoccupa di più non vedere nulla di nuovo e fortunatamente su questo fronte direi che si muove sempre qualcosa.

Ne Delphi ne Lazarus stanno solo a guardare.

Ciao