* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 25, 2024, 07:55:51 am

Inserisci il nome utente, la password e la durata della sessione.

54 Visitatori, 0 Utenti

Autore Topic: Esecuzione parallela  (Letto 3387 volte)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1401
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Esecuzione parallela
« Risposta #15 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Avogadro

  • Full Member
  • ***
  • Post: 217
  • Karma: +0/-0
Re:Esecuzione parallela
« Risposta #16 il: Giugno 17, 2023, 05:10:49 am »
 :)

Grazie.

ps

non ci avevo fatto caso:

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


« Ultima modifica: Giugno 17, 2023, 09:06:18 pm da Avogadro »

bonmario

  • Hero Member
  • *****
  • Post: 1360
  • Karma: +11/-1
Re:Esecuzione parallela
« Risposta #17 il: 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

tito_livio

  • Full Member
  • ***
  • Post: 173
  • Karma: +4/-0
Re:Esecuzione parallela
« Risposta #18 il: 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?

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1401
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Esecuzione parallela
« Risposta #19 il: 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
« Ultima modifica: Giugno 17, 2023, 11:02:04 am da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

tito_livio

  • Full Member
  • ***
  • Post: 173
  • Karma: +4/-0
Re:Esecuzione parallela
« Risposta #20 il: Giugno 17, 2023, 12:26:07 pm »
Ok, grazie DragoRosso

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1401
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Esecuzione parallela
« Risposta #21 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Avogadro

  • Full Member
  • ***
  • Post: 217
  • Karma: +0/-0
Re:Esecuzione parallela
« Risposta #22 il: 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 ?
« Ultima modifica: Giugno 17, 2023, 09:21:42 pm da Avogadro »

quack

  • Jr. Member
  • **
  • Post: 84
  • Karma: +7/-0
Re:Esecuzione parallela
« Risposta #23 il: 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;
SO: Fedora\W10
Lazarus: Trunk
FPC: Trunk\3.2.2

Avogadro

  • Full Member
  • ***
  • Post: 217
  • Karma: +0/-0
Re:Esecuzione parallela
« Risposta #24 il: 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
« Ultima modifica: Giugno 18, 2023, 04:42:57 am da Avogadro »

quack

  • Jr. Member
  • **
  • Post: 84
  • Karma: +7/-0
Re:Esecuzione parallela
« Risposta #25 il: 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
SO: Fedora\W10
Lazarus: Trunk
FPC: Trunk\3.2.2

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1401
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Esecuzione parallela
« Risposta #26 il: 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 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Avogadro

  • Full Member
  • ***
  • Post: 217
  • Karma: +0/-0
Re:Esecuzione parallela
« Risposta #27 il: Giugno 18, 2023, 07:24:34 pm »

Origine: 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. 
 
« Ultima modifica: Giugno 18, 2023, 07:30:58 pm da Avogadro »

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1401
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Esecuzione parallela
« Risposta #28 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Avogadro

  • Full Member
  • ***
  • Post: 217
  • Karma: +0/-0
Re:Esecuzione parallela
« Risposta #29 il: 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 .
« Ultima modifica: Giugno 18, 2023, 11:58:52 pm da Avogadro »

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19189
  • Topic in totale: 2289
  • Online Today: 51
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 54
Total: 54

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.