Newsgroup: it.comp.lang.delphi
Titolo: Strano Errore

Ciao a Tutti
Ho un applicazione simil-server che mi funziona come distributrice di dati
attraverso socket INDY.
Dato che le informazioni da mostrare tra server e client erano molte ho
inserito nella finestra principale
(ed unica) un TPageControll.
All'interno dei singoli TabSheet non ho altro che griglie, labels, Memo
etc...
In alcuni casi mi succede che se provo a passare dalla visualizazione del
primo TabSheet al secondo
mi becco il seguente errore:
System Error
Code 1400
Handle di finestra non valido.
Ovviamente non succede SEMPRE ma solo raramente, salvo il fatto che per
rimettere a posto il tutto sono costretto a
riavviare l'applicazione (che invece dovrebbe funzionare tutto il giorno)
Il primo TabSheet comprende:
    4 TGroupBox
    20 TLabel
    12 TStaticText
    4 TMemo
    4 TEdit
Il secondo TbaSheet contiene:
    4 TLabel
    1 TMemo
    3 TStaticText
    1 TStringGrid
Se poteste darmi una mano o anche un indizio su dove andare a cercare il
problema ve ne sarei grato.
Ha ...dimenticavo:
Delphi 7.0 Enterprise (Build 4.453)
INDY 9.00.10
Ciao a tutti
Marco


Mars University: «Knowledge brings Fear»

No....avrei dovuto ?
"Marco Breveglieri" <ma...@NOSPAMabls.it> ha scritto nel messaggio
news:vylZb.261468$VW.10...@news3.tin.it...


 No....avrei dovuto ?
No, era solo per capire se poteva esserci un errore nel codice che avevi
eventualmente inserito per gli eventi che sono generati nel cambio di
pagina.
La situazione che hai presentato non sembra problematica, quindi tento
di indagare per capire meglio dove può essere la causa del tuo problema.
;-)
A tal proposito, ti chiedo questo: se hai disposto sul form dei
controlli visuali, ci sarà sicuramente un momento in cui tali controlli
vengono "popolati" con i dati che vuoi mostrare, giusto?
Quando viene eseguito questo codice? Una volta sola all'avvio
dell'applicazione?
So che alcuni componenti Indy possono essere collegati ad elementi
dell'interfaccia utente per mostrare informazioni di stato...hai
stabilito legami di questo tipo nella tua applicazione?


Ciao Marco e grazie per l'aiuto.
I componenti visuali vengono popolati in continuo in base ai dati
ricevuti e trasmessi, anche diverse volte al secondo.
In particolare il primo Tab presenta i dati ricevuti dai server
ed ha una frequenza di aggiornamento dati su TEdit e TMemo
di 30 - 40 dati ogni 5 / 6 secondi.
Il secondo Tab monitorizza le connessioni client e viene aggiornato
quando uno o + clients si collegano o scollegano (al momento
gestisce 20 clients ma ho fatto dei test con 300).
Per quanto riguarda Indy uso solamente :
 4 TIdTCPClient con relativi Thread di lettura
 1 TIdTCPServer
 1 TIdAntiFreeze
 1 TIdCompressionIntercept gollegato al TIdTCPServer
Non ho legato nessun componente visuale a componenti IB ma popolo
il tutto da codice.
Grazie ancora per l'aiuto e fammi sapere se ti viene in mente
qualche cosa
Ciao
Marco
"Marco Breveglieri" <ma...@NOSPAMabls.it> ha scritto nel messaggio
news:KJnZb.262200$VW.10...@news3.tin.it...


 [...]
Ok, ora la situazione è più chiara. ;-)
Siccome hai a che fare con componenti Indy di classe "server", non
vorrei che tu eseguissi degli aggiornamenti alla GUI sfruttando eventi
generati dai componenti server che lavorano in modalità multithreading.
Poichè la VCL non è progettata per lavorare in multithreading, salvo
qualche classe specifica, è possibile che si verifichino in questo modo
accessi concorrenti ai membri delle classi che rappresentano i controlli
visuali, generando errori difficilmente individuabili, soprattutto
durante il debugging, oppure apparentemente "casuali".
Magari usa elementi di sincronizzazione come Mutex oppure
CriticalSection, oppure invia dei messaggi personalizzati alla coda
dell'applicazione che facciano aggiornare i controlli visuali in modo
"sincrono" con il thread principale dell'applicazione stessa.
Ciao!
