Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
DJI Osmo Nano: la piccola fotocamera alla prova sul campo
DJI Osmo Nano: la piccola fotocamera alla prova sul campo
La nuova fotocamera compatta DJI spicca per l'abbinamento ideale tra le dimensioni ridotte e la qualità d'immagine. Può essere installata in punti di ripresa difficilmente utilizzabili con le tipiche action camera, grazie ad una struttura modulare con modulo ripresa e base con schermo che possono essere scollegati tra di loro. Un prodotto ideale per chi fa riprese sportive, da avere sempre tra le mani
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-09-2009, 20:48   #1
monelli
Senior Member
 
L'Avatar di monelli
 
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
[C++] Realizzare codice modulare

Ciao a tutti...

Devo realizzare un'applicazione in c++ per win32.

Questa applicazione dovrebbe essere formata da un main che permette di creare delle catene composte da vari blocchi.
Praticamente dal main posso lanciare su thread diversi catene e distruggerle.
Queste catene sono formate da diversi blocchi, il primo acquisisce dei dati, l'ultimo li visualizza e nel mezzo diversi blocchi che processano, i diversi blocchi sono autonomi e comunicano scambiandosi un char ad esempio.

Ogni blocco dovrebbe essere una classe, così sta su un file a parte, ci può lavorare un'altra persona e si puù modificare un blocco senza modificare l'intero programma.

Un esempio di catena potrebbe essere: blocco che acquisisce audio, blocco codifica, blocco decodifica, riproduzione audio...

Come posso realizzare una struttura del genere? Avete degli esempi? Suggerimenti?
__________________
Dont drink and drive but smoke and fly
Peugeot 206 enfant terrible!!!
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 15-09-2009, 21:28   #2
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da monelli Guarda i messaggi
Ciao a tutti...

Devo realizzare un'applicazione in c++ per win32.

Questa applicazione dovrebbe essere formata da un main che permette di creare delle catene composte da vari blocchi.
Praticamente dal main posso lanciare su thread diversi catene e distruggerle.
Queste catene sono formate da diversi blocchi, il primo acquisisce dei dati, l'ultimo li visualizza e nel mezzo diversi blocchi che processano, i diversi blocchi sono autonomi e comunicano scambiandosi un char ad esempio.

Ogni blocco dovrebbe essere una classe, così sta su un file a parte, ci può lavorare un'altra persona e si puù modificare un blocco senza modificare l'intero programma.

Un esempio di catena potrebbe essere: blocco che acquisisce audio, blocco codifica, blocco decodifica, riproduzione audio...

Come posso realizzare una struttura del genere? Avete degli esempi? Suggerimenti?
Non hai uno schema dell'applicazione che vuoi realizzare?
Se metti giù uno schema già ti viene più facile dividere i vari blocchi in classi.
L'unico consiglio che posso darti è di tenere divisa la logica applicativa con quella che interfaccia col SO (win32) che quindi realizza l'interfaccia e fa le chiamate a basso livello.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 15-09-2009, 22:16   #3
monelli
Senior Member
 
L'Avatar di monelli
 
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
Ma più che i vari blocchi a me interessa proprio la struttura della catena... come farla???

Praticamente io nel main vorrei fare una cosa del genere:

Catena = new Chain();

Catena.aggancia(new BloccoA)
Catena.aggancia(new BloccoB)

Dove BloccoA e BloccoB sono classi che fanno cose completamnte diverse:

Ad esempio BloccoA acquisisce audio e BloccoB riproduce audio ma i due blocchi comunicano scambiandosi solo un char.....

Non sò se sono stato chiaro... così relizzo un loop audio... poi mam mano vado ad aggiungere blocchi che trattano l'audio
__________________
Dont drink and drive but smoke and fly
Peugeot 206 enfant terrible!!!
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 00:24   #4
Y3PP4
Member
 
Iscritto dal: Jul 2009
Messaggi: 210
Ma vuoi realizzare codice orientato agli oggetti o modulare?

Perchè parli di moduli, blocchi e classi e li usi tutti insieme nello stesso pensiero :s

Comunque, anche se realizzi una applicazione OOP non è detto che le varie classi siano mutabili a piacere. Riguardo l'autonomia, non dare per scontato che una classe sia liberamente modificabile, dato che in molti casi una modifica della classe richiede anche la revisione del suo utilizzo, specie se cambi i metodi della classe e hai un oggetto che cerca di chiamare i vecchi metodi, non più esistenti.

