Newsgroup: it.comp.programmare.win32
Titolo: classi

ciao, ho scritto un'applicazione in Visual C++ composta da 10 dialog.
per interfacciare la porta seriale ho creato una classe Serial che viene
richiamata da tutte e 10 le dialog che ho creato.
il problema e' questo,e' sicuramente stupido per chi e' esperto, ma io
sto studiando adesso il C++ e ho dei limiti che non riesco a risolvere e
purtroppo non posso fermarmi perche' sto lavorando.
all'interno della classe c'e' una procedura che gira in loop fintanto
che una variabile booleana Semaforo e' FALSE;
io richiamo questa procedura sotto forma di thread all'interno della
InitDialog della prima finestra, vede se Semaforo e' FALSE e gira, gira.
il problema e' il seguente: quando apro la seconda finestra, dove c'e'
un'altra variabile di tipo Serial, questa va a modificare la variabile
Semaforo, ma il thread che e' partito con la prima finestra non se ne
accorge e continua a girare, giustamente perche' sono due istanze
diverse della classe e ognuna va per i fatti suoi...
quindi io all'interno della seconda finestra tento di accedere alla
seriale ma e' bloccata perche' il primo thread non si ferma...
il problema e' questo: ho bisogno che tutte e 10 le dialog richiamino la
stessa istanza della classe, anche perche' poi ho creato una procedura
all'interno della classe che prima di andare a scrivere sulla seriale mi
inizializza l'oggetto CRITICAL_SECTION per ordinare i vari thread che
vengono lanciati per andare a scrivere sulla seriale, questo per far si
che solo un thread alla volta vada a scrivere sulla seriale...
quindi se io creo dieci istanze della classe, avro' dieci
critical_section e quindi non riusciro' a sincronizzare l'accesso alla
seriale tra una dialog e l'altra...
Ho bisogno che tutte e 10 le dialog richiamino la stessa classe e non
ognuno la sua...
come posso fare???
ciao e grazie in anticipo, perche' sto un pochino in apprensione...
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 a écrit dans le message news:
f650ac474f9d24c8ed...@mygate.mailgate.org...

Potresti dichiarare static  la tua variabile di tipo Semaforo (cosi' come
tutte le variabili che vuoi che siano uniche per tutte le istanze della
classe Serial).
Di modo che anche se instanzi 10 oggetti di tipo Serial, hai i dati membro
dichiarati static in comune con tutte le instanze, e se varSemaforo e' FALSE
per una , sara' FALSE per tutte.
Oppure potresti trattare la tua classe Serial come un Singleton, ovvero come
una classe che e' possibile instanziare solo un numero limitato di volte (1
nel tuo caso, se vuoi solo 1 seriale).
Maurus

 Ciao e grazie dei consigli, pero' avevo anche un altro problema: all'interno della classe
  utilizzo una funzione che poi viene implementata come thread... per
evitare che le scritture sulla seriale
  si sovrappongano utilizzo, all'interno di questa procedura, l'oggetto
CRITICAL_SECTION,
  e questo mi ha costretto ad utilizzare solo un'istanza della classe...
  perche' ho visto che se ho piu' istanze ho piu' oggetti
CRITICAL_SECTION, a meno che non dichiaro anche questa come static...
  ho risolto il problema ( o almeno credo ) dichiarando all'interno
della prima dialog che viene creata
  una variabile di tipo della mia classe, Serial m_TheSerial e
utilizzando la parola chiave:
  extern Serial m_TheSerial negli altri file .cpp delle finestre
secondarie...
  in C ho utilizzato questo tipo di linkaggio delle variabili (con
l'extern), tu credi possa crearmi problemi???
  e se si quali pensi possano essere???
 
  ciao  e grazie in anticipo!!!


 a écrit dans le message news:
d672988196867e48c6...@mygate.mailgate.org...

Ciao,
invece di avere extern nei tuoi files puoi usare il concetto di Singleton
che prendo dal libro di Gamma e company "Design patterns"
// file singleton.h
class Singleton // oppure Serial oppure CRITICAL_SECTION
{
public:
    static Singleton* Instance();
protected:
    Singleton();
// il costruttore di Singleton non e' pubblico per impedire la sua
costruzione diretta
// ed obbligare il cliente a chiamare Instance()
private:
    static Singleton* _instance; // questo puntera' all'unico oggetto di
tipo Singleton
};
// file singleton.cpp
#include "singleton.h"
Singleton* Singleton::_instance = 0;
Singleton* Singleton::Instance ()
{
    if (_instance == 0)
        _instance = new Singleton;
    return _instance;
}
int main()
{
    Singleton *pSingFirst = Singleton::Instance();
//  ogni successivo tentativo di avere un'istanza di Singleton, avra' come
risultato lo stesso indirizzo
//  dell'oggetto Singleton gia' creato
    Singleton *pSingSecond = Singleton::Instance();
    // pSingFirst e pSingSecond punteranno allo stesso oggetto.
    return 0;
}
Per cui puoi usare questo concetto per le tue classi di Serial e di
CRITICAL_SECTION invece di avere quegli extern.
Maurus