Newsgroup: it.comp.programmare.win32
Titolo: COM multithread

Buondí,
    qualche esperto mi puó dare indicazioni sulla malefica struttura COM ?
Il mio problema é il seguente:
voglio costruire un controllo com per consultare una archivio di dati. Il
caricamento dell'archivio in memoria é una operazione lunga e onerosa in
termini di memoria quindi pensavo di mettere i dati in variabili static in
modo da caricare i dati una volta per tutte al primo caricamento del COM.
Vorrei poi che i dati caricati quando il primo client inizializza il primo
com fossero poi visibili a tutti i client successi (altri thread e altri
processi) che richiamano lo stesso COM.
Domanda: qual'é il tipo di com che devo utilizzare (free ? apartament ?) ?
ciao e grazie per la risposta
   ste

 Domanda: qual'é il tipo di com che devo utilizzare (free ? apartament ?) ?
Il modello di appartamento che userai non e` strettamente legato alle
esigenze che sopra specifichi in dettaglio, bensi` ai trade-off che vorrai
farti tu fra fatica di implementazione e prestazioni per i clienti.
Venendo anzitutto alle tue specifiche: devi fare un servente "local",
che viva in una EXE.  Evita (parlo per esperienza pratica...!) la
pattern "singleton": fai invece una semplicissima classe multiuse che
ritorna ai clienti oggetti *state-less*, e mantieni lo stato in un'unica
copia.  Ricorda di fare la RegisterClassObjects *PRIMA* di iniziare
l'operazione lunga e faticosa del caricamento-dati della prima
volta, nello startup del tuo programma, perche` c'e` un timeout
sul tempo di risposta; l'attesa verra` cosi`, "di natura", alla prima
richiesta effettiva che un cliente rivolge a uno dei tuoi oggetti,
NON alla _creazione_ di quell'oggetto che e` la parte soggetta a
time-out!
Se scegli il modello "single-threaded", il COM si occupa cortesemente
di serializzare per tuo conto tutte le richieste; lo fa creando una
finestra nascosta e usando la sua coda di messaggi, quindi non ti
scordare di servire la tua coda di messaggi anche se _pensi_ di non
avere finestre:-).
Simile serializzazione si ha nel modello "apartment-threaded", ma
solo per molteplici richieste *allo stesso oggetto*, NON per richieste
ad oggetti che vivono in diversi appartamenti.  Se diversi oggetti
devono condividere lo stesso stato, dovrai quindi gestire tu stesso
la sincronizzazione fra le loro operazioni (ad esempio con critical
section, ma ATTENTO ai deadlock se hai rientranza...!!!).  Il
modello "free-threaded" (tipicamente in forma "both" nell'ATL)
pone la stessa esigenza anche per richieste allo stesso oggetto,
quindi richiede ancora un po' piu` di furbizia di multithreading da
parte tua (e il multi-threading e` un casino comunque lo si rigiri,
quindi, se scegli questa strada e gia` non sei esperto nel campo,
auguri:-).
Alex


in pratica il mio database è un array di dati, come lo definisco
per non usare il singleton ( e quindi le variabili static), globale al
processo
COM ?
Il mio controllo verrà lanciato da IIS attraverso una pagina ASP,
a precindere dal cambio di proprietà (direi AspAllowOutOfProcComponents)
come faccio a precaricarlo in memoria senza che questo avvenga alla prima
chiamata ?
ste

 
Se non ricordo male e' possibile "instanziare" un componente  nel 
Global.asa allo "start" dell'applicazione ASP. Per le modalita' devi 
guardare la documentazione poiche' non ricordo come si fa.
Fausto

 chiamata ?
Ad esempio facendolo partire come "service" di NT.
Alex

 Sistema Operativo lo "swappi" su disco. OKKIO!!!
L'API VirtualLock esiste apposta per questo (e va usata in
congiunzione con SetProcessWorkingSize, naturalmente).
Ovviamente, se locki in memoria grandi quantita` di dati che non
servono davvero, le prestazioni calano invece di crescere.  Misurare
delle buone simulazioni di accesso "di produzione", e sintonizzare
di conseguenza tutto l'insieme, e` dunque MOLTO consigliabile!-)
Alex

 fini della gestione del caching...?
Si puo' sempre utilizzare algoritmi LRU misti con BTREE, incapsulati
in un'unico oggetto condiviso instanziato a livello di "application"
(per quanto riguarda le ASP). Con una tecnica del genere risparmierebbe
memoria ed otterrebbe un accesso rapido, senza dover allocare volumi 
di memoria eccessiva, "strozzando" un Web server.
Fausto