* * * *

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.
Aprile 30, 2025, 12:12:53 pm

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

183 Visitatori, 0 Utenti

Post recenti

Pagine: 1 ... 6 7 [8] 9 10
71
Lazarus e il web / Re:Servizio api rest
« Ultimo post da DragoRosso il Aprile 05, 2025, 07:08:35 pm »
Trovato , è proprio la presenza della unit interfaces nella uses che inserisce la libreria gtk2

E' quello che non deve esserci in un programma che gira come un daemon. L'unita INTERFACES è proprio quella che inserisce la LCL nel tuo runtime.
72
Lazarus e il web / Re:Servizio api rest
« Ultimo post da angman il Aprile 05, 2025, 04:59:29 pm »
Trovato , è proprio la presenza della unit interfaces nella uses che inserisce la libreria gtk2
73
Lazarus e il web / Re:Servizio api rest
« Ultimo post da angman il Aprile 05, 2025, 04:38:32 pm »
nel file di progetto lpr ho aggiunto negli uses la unit interfaces che dovrebbe risolvere tutte le dipendenze grafiche. Inoltre ho una altro progetto di prova che si compila ed inslalla senza problemi che apparentemente ha le stesse impostazioni
74
Lazarus e il web / Re:Servizio api rest
« Ultimo post da DragoRosso il Aprile 05, 2025, 01:57:24 pm »
Caberra-GTK è una libreria (GTK3) che viene usata non solo per gli aspetti grafici ma anche per gli aspetti "multimediali" come ad esempio il "click" di un pulsante o altro. Può essere che venga incluso da Lazarus comunque o che forse nelle tue unità ci sia qualche dipendenza a ciò.

Tieni presente che se usi Wayland potresti avere dei problemi con GTK....

Qui c'è la risposta al tuo problema ... : https://forum.lazarus.freepascal.org/index.php?topic=47155.0

EDIT: essenzialmente la risoluzione è compilare l'applicazione per QT invece che per il default GTK.
75
Lazarus e il web / Re:Servizio api rest
« Ultimo post da angman il Aprile 05, 2025, 12:03:06 pm »
Ciao, adesso si è evidenziato un altro problema. quando lancio il demone da debug mi segnala questo errore:
Gtk-Message: 11:59:18.197: Failed to load module "canberra-gtk-module"
Exception at 00000000004556AA: EFCreateError:
e se cerco di installarlo mi dice che il diaplay non è disponibile.
Ma io non sto usando nessun componente grafico e ho anche totlo i packege LCL e FCL dalle dipendenze del progetto
76
Lazarus e il web / Re:Servizio api rest
« Ultimo post da DragoRosso il Aprile 02, 2025, 10:16:06 am »
Per Windows c'è una bella risposta su StackOverflow: https://stackoverflow.com/questions/13454054/what-is-the-maximum-time-windows-service-wait-to-process-stop-request-and-how-to

E' abbastanza articolato il timeout, queste le casistiche:

1) Richiesta di STOP dallo SNAP-IN Utente (Gestore Servizi): 125 s. di timeout massimo;

2) In caso di Reboot o shutdown di Windows (e logout utente ?): generalmente 5 s. Il dato può essere modificato da una chiave del registro di sistema;

3) In tutti gli altri casi: 30 s. e il servizio stesso può richiedere l'estensione fino a 125 s. complessivi tramite l'API "RequestAdditionalTime(timeout)";

La massima attesa in tutti i casi sembra essere di 125 secondi, dopo di che il processo veine terminato "d'ufficio".

Ciao

EDIT: Aggiornamento, la richiesta di tempo aggiuntivo è un'API presente solo nel .NET framwork e non nelle API dirette di Windows. Sarebbe necessario verificare come .NET costruisce questa funzione. Non sono riuscito ad accedere a ulteriori informazioni in quanto ormai quasi tutta la documentazione di sviluppo di Microsoft è orientata a .NET e se non si hanno conoscenze abbastanza specifiche sull'argomento è complesso trovare le informazioni. Di certo è che tale funzione usa una interfaccia (tipo IHOST) definita nella classe "ServiceBase" praticamente l'interfaccia verso la SCM.
77
Lazarus e il web / Re:Servizio api rest
« Ultimo post da Mimmo il Aprile 02, 2025, 09:22:59 am »
EDIT: a proposito, in Windows se non vado errato dopo uno STOP il servizio viene comunque terminato dal sistema operativo se non risponde entro tot tempo (non ricordo quanto sia il tempo ma ho vago ricordo di un timing 45 secondi). Penso che anche in Linux sia così, quindi a maggior ragione puoi attendere con fiducia la sequenza di chiusura corretta al limite ci pensa mamma OS.
Se qualcuno conosce i timing per la chiusura dei servizi in Windows o in Linux risponda che è sempre utile saperlo.

Questa non la sapevo. Effettivamente pare che anche in linux ci sia un timeout di sistema e anche la possibilità di impostare un timeout specifico per il demone (nel corrispondente file .service) https://unix.stackexchange.com/questions/608453/systemd-shutdown-timeout-does-not-honor-timeoutstopusec. Il sistema manda un SIGKILL dopo aver atteso i secondi impostati https://manpages.ubuntu.com/manpages/bionic/en/man5/systemd.service.5.html.
A questo punto, esattamente come dici tu, con questo paracadute l'evento FDieDaemon diventa inutile e ci si può mettere in wait sul thread confidenti che prima o poi il servizio verrà tirato giù comunque.
78
Lazarus e il web / Re:Servizio api rest
« Ultimo post da DragoRosso il Aprile 01, 2025, 05:55:01 pm »
Ciao,
Invece il WaitFor sul thread lo eviterei perchè non c'è la possibilità di mettergli un timeout (o almeno non so come fare...), nel codice fpc del TThread fa un wait su un tempo "INFINITE" e non prende parametri. E' difficile valutare se c'è un rischio che poi rimanga tutto appeso in chiusura del demone/servizio.