Comunque riguardo l'autonomia ti consiglio di leggere questo dettagliatissimo post di PGI-Bis (mi prendo la libertà di linkartelo io ).

Spiega molto bene questo concetto.
Fai chiarezza poi cosa vuoi ottenere, sfrutta il consiglio di _Claudio e fai uno schema logico dell'applicazione.
Che io sappia la "chained programming" non esiste tra i paradigmi di sviluppo.
Esistono invece altri paradigmi che ti permettono di creare un programma con quella logica. Comunque dagli esempi sembra tu voglia usare OOP, ma non credo sia fattibile quel che cerchi.

Non puoi passare una classe (e non un oggetto) e sperare che questa magicamente comunichi con il metodo. Idem per l'oggetto, in che modo intendi farli comunicare?

Non è solo dicendo: voglio fare
Codice:
System.start();
System.run(Environment);
Che realizzo un sistema operativo
__________________
La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.
Isaac Asimov
Y3PP4 è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 09:07   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da monelli Guarda i messaggi
Ma più che i vari blocchi a me interessa proprio la struttura della catena... come farla???

Praticamente io nel main vorrei fare una cosa del genere:

Catena = new Chain();

Catena.aggancia(new BloccoA)
Catena.aggancia(new BloccoB)

Dove BloccoA e BloccoB sono classi che fanno cose completamnte diverse:

Ad esempio BloccoA acquisisce audio e BloccoB riproduce audio ma i due blocchi comunicano scambiandosi solo un char.....

Non sò se sono stato chiaro... così relizzo un loop audio... poi mam mano vado ad aggiungere blocchi che trattano l'audio
In pseudo codice:

Codice:
Blocco
   -Catena catena
   -string nome
   +getNome()
   +setCatena(Catena c)
   +getCatena()
   +ricevi(char)

Catena
    -mappa string-blocco
    +aggancia(Blocco b) = mappa.put(b.getNome(), b), b.setCatena(this)
    +getBlocco(String nome) = mappa.get(nome)
Una volta inseriti nella catena i blocchi (sottotipi di Blocco) comunicano tra loro attraverso la condivisione della stessa catena.

Il possesso di un nome da parte dei blocchi non è strettamente necessario. Dipende dal protocollo di comunicazione. Ad esempio se non ti interessa che un blocco X comunichi specificamente con un blocco Y puoi dire:

Codice:
Blocco
   -Catena catena
   +setCatena(Catena c)
   +getCatena()
   +ricevi(char)

Catena
    -lista di blocchi
    +aggancia(Blocco b) = lista += b, b.setCatena(this)
    +comunica(char c) = per ogni blocco b in lista blocchi, b.ricevi(c)
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 10:00   #6
monelli
Senior Member
 
L'Avatar di monelli
 
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
In pseudo codice:
Questo si avvicina molto a quello che vorrei fare... Però il discorso è che i vari blocchi della catena sono sempre in esecuzione e si scambiano messaggi (char) sempre nello stesso verso.

Catena

BloccoA----BloccoB----BloccoC

BloccoA invia sempre messaggi a BloccoB
BloccoB invia sempre messaggi a BloccoC

Scusate è che non sò spiegare bene quello che voglio fare... provo a essere più chiaro...

Io in pratica creo un oggetto BloccoA, uno BloccoB, uno BloccoC

BloccoA acquisisce audio e lo manda sotto forma di messaggi char al blocco successivo

BloccoB riceve questo char fa delle modifiche e invia il char al blocco successivo

BloccoC riceve il char e riproduce l'audio


Anche eliminando il bloccoB dalla catena il tutto funziona... e potrei inserire un numero diverso di blocchiB
__________________
Dont drink and drive but smoke and fly
Peugeot 206 enfant terrible!!!
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 10:09   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ti basterà dire:

Codice:
Catena
    +comunica(char c, Blocco sender) = 
        prendi il nodo x che viene dopo sender nella 
        lista dei nodi e, se c'è, x.ricevi(c)
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 11:56   #8
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Se i blocchi sono sempre in ESECUZIONE CONTEMPORANEAMENTE allora più che delle classi devi usare dei thread con pipe. Su cui puoi dinamicamente caricare l'esecuzione di un blocco (processo) sui thread e gestire le varie pipe.

