Ερώτηση περί wxWidgets... : (

SmaTheGreek | Κυρ, 01/13/2008 - 23:26 | 3' | 3

Πρόσφατα ξεκίνησα να μαθαίνω το wxWidgets API ώστε να δημιουργώ γραφικό περιβάλλον για εφαρμογές γραμμένες σε C++. Φτιάχνω λοιπόν ένα μικρό (και βλακώδες  ) Port Scanner με το οποίο αντιμετωπίζω το εξής πρόβλημα. Το Scanning για ανοιχτές θύρες εκτελείτε ως εξής.
Αφού κάνω την απαραίτητη αρχικοποίηση τιμών στις τιμές των μεταβλητών, χρησιμοποιώ έναν βρόχο for μέσω του οποίου γίνεται το scanning (σύνδεση με τις tcp θύρες ενός άλλου PC ).
Όλο το παραπάνω εκτελείτε όταν γίνεται κλικ σε ένα κουμπί του γραφικού περιβάλλοντος. Όμως το γραφικό περιβάλλον της εφαρμογής παγώνει κατά τη διάρκεια εκτέλεσης του βρόχου και επανέρχεται όταν αυτός τελειώσει(μαζί του και το scanning).Αν και τα αποτελέσματα που μου εμφανίζει είναι σωστά, το πρόβλημα που έχω είναι πως θέλω να βάλω ένα πλήκτρο για να κάνει abort ο χρήστης το scanning(και παράλληλα να σταματάει ο βρόχος), όμως από τη στιγμή που το μηχάνημα κολλάει μέχρι το τέλος του scanning, ο χρήστης δεν θα έχει πρόσβαση στο πλήκτρο abort. Υπάρχει κάποιος τρόπος λοιπόν να αφήνω και άλλα events του προγράμματος να εκτελούνται ταυτόχρονα με το τρέχων(δηλαδή το κλικ του ποντικιού για το scanning)


Επίσης για όσους έχουν χρησιμοποιήσει visual basic (αν και δεν χρησιμοποιήται στο linux) υπήρχε μια εντολή που χρησιμοποιούνταν σε τέτοιες περιπτώσεις και λεγόταν doevents.

Κάποια πρόταση ???


SmaTheGreek2007-10-3 20:1:5

Δώσε αστέρια!

MO: (ψήφοι: 0)

Σχόλια

Η σωστή λύση είναι: threads

Μια άλλη, πιθανή λύση μπορεί να είναι να πάρεις ιδέες από τον κώδικα που θα βρεις εδώ:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?tx tCodeId=10257&lngWId=3

Βασικά, δεν ξέρω τα εσώτερα του wxWidgets, αλλά στο Qt η μεταβλητή που θα έλεγχε η do....while θα είχε τη τιμή που θα επέστρεφε το signal του κουμπιού Cancel. Επίσης στο Qt υπάρχει η έννοια του progressBar, που παίρνει τιμές από το process που "γονατίζει" το μηχάνημα και δείχνει την πρόοδό του. Αυτό το progressBar είναι ένα widget πουέχει κουμπί Cancel και δεν είναι "νεκρό". Μπορεί να υπάρχει κάτι αντίστοιχο στο wxWidgets.

Δεν έχω ασχοληθεί ποτέ με τα threads
Ακούγεται σαν μπλέξιμο ... : (

SmaTheGreek2007-10-3 21:51:32

dimitris]
Βασικά, δεν ξέρω τα εσώτερα του wxWidgets, αλλά στο Qt η μεταβλητή που θα έλεγχε η do....while θα είχε τη τιμή που θα επέστρεφε το signal του κουμπιού Cancel. Επίσης στο Qt υπάρχει η έννοια του progressBar, που παίρνει τιμές από το process που "γονατίζει" το μηχάνημα και δείχνει την πρόοδό του. Αυτό το progressBar είναι ένα widget πουέχει κουμπί Cancel και δεν είναι "νεκρό". Μπορεί να υπάρχει κάτι αντίστοιχο στο wxWidgets.



Τελικά υπάρχει και στο wxWidgets ένα αντίστοιχο του progressbar (το wxProgressDialog) οπότε έλυσα το προβλημά μου.
Ευχαριστώ Δημήτρη