Προς το περιεχόμενο

Απλη ερωτηση γισ παραθυρο σε C, Winodws API


nilosgr

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας, ειχα ενα προγραμματα που ετρεχε σε κονσολα και ειπα να το κανω με παραθυρο (αδειο προς το παρον :mrgreen: ), επειδη χρησιμοποιω HANDLE σε mutexes, files κλπ,μηπως μπορει καποιο καλο παιδακι να μας πει αν πρεπει να κλεινω ολα αυτα τα HANDLE στην CALLBACK function του window (δηλαδη οταν το message ειναι WM_DESTROY η WM_CLOSE) ή κλεινουν "απο μονα τους" με μια κληση της PostQuitMessage() ??

Δημοσ.

Έχουν περάσει πολλά χρόνια από την τελευταία φορά που ασχολήθηκα με Windows API, συνήθως όμως είσαι εσύ υπεύθυνος να κάνεις cleanup πράγματα που έχεις δημιουργήσει μόνος σου. Η PostQuitMessage() απλά στέλνει ένα WM_QUIT message στο event queue, από ότι θυμάμαι. Ρίξε μια ματιά κι εδώ: http://www.suite101.com/content/using-wm-destroy-postquitmessage-a59832

Δημοσ.

Πρακτικα οταν τερματισει το procces, αφαιρουνται και τα ref counts που εχει παρει.

 

Τεσπα, αν θες να καλεσεις μια συναρτηση που κανει cleanup, το καλυτερο μερος (imo) ειναι στο WM_DESTROY

 

WM_DESTORY ερχετε μετα το καλεσμα της DestroyWindow

WM_CLOSE μετα απο alt+f4 , x , RMB close. (Αν το αφησεις στο defwinporc τοτε αυτη θα καλεσει το DestroyWindow)

WM_QUIT απλα το τελευταιο message ( με αυτο σταματαει το GetMessage)

Δημοσ.

Αν θυμαμαι καλά, για ένα τυπικό βρόγχο μηνυμάτων η σειρά είναι η εξής.

 

Το WM_DESTROY παράγεται όταν ένα παράθυρο καταστρέφεται με εντολή του χρήστη (close κλπ).

Στην επεξεργασία του WM_DESTROY πρέπει να τεθεί η PostQuitMessage(0);

Αυτή η συνάρτηση εισάγει ένα μήνυμα WM_QUIT στην ουρά μηνυμάτων του προγράμματος.

Όταν η GetMessage του βρόγχου μηνυμάτων συναντήσει το WM_QUIT επιστρέφει 0.

Έτσι ο βρόγχος μηνυμάτων παύει και το πρόγραμμα εκτελεί την return msg.wParam;

(όπου η wParam του msg περιέχει την τιμή που δίνεται στην PostQuitMessage, δηλ. συνήθως μηδέν.)

Με αυτή την return η WinMain εξέρχεται και το πρόγραμμα τερματίζεται.

 

Το συμπέρασμά μου είναι ότι αν δεν κληθεί η PostQuitMessage() είναι δυνατόν το παράθυρο να κλείσει αλλά η εφαρμογή

να συνεχίσει να δουλεύει χωρίς να φαίνεται. Εξάλλου μια εφαρμογή στα windows δεν έχει κατ' ανάγκην παράθυρα.

Γι' αυτό, τότε που διάβαζα το win API (πριν πολυυυύ καιρό) εγώ εκτελούσα πάντα την PostQuitMessage().

 

Αλλά όταν πρόκειται για τερματισμό του προγράμματος, το λειτουργικό αποδεσμεύει τους τυχόν πόρους που έχει το πρόγραμμα (νομίζω δηλαδή....)

 

-

Δημοσ.

Τουλάχιστον από ΧΡ και μετά (γιατί στα παλιά win αν θέλω το πιστεύω, χα) μαμιούνται όλα με το τερματισμό της εφαρμογής.

 

Εκείνο που καλό είναι να προσέχεις πάντως όταν παίζεις με pure WinAPI είναι να μη ξεχνάς να χαλάς τα objects (αυτό γίνεται χειροκίνητα και αφορά ό,τι μαμιέται με τη DeleteObject), συνήθως αμέσως όταν δε χρειάζονται πια γιατί σε περίπτωση υπερχρήσης τους υπάρχουν συνέπειες λόγω memory leak και περιορισμό του συστήματος στα GDI handles που μπορεί να χειριστεί.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...