Newsgroup: it.comp.programmare.win32
Titolo: Tragico problema con più sessioni aperte su Windows Xp

Salve a tutti,
non so se qualcuno si è già posto il problema in cui mi sono imbattuto io.
Vi spiego.
Il programma parte all'avvio del sistema e se con Xp accede l'utente pippo,
poi si sceglie 'cambia utente' ed accede pluto, ho che il mio programma è in
esecuzione due volte nei due diversi profili.
Primo problema:
Il programma accede ad un database e vi esegue delle operazioni che se
eseguite contemporaneamente da due istanze possono creare dei problemi.
Secondo problema:
Il programma si attiva alla connessione ad Internet e quindi nel momento in
cui mi connetto, tutte e due le istanze si attivano, creando un gran casino
nonchè a volte crash del programma stesso.
Esiste modo di sapere se il programma sta girando nell'account utente attivo
al momento?
C'è modo di sapere se ci sono altri account aperti e se su questi c'è il mio
programma in esecuzione.
Il programma funziona benissimo ma questa cosa proprio non l'avevo messa in
conto.
Idee?
Grazie
Michele
--

 esecuzione due volte nei due diversi profili.
cut.
Non puoi far controllare al tuo programma se c'e' un'altra istanza del
programma stesso gia' attiva.
Anche se questa e' attiva con un profilo differente potresti sempre
verificarlo o no?
Mi sembra che la FindWindow con il primo parametro passato ad hoc possa fare
al caso tuo, anche se non ti apre una finestra.
E' sufficiente che all'avvio del tuo programma tu faccia una chiamata a
GlobalAddAtom, controllando con la FindWindow che non ci sia la stessa
ClassName gia' attivata.
Maurus

 ClassName gia' attivata.
Ti ringrazio per la risposta ma purtroppo la tua soluzione non è sufficente
per il mio problema perchè l'applicazione si deve aprire normalmente nel
nuovo
profilo utente.
Quello che però più o meno deve eccadere è che le istanze aperte nei
profili attualmente non aperti si debbano praticamente "ibernare" e solo
l'istanza nel profilo attivo deve operare normalmente.
Non so se mi sono spiegato.
Quando mi connetto ad Internet, solo l'applicazione che gira nel profilo
dell'utente attivo deve rispondere all'evento.
Grazie perqualunque idea.
Michele

 Michele
Puoi definire e gestire un apposito messaggio custom tipo WM_HIBERNATE,
quando lo ricevi sospendi ogni attivita' critica del tuo programma, fino al
ricevimento di un altro messaggio custom mandato dall'applicazione che aveva
mandato il precedente al momento della chiusura (a catena, se ci sono piu'
di 2 istanze). Poi per la connessione basta che controlli prima di aprirla
se per caso non e' gia' stata attivata. L'accesso al DB andrebbe inoltre
regolato con un semaforo (metti che tu mandi il messaggio WM_HIBERNATE e poi
accedi al DB, ma c'era gia' un accesso in corso precedente non ancora
concluso...).
Luca


Grazie in ogni caso per l'idea che mi hai proposto.
Michele

queste entrino nel Db, ma soltanto quella attiva al momento deve operare.
In questo caso sei sicuro di non poter implementare il "lock"
dell'operazione critica a livello di db ? Voglio dire: supponendo che
vi siano 3 istanze del tuo programma aperte, se non accedono alla
funzione critica, possono lavorare normalmente.  Nel momento in cui
una di loro inizia a lavorare in modo critico si accerta si eseguire
un "lock" sui dati che le servono.  In questo modo, qualsiasi altro
programma che cerchi di sfruttare quei dati, per qualsiasi motivo,
trovera` che sono bloccati e ne dara` informazione all'utente.
A me sembra un modo piu` pulito (senza congelare e scongelare un bel
nulla), oltre che facilmente supportato dal DB.
-- 
Andrea Laforgia
#exclude <windows.h>

 ha scritto nel messaggio
news:ffEW9.23272$YG2.6...@twister1.libero.it...


 queste entrino nel Db, ma soltanto quella attiva al momento deve operare.
Se facessi gestire il DB da un processo a parte?
Lanci il processo gestore DB con la prima applicazione
e poi tutte le altre usano quello per accedere ai dati,
tramite la comunicazione fra processi. Intanto il gestore
DB tiene il conto di quante copie del programma sono in
esecuzione (tramite un meccanismo di registrazione per
esempio: prima di usare il DB un prog deve fare il "login")
e quando terminano tutte termina pure lui (puoi fargli
fare un polling ogni tot secondi, per esempio). Per il
problema delle sessioni attive, forse dico una bestialità
ma nei dati di sistema di ogni processo non c'è anche l'utente
che lo ha lanciato? Se l'utente associato al processo è
= all'utente correntemente attivo, il gestore DB permette
l'accesso, altrimenti no...

 nulla), oltre che facilmente supportato dal DB.
Non esiste una qualche API a cui poter chiedere: "Sto girando nel
profilo attualmente in uso?"
Mi risolverebbe tutti i problemi.
Grazie

 ha scritto nel messaggio
news:5af2f9c8.03012...@posting.google.com...

non so se può essere utile ma prova a guardare su MSDN questa (solo per XP):
    WTSRegisterSessionNotification
dovrebbe mandare messaggi all'applicazione ogni qual volta la sessione
cambia (se ho capito bene)
Pela