Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Dicembre 21, 2012, 07:58:26 am

Titolo: Capire se una procedura o una funzione sta girando in un thread
Inserito da: bonmario - Dicembre 21, 2012, 07:58:26 am
Ciao a tutti,
temo di sapere gà la risposta, ma vale la pena tentare ...
Una procedura/funzione che può essere richiamata da vari programmi, può capire se sta girando in un thread?

Grazie in anticipo, Mario
Titolo: Re:Capire se una procedura o una funzione sta girando in un thread
Inserito da: Microges2000 - Dicembre 21, 2012, 08:03:52 am
Allora conta che qualsiasi oggetto è un thread separato, quindi no in quanto già fa parte di un thread.
Poi se intendi un oggetto TThred la risposta è ancora no a patto che semafori la procedura richiamandola con una flagbooleana come OkStoInUnThread o similari.

Ovviamente se fai una cosa simile (all'interno del thread)

Codice: [Seleziona]
Procedure MyThread.Execute;
Begin
   Repeat
     DentroThread := True;
     <qui' le tue chiamate>
     DentroThread := False;
   Until Terminated;
End;

dove DentroThread è una booleana globale non va bene lo stesso in quanto un altro oggetto puo' benissimo chiamare la tua procedura mentre la variabile è True
Titolo: Re:Capire se una procedura o una funzione sta girando in un thread
Inserito da: bonmario - Dicembre 21, 2012, 08:30:37 am
Grazie per la risposta ... in effetti avevo poche speranze !!!
Il "fatto" è che ho scoperto i thread solo da qualche mese. Nel frattempo ho tonnellate di procedure/funzioni scritte negli anni che utilizzo per svariati motivi che, per non far sembrare il programma bloccato, ogni tanto lanciano una Application.ProcessMessages.
Le stesse uty, lanciate dentro un thread, lo fanno terminare nel momento in cui eseguono la Application.ProcessMessages. Speravo di poter evitare di aggiungere un parametro a tutte queste procedure per gestire la cosa.

P.S. Nel metodo che mi hai consigliato tu, se DentroThread fosse una booleana residente in una unit, funzionerebbe lo stesso?

Ciao e grazie, Mario
Titolo: Re:Capire se una procedura o una funzione sta girando in un thread
Inserito da: Microges2000 - Dicembre 21, 2012, 10:29:26 am
No non funzionerebbe.

Cerca di pensare il programma cosi':

Il main chiama l'oggetto primaro (primo thread), ogni oggetto chiamato è un thrread a se stante oltre a quelli (oggetti TThread) che hai dichiarato tu.
Alla fine hai almeno un 8-10 thread che girano contemporaneamente dove gli oggetti TThread non sono controllabili in quanto dotati di "vita propria" mentre gli oggettti che usi si
Titolo: Re:Capire se una procedura o una funzione sta girando in un thread
Inserito da: bonmario - Marzo 03, 2016, 01:49:28 pm
Girovagando nei sorgenti di FPC 3.0.0 per altri motivi, credo di aver trovato la risposta alla mia domanda:
Codice: [Seleziona]
    if (GetCurrentThreadID = MainThreadID) then begin
      La procedura sta girando nel thread principale
    end else begin
      La procedura sta girando in un thread secondario
    end;

Per il momento l'ho testata sotto Windows XP in un paio di programmi e funziona alla grande.
Stasera la testo su Linux.

Ciao, Mario
Titolo: Re:Capire se una procedura o una funzione sta girando in un thread
Inserito da: bonmario - Marzo 03, 2016, 06:32:17 pm
Ho appena provato sul mio Ubuntu 64 bit e funziona anche con Linux !!!!

Se qualcuno ha voglia e tempo di fare un test anche con altre versioni di FPC o sistemi operativi, magari avremmo una ulteriore conferma.

Grazie, MArio
Titolo: Re:Capire se una procedura o una funzione sta girando in un thread
Inserito da: doc - Marzo 27, 2021, 10:52:13 pm
Funziona anche con Debian (v. 10.9)  ;D   e con winzozz 10; macchine a 64bit.  ;)
FPC v. 3.2.0.