Salve,
ho la necessità di "trasmettere" dati tra 2 Raspberry collegati in rete, 1 dei 2 (chiamato "PowerPi") è collegato ad un SDM120C che misura i consumi elettrici domestici, l'altro (chiamato "TankPi") funge da controller per l'acquario che ho ed è equipaggiato con il display LCD 7" originale Raspberry.
Vorrei visualizzare i dati dei consumi su "TankPi" per cui ho pensato di aggiungere al software (Lazarus) che già funziona su "PowerPi" un TCP Server che risponda alle richieste di "TankPi" quando voglio visualizzare i dati dei consumi.
Ho trovato del codice di esempio su di un blog (http://pascalgeek.blogspot.com/2012/06/encryption-decryption-and-asynchronous.html (http://pascalgeek.blogspot.com/2012/06/encryption-decryption-and-asynchronous.html)) che fondamentalmente funziona ma ho fatto una piccola modifica al programmino originale "trasformando" il programma in un'applicazione "Form based", aggiungendo una ListBox a mo' di "log visuale" per vedere quando il client si connette al TCP server ed i dati che arrivano dal client.
Tutto funziona tranne quando, all'interno del Thread "TClientHandlerThread" (facendo riferimento al codice originale dell'autore), dopo la riga
Msg := FClientStream.ReadAnsiString;
ho aggiunto un:
logStr:= Msg;
Synchronize(@ScriviLog);
dove "ScriviLog":
Form1.ListBox1.Items.Add(logStr);
Sleep(1);
Application.ProcessMessages;
Quando il programma arriva su "Synchronize" si blocca un tempo infinito e non appare nulla sulla ListBox.
Non ho capito perchè...ho già usato i Threads e non ho mai verificato questo problema.
Da cosa può dipendere?
Grazie, saluti e Buon Anno !
Roberto
Supponendo che la form su cui si trova la listbox si chiama FrmMain dichiara una variabile di tipo stringa e la chiami miastringa. Poi sempre li crei una procedura (sempre pubblica) che prende il valore di mia stringa e la aggiunge alla listbox. Poi nel codice del thread usi un codice simile a quello che segue quando vuoi comunicare il messaggio (lo sostituisci a hello world). Ricordati che nella sezione public della form FrmMain deve essere dichiarata anche
CriticalSectionController : TRTLCriticalSection;
Nella formcreate usi questo codice
InitCriticalSection(CriticalSectionController);
e nella formdestroy usi
DoneCriticalsection(CriticalSectionController);
EnterCriticalsection(FrmMain.CriticalSectionController);
FrmMain.miastringa := 'hello world';
Synchronize(@FrmMain.ControllerAction);
LeaveCriticalsection(FrmMain.CriticalSectionController);