|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#22 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#23 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() edit - e poi la sai la cosa divertente? certe volte ho anche provato a ridurre il codice di cleanup affidandomi al fatto che quando il processo termina la sua memoria virtuale scompare e tutti i suoi HANDLE vengono chiusi (e di conseguenza non ha realmente senso liberarsi di molte risorse che in realtà vanno tenute fino alla fine dell'esecuzione). i problemi di questo approccio sono: 1) se il codice cambia e alcune risorse non devi più tenerle fino alla fine ma puoi liberarle prima, devi rintracciare tutte le loro allocazioni e scrivere le corrispondenti deallocazioni; per esperienza personale posso dirti che troppi dettagli potresti tralasciare quando effettui sul codice operazioni del genere in un secondo momento anziché in fase di prima scrittura... almeno per me è così. 2) in Win32 certe risorse (quelle di User32 e GDI32) non se ne vanno da sole quando il processo termina; tempo fa ho letto su MSDN che è questa la causa di certi errori di visualizzazione delle icone del desktop che capitano ogni tanto (a dire il vero in Windows 2000 avevo l'impressione di vederli più spesso che in XP, chissà perché; forse è solo questione di hash tables più grosse). 3) il punto 2 si può estendere ai files temporanei: quelli se non li cancelli non se ne vanno in qualunque piattaforma. Ultima modifica di 71104 : 11-03-2008 alle 17:01. |
|
|
|
|
|
|
#24 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Un conto sono 12 istruzioni API ognuna con una sequenza di istruzioni di pulizia diversa, un altro sono poche istruzioni con diversa gestione degli errori, lì ci stanno bene le eccezioni. Se in quel caso non riesci a farlo in maniera semplice senza il goto significa che devi riprogettare la struttura ad oggetti...
|
|
|
|
|
|
#25 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Codice:
with open('Pippo.txt', 'wb') as f:
f.write('Fai i tuoi porci comodi, a chiudere il file ci penso io.')
with MyMutex:
print "Sto accedendo all'area critica. Tranquillo: al release ci penso io!"
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
|
#26 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
come ho già detto non uso mai i goto negli ambienti managed. inoltre ci sono cose che non so se riuscirei a fare in Python, e anche se fosse possibile a occhio direi che mi farei solo del male. ad esempio in questo periodo mi sto dilettando a creare un desktop manager (ne ho visti a decine in giro ma nemmeno uno decente) che mostri N pulsanti in una desk band, ciascuno corrispondente ad un desktop; per fare ciò devo anzitutto implementare la desk band (cosa che in Windows si fa scrivendo un oggetto COM, e tanti cari saluti a Python
), e poi devo gestire i desktop virtuali con le apposite API Win32.
|
|
|
|
|
|
#27 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Uomo di poca fede: http://sourceforge.net/projects/pywin32/
http://aspn.activestate.com/ASPN/doc...2/PyWin32.html
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#28 |
|
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Come diceva prima cionci, anche secondo me basterebbe usare le eccezioni... io perlomeno le uso perchè odio il goto
Per fare un esempio (PS: è anche più comodo da loggare perchè si mette una unica volta nel catch la chiamata al logger): Codice:
FILE *pFile=NULL;
HANDLE hMutex=NULL;
int *piBuffer=NULL;
try
{
pFile=fopen("c:\\pippo.txt","w+");
if(!pFile) throw exception("cippa lippa");
hMutex=CreateMutex(.....);
if(!hMutex) throw exception("pippo & pluto");
// La new lancia già una std::bad_alloc se non c'è std::nothrow
piBuffer=new int[1234];
........
}
catch(const exception &ex)
{
CLog::Put() << "E' successo un bel casino: " << ex.what() << endl;
}
if(pFile) fclose(pFile);
if(hMutex) ReleaseMutex(hMutex);
delete piBuffer;
Ciao |
|
|
|
|
|
#29 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Onestamente mi sa troppo di codice C-style. Preferisco questo:
Codice:
if(FILE *pFile=fopen("c:\\pippo.txt","w+")) {
try
if (HANDLE hMutex=CreateMutex(.....) {
try
// La new lancia già una std::bad_alloc se non c'è std::nothrow
if (int *piBuffer = new int[1234]) {
try {
// Do something...
}
catch(const exception &ex)
CLog::Put() << "E' successo un bel casino lavornado col buffer: " << ex.what() << endl;
delete piBuffer;
}
else
throw exception("Allocazione buffer fallita!");
catch(const exception &ex)
CLog::Put() << "E' successo un bel casino lavorando dentro il mutex: " << ex.what() << endl;
ReleaseMutex(hMutex);
}
else
throw exception("Creazione mutex fallita!");
catch(const exception &ex)
CLog::Put() << "E' successo un bel casino lavorando col file: " << ex.what() << endl;
fclose(pFile);
}
else
throw exception("Apertura file fallita!");
Quote:
Quote:
Direttamente dal link che hai postato: I think goto's are fine, and they are often more readable than largeIl Pascal viene criticato soltanto perché le etichette del goto non possono essere identificatori "tradizionali", non in quanto tali! "Dimenticando", tra l'altro, che da una cinquantina d'anni a questa parte l'uso del goto nella letteratura informatica è severamente deprecato, tant'è che lo stesso Wirth (creatore del Pascal) l'ha COMPLETAMENTE RIMOSSO dai successivi linguaggi che ha progettato. La madre degli pseudo-programmatori è sempre incinta...
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#30 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
ma sta roba di preciso mi permetterebbe di scrivere in Python una DLL da usare come in-process server? anche esportando le funzioni DllCanUnloadNow, DllRegisterServer, DllGetClassObject e DllUnregisterServer? e Python supporta l'ereditarietà di interfacce multiple? perché una desk band è un oggetto che deve implementare almeno tre interfacce diverse. |
|
|
|
|
|
|
#31 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
|
||
|
|
|
|
|
#32 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
vabbè Cesare, non esageriamo adesso... ok le piattaforme managed ma stai paragonando l'istanziazione nell'heap di una classe (l'eccezione) con un jump incondizionato
edit - senza contare poi l'algoritmo di ricerca dell'exception handler lungo il call stack; ora permettimi, anche se non ho fatto test approfonditi, che un catch deve pesare necessariamente molto di più di un jump (incondizionato poi, una delle istruzioni più semplici che ci siano). Quote:
Ultima modifica di 71104 : 11-03-2008 alle 21:34. |
|
|
|
|
|
|
#33 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Dijkstra amava i goto oppure sarebbe difficile costruire l'algoritmo di Dijkstra senza goto? La seconda non e' vera...
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#34 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Tzé! Python è onnipotente.
![]() Quote:
Python è un linguaggio fortemente propenso sia alla sua estensione che all'integrazione in altre applicazioni (DLL incluse, quindi): http://docs.python.org/ext/ext.html Quote:
Sulla desk band in particolare non so niente, ma qui http://aspn.activestate.com/ASPN/doc...c_and_COM.html trovi un esempio di utilizzo di un oggetto COM, mentre qui http://aspn.activestate.com/ASPN/doc...ell_Links.html usa la shell. Mi fermo qui perché, come ho detto, su quanto chiedi non so nulla e non amo sparare puttanate come Torvalds.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#35 | ||
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Giustificare un errore (usare i goto) con un altro (programmare in windows) non e' una buona cosa
![]() Battute a parte, non mi vengono in mente molti casi in un cui abbia un senso, a parte che nell'implementazione di funzionalita' di piu' alto livello (ad esempio la gestione delle eccezioni stessa). In particolare non mi e' chiaro il tuo esempio... puoi essere piu' esplicito ? Quote:
Ho avuto modo di implementare oggetti com e anche servizi in python, ed e' una vera sciocchezza (e lo dice uno che la programmazione in Windows la conosce poco). Quote:
__________________
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 Ultima modifica di marco.r : 11-03-2008 alle 22:45. Motivo: cercato di chiarire il concetto |
||
|
|
|
|
|
#36 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Se dobbiamo usare le eccezioni, non possiamo farlo com'è stato (anche nell'esempio che ho portato io) utilizzando gli if per controllare la restituzione o meno di una risorsa: stiamo programmando ancora in maniera "tradizionale" (sebbene le try/catch aiutino a sistemare meglio il codice). Con le eccezioni io NON dovrei mettere NESSUN if, visto che al primo utilizzo della risorsa dovrebbe esser generata l'apposita eccezione. Il codice, quindi, sarebbe perfettamente lineare e privo del benché minimo controllo che comporta SEMPRE un relativo salto CONDIZIONALE (i peggiori della specie, lo sai) nella soluzione "classica". In soldoni, mi aspetterei roba così (lo scrivo in Python per sbrigarmi prima Codice:
try:
f = open('pippo')
try:
print 'La prima riga è:', f.readline()
except IOError:
print 'Errore di lettura ci fu!'
finally:
f.close()
except:
print 'Errore di apertura file ci fu!'
Il che, permettimi, è MOLTO differente in termini prestazionali, visto che la creazione dell'oggetto eccezione avviene esclusivamente nel momento in cui effettivamente bisogna generarla. x marco.r: grazie della tua testimonianza. Comunque... eretico!!! Windows è er mejo che ci possa essere.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys Ultima modifica di cdimauro : 11-03-2008 alle 22:16. |
|
|
|
|
|
|
#37 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
In un mondo ideale sia i file che i mutex sono oggetti che liberano automaticamente le risorse quando distrutti e che quindi lavorano bene col meccanismo delle eccezioni. Un esempio abbastanza vicino si potrebbe fare con gli fstream della libreria standard e i mutex delle boost: Codice:
try
{
std::ofstream out("c:\\pippo.txt","w+");
boost::thread::scoped_lock( ... );
piBuffer=new int[1234];
// ...
}
catch(const exception &ex)
{
CLog::Put() << "E' successo un bel casino: " << ex.what() << endl;
}
// look ma, no code cleanup !
In altri casi potrei non volerlo fare, e allora usero' un mutex "standard"
__________________
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 |
|
|
|
|
|
|
#38 | |
|
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Quote:
In ambiente MS mi è capitato di usare ALT/MFC, che non usano le eccezioni, però incapsulano gli handle di sistema nelle classi (CRegKey, CMutex, ecc). Quindi non c'è bisogno di fare il cleanup: viene già fatto dal distruttore quando termina lo scoop. |
|
|
|
|
|
|
#39 |
|
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
...scusate l'ignoranza...programmo in java dove il goto è riservato ma non utilizzabile...come mai questo goto è tanto bistrattato?...se esiste come funzione perchè è ritenuto una porcata?...
...ciao... |
|
|
|
|
|
#40 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:50.





















