* * * *

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 28, 2024, 05:08:24 pm

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

315 Visitatori, 0 Utenti

Autore Topic: form da thread secondario  (Letto 6652 volte)

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
form da thread secondario
« il: 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

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:form da thread secondario
« Risposta #1 il: 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);
Imagination is more important than knowledge (A.Einstein)

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:form da thread secondario
« Risposta #2 il: 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

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:form da thread secondario
« Risposta #3 il: Novembre 27, 2015, 01:04:13 pm »
hai provato con :


Codice: [Seleziona]
Synchronize(FR_Principale.Allarme(OutDg));
Imagination is more important than knowledge (A.Einstein)

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:form da thread secondario
« Risposta #4 il: 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>"


nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:form da thread secondario
« Risposta #5 il: 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
Imagination is more important than knowledge (A.Einstein)

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:form da thread secondario
« Risposta #6 il: 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

SB

  • Scrittore
  • Sr. Member
  • *****
  • Post: 283
  • Karma: +1/-0
Re:form da thread secondario
« Risposta #7 il: Novembre 29, 2015, 10:27:36 am »
Usa i messaggi, sono ideali per questi meccanismi

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:form da thread secondario
« Risposta #8 il: Novembre 30, 2015, 11:25:08 am »
SB, se te la senti potresti scrivere un tutorial sulla programmazione multi thread o più di uno.
Ieri è passato, domani è futuro, oggi è un dono...

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:form da thread secondario
« Risposta #9 il: 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

SB

  • Scrittore
  • Sr. Member
  • *****
  • Post: 283
  • Karma: +1/-0
Re:form da thread secondario
« Risposta #10 il: 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

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:form da thread secondario
« Risposta #11 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:form da thread secondario
« Risposta #12 il: 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

 

Recenti

How To

Utenti
Stats
  • Post in totale: 18781
  • Topic in totale: 2235
  • Online Today: 320
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 315
Total: 315

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.