Hai ragione sul fatto che non si possa inserire un timeout sul wait di un thread. Il codice l'ho scritto senza verificarlo.
Comunque che ci sia il wait o no il demone non terminerà se il thread rimane "appeso". Avrai il tuo processo comunque "orfano" in attesa del kill da parte dell'utente (sia in Windows che in Linux).

Quindi a mio parere conviene lasciare il wait "infinito" sul thread e assicurarsi che il thread termini di morte propria. Al limite puoi inserire dei messaggi di log da qualche parte in modo che se accade che si "inchiodi" vedi l'ultimo messaggio e sai il perchè.

Se c'è qualche thread che "deve" terminare, è necessario attendere che termini. E' inutile cercare di chiudere l'applicazione ignorando la cosa perchè comunque l'applicazione non si chiuderà.

Inoltre c'è da dire che se la fase di "destroy" segue una ben determinata sequenza (che molte volte è necessario per liberare le risorse in ordine) saltare un elemento per paura dell'attesa non è una buona mossa.

L'esempio tipico, che ho visto diverse volte accadere in altri software è che si libera ad esempio un evento o un semaforo in uso ad un thread (sono oggetti globali normalmente) senza attendere di liberare prima il thread stesso ... e opppppsssss l'applicazione non si chiude o crasha.

Come sempre ciò è un mio punto di vista.

P.S.: c'è comunque una super scorciatoia se si vuole bypassare tutto (la maggior parte delle volte funziona pure) ... exitprocess(0) ... e liberi come il vento.  ;D

Ciao

EDIT: a proposito, in Windows se non vado errato dopo uno STOP il servizio viene comunque terminato dal sistema operativo se non risponde entro tot tempo (non ricordo quanto sia il tempo ma ho vago ricordo di un timing 45 secondi). Penso che anche in Linux sia così, quindi a maggior ragione puoi attendere con fiducia la sequenza di chiusura corretta al limite ci pensa mamma OS.
Se qualcuno conosce i timing per la chiusura dei servizi in Windows o in Linux risponda che è sempre utile saperlo.
79
Lazarus e il web / Re:Servizio api rest
« Ultimo post da Mimmo il Aprile 01, 2025, 04:41:17 pm »
@Mimmo

Un consiglio per la parte di codice che indico qui sotto:

Ciao,
grazie per le ottimizzazioni. Hai assolutamente ragione sul fatto che il Terminate è meglio metterlo prima. A questo punto anche ResetEvent è meglio anticiparlo. Invece il WaitFor sul thread lo eviterei perchè non c'è la possibilità di mettergli un timeout (o almeno non so come fare...), nel codice fpc del TThread fa un wait su un tempo "INFINITE" e non prende parametri. E' difficile valutare se c'è un rischio che poi rimanga tutto appeso in chiusura del demone/servizio. Il Result possiamo pure buttarlo a True alla fine, tanto l'inherited non ha logica dentro..

Alla luce delle osservazioni, rimescolando di nuovo il codice, alla fine farei così:

Codice: [Seleziona]
function TWebServiceDaemon.Stop: Boolean;
begin
  FDaemonWorkerThread.Terminate;
  FDieDaemon.ResetEvent;
  FDaemonWorkerThread.LetsGoEvent.SetEvent;
  FDieDaemon.WaitFor(5000);
  Result:=true;
end;

Che ne dici?

80
Lazarus e il web / Re:Servizio api rest
« Ultimo post da DragoRosso il Marzo 31, 2025, 05:03:58 pm »
@Mimmo

Un consiglio per la parte di codice che indico qui sotto:
Codice: [Seleziona]
function TWebServiceDaemon.Stop: Boolean;
begin
  (* Originale
  Result:=inherited Stop;
  //Service stopped
  FDaemonWorkerThread.LetsGoEvent.SetEvent;
  FDieDaemon.ResetEvent;
  FDaemonWorkerThread.Terminate;
  FDieDaemon.WaitFor(5000);
  *)
  //Service stopped
  //Prima imposta il TERMINATE al THREAD
  FDaemonWorkerThread.Terminate;
  //Poi SETTA l'evento come hai fatto (visto che il THREAD ha un Wait all'infinito)
  //Se lo fai con la sequenza che avevi impostato originarimente, il TERMINATE poteva "arrivare" in ritardo e teoricamente il thread poteva ritornare ad attendere all'infinito
  //(in fondo hai uno sleep, quindi l'ipotesi è molto rara ... però).
  //in questo modo, come sente l'evento sei certo che il THREAD è già in stato di Terminate e si chiuderà dopo avere svolto il suo codice.
  FDaemonWorkerThread.LetsGoEvent.SetEvent;
  FDieDaemon.ResetEvent;
  //Perchè attendi questo ?
  //FDieDaemon.WaitFor(5000);
  //Attendi invece direttamente la fine del Working Thread
  FDaemonWorkerThread.WaitFor(5000);
  //Normalmente questa è l'ultima istruzione, però magari in Linux deve essere effettuata prima.
  Result := inherited Stop;
end;
Pagine: 1 ... 6 7 [8] 9 10

Recenti

How To

Utenti
Stats
  • Post in totale: 19727
  • Topic in totale: 2370
  • Online Today: 195
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 183
Total: 183

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.