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

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

Δημοσ.

Καλησπέρα.

 

Στα πλαίσια ενός λογισμικού που ερευνώ και αναπτύσσω σε C# (.NET 4.0) ανακάλυψα μια "περίεργη" συμπεριφορά και συσχέτιση με τα windows forms timers και τα threads που ξεκινούν 2 από τα libs/components που κάνω χρήση.

 

Πιο συγκεκριμένα, τα timers τείνουν να μην γίνονται triggered στο προρυθμισμένο interval ή να εκτελούνται μια φορά και μετά να σταματούν...

 

Το έθεσα σαν πρόβλημα και στο MSDN αλλά ακόμα δεν έχω πάρει κάποια τεκμτηριωμένη απάντηση ή λύση.

 

Έχετε αντιμετωπίσει το πρόβλημα αυτό ξανά?

Έχετε να προτείνετε λύση?

 

 

Ευχαριστώ.

Δημοσ.

Πριν μερικά χρόνια χρειάσθηκε να γράψω κώδικα (όχι σε C#) που ήταν ευαίσθητος σε ζητήματα χρονισμού (interval), η χρήση Timer οδηγούσε σε μικρές ως μεγάλες αποκλίσεις σε συνάρτηση με τον φόρτο εργασίας του Συστήματος (λόγο multitask κλπ - είναι αναμενόμενη συμπεριφορά) οπότε αν έχεις Time-Critical κώδικα θα πρέπει να λάβεις υπόψη σου αυτή την απόκλιση (τάξης ms) ώστε να την διαχειριστείς μεταξύ των intervals ή να δεις τα High Resolution Timers που προσφέρει το Λ. Σ (για μερικές λεπτομέρειες δες εδώ) τα οποία προσφέρουν πολύ μεγαλύτερη ακρίβεια & σταθερότητα από ότι οι Timers.

Δημοσ.

Τα form timers δεν είναι threads καταρχήν. Δεν σηκώνουν δικά τους threads. Αυτό το κάνουν μόνο τα threading.timer.

Τα form timers τρέχουν στο ίδιο thread με τα forms. Απλά κοιτούν αν συμπληρώθηκε ο χρόνος που τους έχεις πει και καλούν το event. Αυτό γίνεται με polling από πλευράς c# που κρύβεται από σένα. Επειδή είναι polling ο έλεγχος δεν γίνεται συνέχεια οπότε ένα event μπορεί να σου καθυστερήσει και φυσικά επειδή είναι στο ίδιο thread με τα forms θα καθυστερήσει να εκτελεστεί αν γίνεται render κάτι βαρύ ή αν κάνεις πράγματα που απαιτούν χρόνο (πχ. διάβασμα δίσκου) στο ίδιο thread με τα forms. Καλύτερα να βάλεις ένα thread να σου κάνει την δουλεία αν θες μεγάλη ακρίβεια, απλά να ξέρεις ότι δεν μπορείς να κάνεις refresh τα windows forms. Θα πρέπει να γράφεις σε ενδιάμεσo buffer και μετά τα windows forms να διαβάζουν τον buffer αυτόν.

Για να ξανακαλεστεί το event ενός timer Θα πρέπει να είναι το timer.autoreset true.

 

Και μια συμβουλή. Οποιαδήποτε βαριά διαδικασία κάνεις να την βάζεις σε ξεχωριστό thread από τα windows forms, αλλιώς δεν θα μπορείς να κάνεις refresh συχνά την φόρμα σου.

Δημοσ.

Tο Tick event τρέχει στο κύριο thread (GUI).

Αν το GUI είναι απασχολημένο (not responding) τότε θα αργήσει το event.

 

Χρησιμοποίησε το System.Timers.Timer καλύτερα.

Δημοσ.

Thanks guys, τα γνωρίζω αυτά που λέτε και επιπλέον δεν είπα ότι σηκώνει thread το timer. Το γνωρίζω ότι το timer τρέχει επάνω στο GUI thread. Έχω άλλα 2 external components που σηκώνουν όμως άλλα 2 και προφανώς καθυστερούν το σύμπαν.

;-)

 

Επιπλέον το System.Timers.Timer το έκανα χρήση και δεν έλυσε το issue.

 

Οπότε, συνοψίζοντας μου λέτε να τρέξω ένα thread με high priority και μέσα σε αυτό ένα system timer μπας και λύσει το θέμα. Σωστά?

Δημοσ.

Σε τι cpu το τρέχεις; Πόσα cores έχει;

Η γνώμη μου είναι πάντως να αφήσεις τον timer και να βάλεις low priority τα άλλα 2 thread και high priority to form thread. Αν δεν μπορείς να αλλάξεις το priority των άλλων δύο, τότε ανέβασε το gui thread στο θέο.

