Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Diego1981 - Novembre 27, 2015, 11:00:15 am

Titolo: form da thread secondario
Inserito da: Diego1981 - Novembre 27, 2015, 11:00:15 am
Ciao a tutti
volevo capire come mai se da un thread "secondario" scateno scateno l'evento di creare una form e di mostrarla in modale mi da come errore "CheckSynchronize called from non-main thread"
mentre se la la mostro non in modale inizia un loop infinito (e a dire il vero non ho capito bene di quale thread  :-[)
grazie
Titolo: Re:form da thread secondario
Inserito da: nomorelogic - Novembre 27, 2015, 11:05:07 am
in generale il thread che si occupa del disegno dell'applicazione è sempre e solo il main thread
per fare queste operazioni devi invocarle attraverso Synchronize

ad esempio:

Synchronize(MostraFormModale);
Titolo: Re:form da thread secondario
Inserito da: Diego1981 - Novembre 27, 2015, 11:22:33 am
grazie nomore ma qualcosa non mi torna, non riesco a capire quando usare il synchronize

dal thread secondario l'ancio , in un determinato momento la procedura "allarme" quindi:

FR_Principale.Allarme(OutDg);

nel thred principale ho:(e questo genera l'errore)

procedure TFR_Principale.Allarme(NOutCom: Integer);
begin
  if FR_Antifurto=nil then
     begin
        Application.CreateForm(TFR_Antifurto,FR_Antifurto);
        FR_Antifurto.AfOut:=NOutCom;
        TFR_Antifurto.showmodal
        FreeAndNil(FR_Antifurto);
     end;
end;

grazie
Titolo: Re:form da thread secondario
Inserito da: nomorelogic - Novembre 27, 2015, 01:04:13 pm
hai provato con :


Codice: [Seleziona]
Synchronize(FR_Principale.Allarme(OutDg));
Titolo: Re:form da thread secondario
Inserito da: Diego1981 - Novembre 27, 2015, 01:06:57 pm
si ma

uprincipale.pas(818,55) Error: Incompatible type for arg no. 1: Got "untyped", expected "<procedure variable type of procedure of object;Register>"

Titolo: Re:form da thread secondario
Inserito da: nomorelogic - Novembre 27, 2015, 03:37:59 pm
credo il parametro da passare sia un indirizzo di un metodo (e quindi senza parametri)
prova a dichiarare un metodo nel thread che si chiama LanciaAllarme ed al suo interno metti il codice che serve
poi:
Codice: [Seleziona]
Synchronize(@LanciaAllarme);


leggi quì per maggiori informazioni
http://wiki.freepascal.org/Multithreaded_Application_Tutorial (http://wiki.freepascal.org/Multithreaded_Application_Tutorial)
Titolo: Re:form da thread secondario
Inserito da: Diego1981 - Novembre 27, 2015, 09:03:06 pm
ostici questi thread!! azz
ho letto oggi qui e la e mi sembra di aver capito che sia sempre meglio far aprire le form al thread principale....ora devo capire bene come.
come hai visto dal codice la procedura si trova nel thread principale solo che viene invocata dal tread secondario
purtroppo questi meccanismi mi sono sconosciuti e sarebbe interessante capirli
ciauz
Titolo: Re:form da thread secondario
Inserito da: SB - Novembre 29, 2015, 10:27:36 am
Usa i messaggi, sono ideali per questi meccanismi
Titolo: Re:form da thread secondario
Inserito da: xinyiman - Novembre 30, 2015, 11:25:08 am
SB, se te la senti potresti scrivere un tutorial sulla programmazione multi thread o più di uno.
Titolo: Re:form da thread secondario
Inserito da: Diego1981 - Novembre 30, 2015, 05:50:11 pm
Ciao Xiny e SB
per ora ho risolto utlizzando il syncronize, comunque sarebbe interessante capire i meccanismi dei thread
Per quanto rigurada i messaggi non so proprio nulla  :-[
grazie
Titolo: Re:form da thread secondario
Inserito da: SB - Dicembre 07, 2015, 07:52:12 am
SB, se te la senti potresti scrivere un tutorial sulla programmazione multi thread o più di uno.

C'è già molto materiale in proposito, anche nella wiki del FreePascal... ;)

La programmazione multithread è molto interessante, ma...
a creare thread ci vuole un attimo, a fare in modo che abbia senso creare thread (e che funzionino) ci vuole un bel po' di esperienza e di conoscenza dei meccanismi basilari di un sistema operativo...
Purtroppo non mi ritengo così esperto da poter insegnare agli altri come fare  :(
Al massimo posso esprimere un'idea
Titolo: Re:form da thread secondario
Inserito da: Stilgar - Gennaio 03, 2016, 03:43:35 pm
Ciao SB.
Non serve essere un esperto. Puoi sempre descrivere la tua esperienza.
Il problema dei thread, secondo la mia scarsa esperienza in proposito, è la sincronizzazione dei "risultati".
Per il resto è il processore che diventa matto con il cambio contesto ;)

Per rispondere alla domanda di Diego, il wrapper Freepascal dei thread alla fine lancia un beginthread su windows, ma credo siano simili anche per linux e le altre piattaforme supportate.
Il principio è: "chiamare un servizio del kernel del sistema operativo che crea una zona riservata della ram e altre cosine secondarie".
Per intenderci, quando lanci un processo, questo può essere visto come un thread "cicciotto". Questo thread principale può scatenarne altri di cui diventa il padre gerarchico. Chiudo il thread/processo i thread secondari vengono (o dovrebbero) chiusi dal kernel.

Il wrapper lazarus non permette l'uso dei parametri in chiamata, quello che devi usare è un "procedure of object"; semplice ed efficace.
Quando esegui opeazioni con il main thread (quello del processo per intenderci) devi "sinconizzarti". Questo è dovuto perchè stai facendo accesso ad una risorsa considerata condivisa. L'esempio più chiaro che mi viene in mente sulle risorse condivise è la stampante ad aghi.. prova a pensare a due thread che scrivono sulla stessa riga ... a parte il casino che farebbe la stampante (proprio a livello acustio), i contenuti sarebbero illeggibili. Quindi è si una risorsa condivisa, ma in tempi diversi.. ma qui si parla di preistoria.. quando si scriveva direttamente sul file virtuale ptn1 :D
Il principio però è lo stesso. Il monitor (o il canvas) dove vai a disegnare è bene che sia semaforizzato come accesso.. Altrimenti ti potresti trovare a disegnare subito prima della cancellazione della finestra.. non vedendo nulla ;)

Spero di aver chiarito il tuo dubbio sulla necessità di sincronizzare i thread prima di scrivere da qualche parte (monitor o stampante :D )
Stilgar
Titolo: Re:form da thread secondario
Inserito da: Diego1981 - Gennaio 05, 2016, 08:16:47 am
Ciao Stilgar
direi che il tuo esempio è molto chiaro ed è proprio perchè non conosco tecnicamente queste cose che ho avuto problemi comunque grazie