Newsgroup: it.comp.programmare.win32
Titolo: Processi cooperanti: come fare?

Sono alle prime armi con il C++
Con quali funzioni posso realizzare, in ambiente windows, una cooperazione
tra 2 processi?
Volevo far condividere a questi 2 processi un array, che utilizzo come coda
per uno scambio di messaggi tra i 2.
In pratica un processo produce informazione e l'altro la riceve.
Naturalmente li devo sincronizzare tra di loro.
Riassumendo vi chiedo:
1) con quale funzione creo un processo?
2) come posso far condividere ad entrambi un array?
3) come faccio a far scambiare messaggi tra i 2 processi?
Vi ricordo che sto programmando in ambiente windows, con il visual studio 6.
Spero in un vostro aiuto...
Grazie mille! Ciao.
Tommy

Domanda: perchè proprio due processi? Perchè non due thread?
E' possibile condividere dati fra processi, ma è decisamente + semplice
farli condividere ai thread (sono anche meglio sincronizzabili).

 ha scritto nel messaggio
news:xz0ea.29782$%p6.20...@news.edisontel.com...


 come coda per uno scambio di messaggi tra i 2.
usa una pipe. Vedi CreateNamedPipe()
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.0. C, C++ and ASM developers
                               and beta testers are welcome!

Tommy ha scritto:
: Va benissimo anche tra 2 thread...come faccio?
: Grazie. Ciao.
:
: Tommaso
Per creare i thread, CreateThread() in cui puoi specificare l'indirizzo
delle routine dei sottoprocessi (presumibilmente il codice di gestione dei
dati condivisi, che dovranno essere dichiarati come variabili statiche).
Quindi dipende dal tipo di gestione che desideri sui dati condivisi. Le
primitive di sincronizzazione piu' semplici sono le Sezioni Critiche
(CriticalSection).
Con quattro primitive e una struttura dati te la cavi:
InitializeCriticalSection (), EnterCriticalSection(),
LeaveCriticalSection(), DeleteCriticalSection(). Ovviamente la
EnterCriticalSection() protegge il codice condiviso (va lanciata prima di
accedere all'array), mentre la LeaveCriticalSection() va lanciata dopo aver
operato sull'array.
Una gestione piu' raffinata potrebbe basarsi sui semafori, sui mutex o
addirittura sugli eventi, ottenendo una gestione anche interprocesso.
susanna

 ha scritto nel messaggio
news:Xns9343E8DB...@127.0.0.1...


 dati condivisi, che dovranno essere dichiarati come variabili statiche).
???

Nuitari ha scritto:
:: (presumibilmente il codice di gestione dei
:: dati condivisi, che dovranno essere dichiarati come variabili statiche).
:
: ???
Se il problema e' sincronizzare due o piu' sottoprocessi (thread),
normalmente tale sincronizzazione e' richiesta per non incorrere in corse
critiche su risorse condivise, ovvero per evitare che un sottoprocesso
'scriva' su un buffer mentre quest'ultimo e' gestito da un altro
sottoprocesso. Cio' succede dato che i due thread sono schedulati
autonomamente, senza alcun 'rispetto' da parte del sistema operativo.
Spesso la risorsa condivisa ha la forma di un array.
Se cosi' e', questo array deve essere visibile (e accessibile) da entrambi i
sottoprocessi, che equivale a dire: trattasi di variabile globale statica.
I due sottoprocessi (thread), infatti, hanno la forma di subroutine,
ancorche' con prototipo speciale, pertanto accedono ad un array solo se
l'array e' dichiarato nell'area di memoria statica (variabile globale) del
processo.
susanna

Conosco bene le necessità di sincronizzazione dei Thread, sono anni che
programmo soft multithread.
I miei punti di domanda, come il quote doveva far capire, erano riferiti al
solo fatto che hai detto che le variabili dovevano essere dichiarate come
statiche.
Dato che in C/C++ le variabili statiche sono variabili definite tramite
l'apposita keyword, dire una cosa simile è fuorviante, dato che non è
assolutamente necessario. Perchè una variabile sia accessibile a + thread
dello stesso processo è sufficiente definirla nello scope globale.
Dalla tua risposta ho capito che per statico intendevi globale, ma ripeto,
questo è fuorviante.

Nuitari ha scritto:
: Conosco bene le necessità di sincronizzazione dei Thread, sono anni che

Riferendosi ad un linguaggio in particolare (le Api possono essere chiamate
da molti ambienti e con molti linguaggi differenti) la parola static diventa
un elemento di sintassi che assume significati anche differenti; in C/C++ ce
ne sono almeno due, a seconda che siano dichiarate all'interno di un blocco
o fuori da ogni blocco.
Se non si fa riferimento a nessun linguaggio in particolare, una variabile
statica e' una variabile che viene allocata nell'area dati e deallocata solo
al termine del runtime. Che debba essere in scope per chi intenda
referenziarla, era ovvio.
susanna

