Newsgroup: it.comp.os.linux.development
Titolo: Invio eventi e Thread

Ciao Pinguini,
sono di fronte ad un bel problema in C++ che proprio non riesco a risolvere.
La situazione e' questa: l'applicazione e' suddivisa in 2 thread, uno si 
occupa di creare uno stream audio ed ha alta priorita',mentre l'altro si 
occupa dell'interfaccia grafica.
Il problema e' che devo aggiornare l'interfaccia grafica in 
corrispondenza a quanto accade nell'altro thread.
Attualmente la GUI viene aggiornata tramite una marea di timer, che ogni 
tot di tempo aggiornano i dati visualizzati. Ovviamente e' una soluzione 
funzionante ma abbastanza stupida e pesante per la cpu...
La seconda soluzione e' quella in cui il thread ad alta priorita' 
"lancia degli eventi" all'altro thread e di conseguenza permette
l'aggiornamento della gui solo quando realmente qualcosa e' cambiato.
L'idea e' buona (almeno sembra...) ma ho grossi problemi nel realizzarla.
Esiste qualche tecnica o libreria (ovviamente per linuzzo) che puo' 
permettermi l'invio di eventi tra thread diversi?
-- 
Alessandro <Comix> Cominu
http://hydrogen.sf.net
e-mail: 
co...@despammed.com
Icq: 116354077
Linux User # 203765
[...Codito Ergo Sum...]

 permettermi l'invio di eventi tra thread diversi?
Quella semplice e` usare delle variabili condizionali:
struct event {
        int what;
        pthread_mutex_t lock;
        pthread_cond_t new_event;
} events = {0, PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER};
--- thread 1 ---
extern struct event events;
void *thread(void *a) {
        /* ... */
 
        pthread_mutex_lock(&events.lock);
        events.what = ON_FIRE;
        pthread_cond_signal(&events.new_event);
        pthread_mutex_unlock(&events.lock);
 
        /* ... */
}
--- GUI ---
extern struct event events;
void *gui(void *a) {
        pthread_mutex_lock(&events.lock);
        while(1) {
                pthread_cond_wait(&events.new_event, &events.lock);
 
                switch(events.what) {
                case ON_FIRE:
                        printf("Aiee, PC on fire!\n");
                        abort();
                }
        }
}
---
Problema: la GUI deve essere molto  veloce nel fare quello che gli viene
richiesto, perche` nel  ciclo while(1) ha il lock sulla  struct e quindi
il  thread ad  alta priorita`  potrebbe rimanere  bloccato in  attesa di
segnalare qualche altro evento. Potresti risolvere (in parte) cosi`:
while(1) {
        pthread_cond_wait(&events.new_event, &events.lock);
        tmp = events.what;
        pthread_mutex_unlock(&events.lock);
        switch(tmp) {
                /* ... */
        }
        pthread_mutex_lock(&events.lock);
}
Cosi` riduci il tempo durante il  qualche la struttura e` bloccata dalla
GUI, ma rischi di perdere gli eventi segnalati mentre non hai il lock.
L'alternativa sono  le code di messaggi  SysV: con quelle non  rischi di
perdere messaggi,  ma (IMHO) sono  piu` brutte da usare. Per  i dettagli
vedi man 5 ipc.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
I went to God just to see
And I was looking at me
Saw heaven and hell were lies
When I'm God everyone dies

 vedi man 5 ipc.
Io non ho mai usato i thread (prima o dopo li devo imparare :)) pero' le 
code di messaggi si, non sono poi cosi' male. Ma non si possono usare solo 
con processi separati (ovvero ognumo col suo pid) ? Mi pare che i thread 
(di cui non so nulla) siano un cosa diversa.
Nicola.
-- 
chi va pian va san e va lontan

 (di cui non so nulla) siano un cosa diversa.
Finche` usi la libreria linuxthread non ci sono problemi, ogni thread ha
un proprio pid ed e` dal punto  di vista del kernel un processo autonomo
(con qualche  particolarita`). In effetti  il problema  potrebbe sorgere
con librerie che usano degli user space threads (tipo la libreria NGTL),
in questo caso  non so le code di messaggi  funzionerebbero (ma penso di
si`, in fondo per accedere ai messaggi basta avere l'id corretto...).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"La Via prosegue senza fine."
	Bilbo Baggins - Il Signore degli Anelli - J.R.R. Tolkien

 si`, in fondo per accedere ai messaggi basta avere l'id corretto...).
Ok, vedo che la cosa diviene complicata :P. Prima mi studio i thread per 
bene.
Grazie, Nicola.


 L'idea e' buona (almeno sembra...) ma ho grossi problemi nel realizzarla.
...
Il thread "master" puo' buttare un gtk_signal_emit_o_come_si_chiama al
widget gtk in questione (usi GTK? o me lo sono sognato?)
Oppure sempre lo stesso thread puo' buttare un segnale standard al thread
GUI. Questa seconda strada non e' proprio lineare e se ti attira bisogna
approfondire un poco.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
           -<! GOD is real, unless declared as integer !>-