Nulla di complicato, ci metti più a dirlo che a farlo.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 12:39   #9
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Cmq ricevere e passare char è decisamente riduttivo, forse sarebbe meglio passare una classe Message o roba del genere?
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 12:48   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Se i blocchi sono sempre in ESECUZIONE CONTEMPORANEAMENTE allora più che delle classi devi usare dei thread con pipe. Su cui puoi dinamicamente caricare l'esecuzione di un blocco (processo) sui thread e gestire le varie pipe.

Nulla di complicato, ci metti più a dirlo che a farlo.
Così però perde la manifestazione della struttura che vuole dare al suo programma affidandola ad una caratteristica implicita del concetto di flusso.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 13:52   #11
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Così però perde la manifestazione della struttura che vuole dare al suo programma affidandola ad una caratteristica implicita del concetto di flusso.
Sinceramente non ho capito la struttura del programma , non c'è nemmeno una formalizzazione dello stesso (ecco l'utilità dei tanto vituperati diagrammi UML et similia).

Se i blocchi sono dinamici e in qualche modo devono elaborare dati real time contemporaneamente e scambiarsi char tra di loro, non c'è nulla di meglio che i thread.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 14:12   #12
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da monelli Guarda i messaggi
Ciao a tutti...

Devo realizzare un'applicazione in c++ per win32.

Questa applicazione dovrebbe essere formata da un main che permette di creare delle catene composte da vari blocchi.
Praticamente dal main posso lanciare su thread diversi catene e distruggerle.
Queste catene sono formate da diversi blocchi, il primo acquisisce dei dati, l'ultimo li visualizza e nel mezzo diversi blocchi che processano, i diversi blocchi sono autonomi e comunicano scambiandosi un char ad esempio.

Ogni blocco dovrebbe essere una classe, così sta su un file a parte, ci può lavorare un'altra persona e si puù modificare un blocco senza modificare l'intero programma.

Un esempio di catena potrebbe essere: blocco che acquisisce audio, blocco codifica, blocco decodifica, riproduzione audio...

Come posso realizzare una struttura del genere? Avete degli esempi? Suggerimenti?
[/quote]
I blocchi di una singola catena girano su thread diversi o lo stesso ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 14:13   #13
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
Se i blocchi sono dinamici e in qualche modo devono elaborare dati real time contemporaneamente e scambiarsi char tra di loro, non c'è nulla di meglio che i thread.
Da quel che ho capito (lettura del primo post di monelli) i Blocchi non sono dinamici: sono statici.
A lui serve poter "spezzare" una Catena in Blocchi (e quindi, viceversa, comporre una Catena dichiarando una sequenza di aggiunte ordinate di singoli Blocchi alla stessa) solo per poter affidare l'implementazione di un qualsiasi singolo Blocco a un singolo sviluppatore che non si deve preoccupare del "mondo esterno" al Blocco stesso su cui lavora.

Nel "mondo esterno" poi, i vari blocchi verranno istanziati e aggiunti in ordine a formare una Catena: esiste poi la possibilità, nel contesto dell'applicazione, di lanciare contemporaneamente più Catene in esecuzione: ognuna sul suo bel thread.

Infine, in ogni Catena il primo e l'ultimo Blocco della stessa sono sempre gli stessi: il primo è il Blocco che acquisisce l'audio in input alla Catena, l'ultimo il Blocco che ne esegue la riproduzione.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 14:32   #14
monelli
Senior Member
 
L'Avatar di monelli
 
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Da quel che ho capito
Ecco esatto ottime spiegazione... ciò è quello che vorrei realizzare... con la piccola differanza che il primo e l'ultimo blocco della sequenza non sono sempre gli stessi
__________________
Dont drink and drive but smoke and fly
Peugeot 206 enfant terrible!!!
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 14:40   #15
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da monelli Guarda i messaggi
Ecco esatto ottime spiegazione... ciò è quello che vorrei realizzare... con la piccola differanza che il primo e l'ultimo blocco della sequenza non sono sempre gli stessi
se la catena gira in un singolo thread, e input/output sono sempre lo stesso tipo, diventa molto semplice
Codice:
class Block
{
  virtual void execute( char input ) =0;
  virtual char output() =0;
};
E il loop (wrappato magari in una classe Chain ) diventa qualcosa tipo

