nilosgr Δημοσ. 28 Ιουλίου 2011 Δημοσ. 28 Ιουλίου 2011 Γεια σας, ειχα ενα προγραμματα που ετρεχε σε κονσολα και ειπα να το κανω με παραθυρο (αδειο προς το παρον ), επειδη χρησιμοποιω HANDLE σε mutexes, files κλπ,μηπως μπορει καποιο καλο παιδακι να μας πει αν πρεπει να κλεινω ολα αυτα τα HANDLE στην CALLBACK function του window (δηλαδη οταν το message ειναι WM_DESTROY η WM_CLOSE) ή κλεινουν "απο μονα τους" με μια κληση της PostQuitMessage() ??
migf1 Δημοσ. 28 Ιουλίου 2011 Δημοσ. 28 Ιουλίου 2011 Έχουν περάσει πολλά χρόνια από την τελευταία φορά που ασχολήθηκα με Windows API, συνήθως όμως είσαι εσύ υπεύθυνος να κάνεις cleanup πράγματα που έχεις δημιουργήσει μόνος σου. Η PostQuitMessage() απλά στέλνει ένα WM_QUIT message στο event queue, από ότι θυμάμαι. Ρίξε μια ματιά κι εδώ: http://www.suite101.com/content/using-wm-destroy-postquitmessage-a59832
παπι Δημοσ. 28 Ιουλίου 2011 Δημοσ. 28 Ιουλίου 2011 Πρακτικα οταν τερματισει το procces, αφαιρουνται και τα ref counts που εχει παρει. Τεσπα, αν θες να καλεσεις μια συναρτηση που κανει cleanup, το καλυτερο μερος (imo) ειναι στο WM_DESTROY WM_DESTORY ερχετε μετα το καλεσμα της DestroyWindow WM_CLOSE μετα απο alt+f4 , x , RMB close. (Αν το αφησεις στο defwinporc τοτε αυτη θα καλεσει το DestroyWindow) WM_QUIT απλα το τελευταιο message ( με αυτο σταματαει το GetMessage)
V.I.Smirnov Δημοσ. 28 Ιουλίου 2011 Δημοσ. 28 Ιουλίου 2011 Αν θυμαμαι καλά, για ένα τυπικό βρόγχο μηνυμάτων η σειρά είναι η εξής. Το 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(). Αλλά όταν πρόκειται για τερματισμό του προγράμματος, το λειτουργικό αποδεσμεύει τους τυχόν πόρους που έχει το πρόγραμμα (νομίζω δηλαδή....) -
PCharon Δημοσ. 29 Ιουλίου 2011 Δημοσ. 29 Ιουλίου 2011 Τουλάχιστον από ΧΡ και μετά (γιατί στα παλιά win αν θέλω το πιστεύω, χα) μαμιούνται όλα με το τερματισμό της εφαρμογής. Εκείνο που καλό είναι να προσέχεις πάντως όταν παίζεις με pure WinAPI είναι να μη ξεχνάς να χαλάς τα objects (αυτό γίνεται χειροκίνητα και αφορά ό,τι μαμιέται με τη DeleteObject), συνήθως αμέσως όταν δε χρειάζονται πια γιατί σε περίπτωση υπερχρήσης τους υπάρχουν συνέπειες λόγω memory leak και περιορισμό του συστήματος στα GDI handles που μπορεί να χειριστεί.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.