PDA

Visualizza la versione completa : [C++] Applicazioni medio-grandi e gestione interfaccia grafica


cataDesign
28-04-2013, 12:32
Salve a tutti apro una nuova discussione perche ho scaricato il sorgente di libreoffice 4 per dargli un occhiata :D ma non riesco a trovare l'entrypoint, le mie piccolo conoscenze mi suggeriscono di cercare la funzione main (che non trovo in nessun file)

Per caso si può specificare un main nascosto o è possibile comunicare al compilatore che l'entrypoint sarà in una funzione diversa dal main?? :messner:

Grazie in anticipo
!Andrea!

MItaly
28-04-2013, 15:47
Qui: http://cgit.freedesktop.org/libreoffice/core/tree/desktop/source/app/main.c#n47
(dove SAL_IMPLEMENT_MAIN() è una macro che dichiara il main in maniera diversa a seconda della piattaforma, probabilmente su Windows userà un WinMain, su Linux un normale main, eccetera); la funzione soffice_main() lì richiamata, invece, sta qui (http://cgit.freedesktop.org/libreoffice/core/tree/desktop/source/app/sofficemain.cxx#n45).

In ogni caso, LibreOffice è una base di codice estremamente complessa, che ha poco meno di 25 anni di storia alle spalle, ha numerosi "strati" con diversi approcci di programmazione/librerie usate, oltre ad ogni possibile hack per supportare diverse piattaforme, per cui non credo sia un buon progetto da cui iniziare. :)


è possibile comunicare al compilatore che l'entrypoint sarà in una funzione diversa dal main??
Sì, in genere è possibile (tipicamente con un'opzione del linker).

---

(comunque, come discussione è piuttosto OT :stordita: )

cataDesign
28-04-2013, 16:30
Ho capito non posso sicuramente iniziare da qui allora a causa della complessità del progetto.
Il mio problema è semplicemente 1 vorrei capire come un applicazione medio grande lavora.

Io fin ora ho sempre programmato in php dove semplicemente non esiste un main è l'utente che ad ogni azione o meglio ogni richiesta che viene fatta al server, il server risponde elaborando il codice php presente in quel file e dando un output all'user,

Mentre in un applicazione "non web" non ha questo approccio e ci dovrebbe essere (penso) una funzione classe o comunque qualcosa che legga ricorsivamente (penso) le azioni che un utente fa, faccio un esempio per spiegarmi.
Io immagino uno scenario del genere:

Un utente accede ad un pannello e clicca il bottone per vedere i report della settimana

In php:
Avrei fatto una pagina in html dove al click del bottone si andrebbe a richiamare la pagina per mostrare i report.

In c++:
Avrei fatto un while(true) e dentro una funzione che controlla ricorsivamente cosa fa l'utente e nel caso venisse cliccato questo bottone mostrerei l'output.

Ovviamente questo approccio è errato e vorrei vedere come funziona un applicazione grossa proprio per capire questo funzionamento cioè: come il c++ intercetta il click di una finestra e aprire il menu oppure cliccare un bottone sullo schermo e fare una derminata azione in un programma come libreoffice o photoshop o in un gioco stesso non penso che ci sia un ciclo che controlli sempre se si è verificata o meno un azione data la quantità di azioni molto grande che si possono verificare in un programma come quelli su detti (photoshop libreoffice o un gioco di qualsiasi tipo) in javascript esistono gli eventi in c++ ??

Lo so la testa muri muri devo sbattere :dhò: :dhò: hahahah
Se conosci qualche testo in cui tutto questo viene spiegato puoi rispondere anche solo con il titolo :D

Scusa la complessità delle mie seghe mentali

Andrea!! :confused:

MItaly
28-04-2013, 16:44
Ma quindi tu non hai bisogno di vedere un'applicazione medio-grossa in C++, ti basta la più semplice delle applicazioni grafiche. :) Il problema è che in C++ non c'è un metodo standard per gestire la grafica, ma dipende da sistema operativo a sistema operativo (anche se ci sono dei toolkit multipiattaforma che semplificano molto il lavoro).

Avrei fatto un while(true) e dentro una funzione che controlla ricorsivamente cosa fa l'utente e nel caso venisse cliccato questo bottone mostrerei l'output.
In realtà di base non è molto diverso da come dici. :mem:
Alla base di tutto (sia in Windows che sui sistemi *NIX con X11, non so come faccia Cocoa) c'è il cosiddetto "message loop", che è del codice del tipo:


while(RecuperaMessaggio(...))
{
ConsegnaMessaggio(...);
}

RecuperaMessaggio non fa altro che chiedere al sistema operativo se ci sono messaggi per l'applicazione (l'utente ha cliccato su un controllo/ha mosso il mouse/premuto un tasto/è necessario ridisegnare la finestra/...); se non c'è niente l'applicazione semplicemente rimane bloccata nella RecuperaMessaggio (in questo modo non spreca CPU), se c'è qualcosa viene fornito il messaggio e l'applicazione lo gestisce.
Tipicamente poi c'è una funzione ConsegnaMessaggio (su Windows è la DispatchMessage) che, in base al destinatario del messaggio, lo "consegna" alla funzione appropriata (su Windows puoi registrare diverse "classi" di finestre, a ognuna delle quali corrisponde una "window procedure" che gestisce i messaggi destinati alle finestre corrispondenti).

Poi i vari toolkit grafici C++ "astraggono" questo concetto e ti consentono di lavorare con classi & co., semplificandoti il lavoro; ad esempio, in un'applicazione Qt tutto il mio main consiste in

#include <QApplication>
#include <QTime>
#include "solverdialog.hpp"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qsrand(QTime::currentTime().msec());
SolverDialog w;
w.show();