Codice:
std::vector< shared_ptr<Block> > chain;

...
chain[0]->execute( myInputChar );
for ( int i=1 ; i< chain.size(); ++i )
{
  chain[i]->execute( chain[i-1]->output() );
}
Ovviamente varianti analoghe con altri tipi di contenitori sono possibili secondo necessita'.
Se i vari blocchi devono poter gestire tipi di input/output diversi la cosa diventa piu' complicata, ma non troppo difficile
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 15:01   #16
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Se i vari blocchi devono poter gestire tipi di input/output diversi la cosa diventa piu' complicata, ma non troppo difficile
"Smells" like Decorator pattern
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 15:09   #17
monelli
Senior Member
 
L'Avatar di monelli
 
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
Tanto il blocco iniziale in qualsiasi modo prende l'input: audio, tastiera, rete ecc non fa altro che prenderlo e metterlo sulla catena uscendo come char... Tu invece nell'esempio presumi che al primo blocco arrivi già in input un char ma non è così.

Non si dovrebbe complicare troppo il tutto...

Adesso inizio a provare a fare un esempio banale:

Primo blocco genera una stringa "Hello" secondo blocco inverte la stringa terzo blocco stampa a video... "olleH"

Inserendo nella catena due volte il secondo blocco la stringa dovrebbe uscire "Hello"
__________________
Dont drink and drive but smoke and fly
Peugeot 206 enfant terrible!!!

Ultima modifica di monelli : 16-09-2009 alle 15:14.
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 15:15   #18
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
"Smells" like Decorator pattern
no in realta' io pensavo semplicemente ad una cosa a template usando delle buone vecchie liste.


Codice:
template <typename Input, typename Output>
class Block
{
public:
  virtual void execute( const Input& input ) =0;
  virtual const Output& output() = 0;
};


template <typename Input, typename Output,typename T>
class Chain : public Block<Input,Output>
{
  public:
    Chain( Block<Input,T>*, Block<T,Output>* );
    void execute(const Input& input) { _first->execute(input); _second->execute( _first->output() ); }
    const Output& output(){ return _second->output(); }
};
La catena la costruisci componendo pezzi singoli e poi le catene tra di loro. Paghi lo scotto che lo stack cresce pero' almeno mantieni la type safety.
La verbosita' del C++ non rende giustizia all'idea, che di per se' e' molto semplice.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2009, 15:17   #19
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da monelli Guarda i messaggi
Tanto il blocco iniziale in qualsiasi modo prende l'input: audio, tastiera, rete ecc non fa altro che prenderlo e metterlo sulla catena uscendo come char... Tu invece nell'esempio presumi che al primo blocco arrivi già in input un char ma non è così.

Non si dovrebbe complicare troppo il tutto...

Adesso inizio a provare a fare un esempio banale:

Primo blocco genera una stringa "Hello" secondo blocco inverte la stringa terzo blocco stampa a video... "olleH"

Inserendo nella catena due volte il secondo blocco la stringa dovrebbe uscire "Hello"
Beh, la gestione del primo blocco uno la fa come vuole. Io gli ho dato un input arbitrario, si puo' ovviamente fare in modo diverso secondo necessita'.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati Oracle AI World 2025: l'IA cambia tutto, a parti...
Kia PV5: è record di autonomia! I...
L'aeroplano supersonico ''silenzioso'' N...
Nissan: le batterie allo stato solido co...
NVIDIA cambia strategia? La GPU Feynman ...
Signal respinge le accuse dopo il down A...
Uragano Melissa in arrivo: la tempesta d...
8K o 4K? Ecco perché il tuo occhi...
Mercato auto europeo in crescita nei pri...
Addio SSD e RAM, benvenuti funghi: dagli...
TCL Q6C: tecnologia e design per un TV c...
Corsair MP700 PRO XT al debutto: un SSD ...
Apple Watch Ultra 2 in titanio con GPS +...
Nuova protezione per Windows 11: scansio...
GoPro LIT HERO a 249€ su Amazon: la nuov...
PayPal integra i pagamenti in ChatGPT: c...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:45.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v