Mi spiace insistere, ma ti invito a rileggere il primo post, la domanda era
chiaramente riferita al
C++ ed in C++ una variabile statica è una variabile dichiarata tramite
"static", il che non influenza solo il momento
dell'allocazione/disallocazione, ma determina anche l'inizializzazione (la
quale avviene automaticamente) ed il linkaggio (le variabili globali static
sono limitate alla unit d'appartenenza).
Considerata la natura del problema, direi che quel che deve fare il nostro
amico è definire una normalissima variabile globale liberamente utilizzabile
in qualsiasi thread, quindi.
Ripeto, anche se intendevi altro e cmq non necessariamente sbagliato, quel
che hai detto è fuorviante, in quanto potrebbe portare in C++ alla
dichiarazione d'una variabile static con tutto quel che ne consegue.

al termine del runtime. 
Se non si fa riferimento a nessun linguaggio in particolare,
l'espressione "variabile statica" ha poco senso.  L'aggettivo
"statica" sta, appunto, ad indicare una qualità precisa, attribuita da
un determinato linguaggio di programmazione, altrimenti per "statica"
io potrei anche intendere "sta lì e non si muove" ;-)
-- 
Andrea Laforgia
www.geocities.com/andrealaforgia
"640kb of memory should be enough for anyone." -- Bill Gates.

Andrea Laforgia ha scritto:
:: Se non si fa riferimento a nessun linguaggio in particolare, una
:: variabile statica e' una variabile che viene allocata nell'area dati e
:: deallocata solo al termine del runtime.
:
: Se non si fa riferimento a nessun linguaggio in particolare,
: l'espressione "variabile statica" ha poco senso.
Dissento.
Variabile statica e' termine sufficientemente chiaro e sensato, anche senza
alcun riferimento ad un linguaggio particolare...
: L'aggettivo
: "statica" sta, appunto, ad indicare una qualità precisa, attribuita da
: un determinato linguaggio di programmazione, altrimenti per "statica"
: io potrei anche intendere "sta lì e non si muove" ;-)
... suo primo e immediato significato (-8.
susanna

 l'espressione "variabile statica" ha poco senso.
tutt'altro. Definisce quale dei tre metodi di allocazione è stato usato 
(statico, dinamico o automatico), e decide da dove verrà effettivamente 
allocata la memoria (.data, heap e stack) e il lifetime della variabile


alcun riferimento ad un linguaggio particolare...
Come già detto, "variabile statica" non significa nulla.


Juliet ha scritto:
: nonostante quello che potrebbe dire il mio nick, sono Juliet. Ah, quasi
: dimenticavo, Andrea Laforgia ha scritto:
:
::: Se non si fa riferimento a nessun linguaggio in particolare, una
::: variabile statica e' una variabile che viene allocata nell'area
::: dati e deallocata solo al termine del runtime.
:: Se non si fa riferimento a nessun linguaggio in particolare,
:: l'espressione "variabile statica" ha poco senso.
:
: tutt'altro. Definisce quale dei tre metodi di allocazione è stato usato
: (statico, dinamico o automatico), e decide da dove verrà effettivamente
: allocata la memoria (.data, heap e stack) e il lifetime della variabile
Era un po' quello che cercavo di spiegare, ma non ci sente!
(-8
susanna



Susanna, sei tu che non ci senti, il mio udito è perfetto.
Ho scritto che parlare di variabile "statica" A PRESCINDERE DA
QUALSIASI LINGUAGGIO non ha senso.  Che C/C++ diano alla parola chiave
"static" un significato preciso lo so bene, in quanto conosco bene sia
il C, che il C++.  Tra l'altro la parola chiave "static" del C/C++ non
implica assolutamente nulla, al contrario di quanto erroneamente
scritto da Juliet, in quanto ad allocazione dinamica sullo heap o
sullo stack.  Per la cronaca: leggo quanto scritto da Juliet, solo
perché lo riporti tu. 


Andrea Laforgia ha scritto:
: Susanna, sei tu che non ci senti, il mio udito è perfetto.
: Ho scritto che parlare di variabile "statica" A PRESCINDERE
: DA QUALSIASI LINGUAGGIO non ha senso.  Che C/C++ diano
: alla parola chiave "static" un significato preciso lo so bene, in quanto
: conosco bene sia il C, che il C++.  Tra l'altro la parola chiave "static"
: del C/C++ non implica assolutamente nulla, al contrario di
: quanto erroneamente scritto da Juliet, in quanto ad allocazione dinamica
: sullo heap o sullo stack.  Per la cronaca: leggo quanto scritto da Juliet,
solo
: perché lo riporti tu.
Uhoh, devo aver sollevato un piccolo coperchio: mi chiamo *immediatamente*
fuori.
Tra l'altro avevo in effetti sorvolato che la richiesta originale riguardava
C/C++; ma 'variabile statica' continuera' a rimanere nel mio vocabolario,
sia quando parlo di C che di assembler.
susanna
NB.
Un colpetto con Google (ad esempio con "static memory allocation" o
semplicemente "static memory") potrebbe riservarti qualche sorpresa, del
tipo, a caso:
"The allocation of memory for the specific fixed purposes of a program in a
predetermined fashion controlled by the compiler is said to be static memory
allocation."
ovvero
"Static variables are those that are created in the declaration section of a
program and continue to exist (whether visible or not) and to require that
space until its conclusion. Their space is allocated at the beginning of the
program run."

In questi giorni non ho potuto testare i vostri preziosi consigli, ma ora mi
metto a provare :)
Cmq quando č stato parlato di variabili statiche, avevo inteso il tipo
static del C++.
Insomma, per avere un array condiviso č sufficiente dichiararlo subito
all'inizio del main(), nello scope principale, č cosě?


Prima di Main, all'esterno di tutto. Esempio:
#include <windows.h>
#include <vector>
using namespace std;
vector< INT > mySharedVector;
DWORD WINAPI myThread(LPVOID ThreadContext)
{
    ...
}
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, INT
nShowCmd)
{
    ...
}