return a.exec();
}

con SolverDialog che eredita da una classe-finestra astratta e si occupa di registrare la finestra, gestire i suoi messaggi & co., e a.exec() di fatto "nasconde" il message loop.

Tipicamente la classe-finestra astratta fornisce tutta una serie di metodi virtuali, che vengono chiamati ogni volta che arriva un messaggio di un certo tipo; nella tua classe derivata poi tu vai a reimplementare questi metodi virtuali in modo da ricevere e gestire i messaggi che ti interessano.
(in realtà con le Qt è un po' diverso, si usa un meccanismo di signal/slot, ma il concetto è simile)

cataDesign
28-04-2013, 17:06
:cry: Pensa quel che vuoi ma questa tua spiegazione mi ha chiarito una domanda che mi facevo da una vita intera!! sono al 7ettimo cielo

Il concetto è molto semplice (l'implementazione non lo so) Con questo ho capito che il c++ ha comportamenti diversi in base al sistema operativo in cui deve girare Quindi programmare in c++ Bene significa conoscere il sistema in cui viene implementato più tosto che la sintassi generale

Significa che dopo lo studio del c++ si deve passare allo studio dei sistemi operativi per poter iniziare a produrre qualcosa di buono giusto?

Comunque sia Grazie Per l'ottima spiegazione :D Veramente Non Saprei come ringraziarti!!!

:D :D :D :D

MItaly
28-04-2013, 18:46
Originariamente inviato da cataDesign
:cry: Pensa quel che vuoi ma questa tua spiegazione mi ha chiarito una domanda che mi facevo da una vita intera!! sono al 7ettimo cielo
Lieto di esserti stato utile. :zizi:


Il concetto è molto semplice (l'implementazione non lo so) Con questo ho capito che il c++ ha comportamenti diversi in base al sistema operativo in cui deve girare
Ni. Il C++ si comporta sempre secondo lo standard C++ (a meno di bachi del compilatore, naturalmente :) ), che descrive la sintassi del linguaggio e la libreria standard; il punto è che la libreria standard C++ è piuttosto limitata rispetto ad altri linguaggi, e per tante cose (tra cui appunto la grafica) bisogna rivolgersi a librerie di sistema o di terze parti.


Quindi programmare in c++ Bene significa conoscere il sistema in cui viene implementato più tosto che la sintassi generale
Significa sia conoscere il linguaggio e la sua libreria standard, sia conoscere le librerie che ti servono per fare quel che devi fare.


Significa che dopo lo studio del c++ si deve passare allo studio dei sistemi operativi per poter iniziare a produrre qualcosa di buono giusto?
Non necessariamente; sicuramente aiuta e saper programmare per le librerie di sistema "native" di una determinata piattaforma è utile (e in alcuni casi indispensabile), ma ce la si può cavare nella maggior parte dei casi conoscendo bene delle librerie multipiattaforma, che astraggano le differenze tra i vari sistemi operativi su cui il programma dovrà girare; personalmente per questo scopo prediligo le librerie Qt (che trovo molto complete e molto ben fatte).

:ciauz:

cataDesign
28-04-2013, 19:18
:fighet: Ho capito quindi per ogni scopo meglio cercare le librerie multi piattaforma un ultima osservazione:

il punto è che la libreria standard C++ è piuttosto limitata rispetto ad altri linguaggi, e per tante cose (tra cui appunto la grafica) bisogna rivolgersi a librerie di sistema o di terze parti.

Questo è uno dei punti di forza del c++ giusto? il fatto di avere una libreria molto scarna rende il c++ stabile e performante e comunque utilizzabile per lo sviluppo di tutti i tipi di programmi rispetto ad altri linguaggi che magari portano con se classi già precotte che magari non verranno utilizzate dall'applicazione sviluppata giusto?

MItaly
29-04-2013, 16:51
Originariamente inviato da cataDesign
:fighet: Ho capito quindi per ogni scopo meglio cercare le librerie multi piattaforma
Come sempre dipende da cosa devi fare: di base sì, ma può benissimo capitare (se il programma non verrà mai portato altrove/se non vuoi dependency "pesanti"/se ti serve una particolare integrazione con un certo sistema operativo/...) che convenga usare API native.


Questo è uno dei punti di forza del c++ giusto? il fatto di avere una libreria molto scarna rende il c++ stabile e performante e comunque utilizzabile per lo sviluppo di tutti i tipi di programmi rispetto ad altri linguaggi che magari portano con se classi già precotte che magari non verranno utilizzate dall'applicazione sviluppata giusto?
Mah, più che altro dipende dal fatto che lo standard C++ tende a focalizzarsi su "zone di funzionalità" estremamente indipendenti dal sistema operativo (visto che deve poter girare sulle piattaforme più disparate), e non c'è un singolo produttore che si premuri di aggiungere man mano nuove funzionalità, ma le funzionalità accettate nei nuovi standard sono decise da una commissione ISO (per cui si hanno tempi di standardizzazione piuttosto lenti e questioni "politiche" tra le varie parti coinvolte).

cataDesign
30-04-2013, 00:57
Ok grazie mille per tutto sei stato abbastanza chiaro e preciso in ogni risposta mitico :D

cataDesign
30-04-2013, 18:15
Perché sceglieresti di programmare un determinato software in c++ più tosto che in un altro linguaggio con più funzionalità standard è magari più portatile? O per lo meno in quali occasioni/progetti sceglieresti il c++ e in quali occasioni preferisci usare un altro linguaggio?

Cioè Quello che intendo in breve è: per quali progetti è meglio il c++ rispetto ad altri linguaggi? :D

Grazie di tutto Andrea :unz: :unz:

Loading