Δημοσ.

Σε τι cpu το τρέχεις; Πόσα cores έχει;

Η γνώμη μου είναι πάντως να αφήσεις τον timer και να βάλεις low priority τα άλλα 2 thread και high priority to form thread. Αν δεν μπορείς να αλλάξεις το priority των άλλων δύο, τότε ανέβασε το gui thread στο θέο.

 

4 Cores, i5.

 

Δε θέλω να έχω ιδαίτερη dependence on cores... να σου πω την αλήθεια. Γιατί θέλω να τρέχει και σε low end single core CPU.

Δημοσ.

Πώς είναι δυνατόν να μιλάμε για τέτοια πράγματα χωρίς κώδικα ή έστω μια κατατοπιστική περιγραφή; Αναφέρεσαι και σε threads που ξεκινούν -- threading bugs είναι δύσκολο να βρεις ακόμα και τρέχοντας μέσα στον debugger, πόσο μάλλον χωρίς καμία ουσιαστική πληροφορία.

 

Επίσης: select isn't broken, the first rule of programming κλπ. Δε νομίζω ότι ο Timer έχει πρόβλημα.

Δημοσ.

Οπότε, συνοψίζοντας μου λέτε να τρέξω ένα thread με high priority και μέσα σε αυτό ένα system timer μπας και λύσει το θέμα. Σωστά?

 

Εχεις προβλημα που ο Timer δεν πυροδοτειται; Για να μην πυροδοτειται ο Timer σημαινει οτι το messageloop κολλαει, αρα το προβλημα σου δεν ειναι ο Timer αλλα αυτο που κολλαει το messageloop.

 

Ποιες ειναι αυτες οι Lib ;

Δημοσ.

I can't say... είναι commercial το έργο και οι βιβλιοθήκες του...

Γι αυτό δε σχολίασα και αυτό που είπε ο defacer. Δεν βοήθησε και πολύ...

 

Ευχαριστώ btw τα παιδιά που μου απάντησαν πριν. Κατάλαβαν ότι δε μπορώ να δώσω κώδικα.

Συγνώμμη αλλά ώς εκεί είναι η πληροφορία που μπορώ να παρέχω.

Δημοσ.

Τοτε βρες αλλες βιβλιοθηκες. Αν η βιβλιοθηκη εχει timer ο οποιος πρακτικα δεν δουλευει τοτε ειναι σιγουρο οτι θα εχεις πιο σοβαρα προβληματα στο μελλον.

Δημοσ.

Τοτε βρες αλλες βιβλιοθηκες. Αν η βιβλιοθηκη εχει timer ο οποιος πρακτικα δεν δουλευει τοτε ειναι σιγουρο οτι θα εχεις πιο σοβαρα προβληματα στο μελλον.

 

Δε νομίζω ότι υπάρχουν βιβλιοθήκες έτσι όπως το εννοείς, αν κατάλαβα καλά για δικό του κώδικα μιλάει. Ή τέλος πάντων για κώδικα που έχει στα χέρια του.

 

Τώρα όσον αφορά τα υπόλοιπα:

 

Επιλογή σου είναι (σεβαστή) να μη μας λες τίποτα, δε βλέπω όμως πώς μπορούμε να βοηθήσουμε έτσι. Ούτε καν ένα link ή copy/paste για το report που έκανες δε μας δίνεις. Και αν μη τι άλλο από τα links που έδωσα θα μπορούσες να κρατήσεις το εξής: ο timer δεν έχει κανένα bug. Bug έχει ο δικός σου κώδικας (π.χ. ίσως χρησιμοποιείς τον timer με λανθασμένο τρόπο). Δική σου επιλογή πώς θα κινηθείς για να το ανακαλύψεις.

  • Like 1
Δημοσ.

Δε νομίζω ότι υπάρχουν βιβλιοθήκες έτσι όπως το εννοείς, αν κατάλαβα καλά για δικό του κώδικα μιλάει. Ή τέλος πάντων για κώδικα που έχει στα χέρια του.

 

Και εγω στο νομιζω ειμαι :-D

+1 στα αλλα.

Δημοσ.

Βασικά έχω λογισμικό αγορασμένο (εξωτερικές βιβλιοθήκες) και για τις οποίες έτσι και αλλιώς δε μπορώ να βάλω χέρι...

 

Σχετικά με αυτό: "Bug έχει ο δικός σου κώδικας (π.χ. ίσως χρησιμοποιείς τον timer με λανθασμένο τρόπο). Δική σου επιλογή πώς θα κινηθείς για να το ανακαλύψεις."

 

Δεν υπάρχει τέτοια περίπτωση!

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...