<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>WinForms</title><link>https://www.dotnetzone.gr:443/cs/forums/12/ShowForum.aspx</link><description>Θέματα για rich client / windows εφαρμογές, σε οποιαδήποτε γλώσσα (VB.NET, C#, managed C++, κ.α.)</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Ανανέωση winform</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/69349.aspx</link><pubDate>Thu, 16 Feb 2012 21:10:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:69349</guid><dc:creator>George Parissis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/69349.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=69349</wfw:commentRss><description>&lt;p&gt;Συγνώμη, της τελευταίες ημέρες είχα να κάνω μετακόμιση. Γύρισα στα πάτρια εδάφη. Αποτέλεσμα της κατάστασης που επικρατεί και με το μέλλον αβέβαιο... Τέλος πάντων αυτό είναι μία άλλη συζήτηση.&lt;/p&gt;&lt;p&gt;Από ότι βλέπω λύθηκε το θέμα με τον καλύτερο τρόπο. &lt;/p&gt;</description></item><item><title>Απ: Ανανέωση winform</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/69290.aspx</link><pubDate>Mon, 13 Feb 2012 20:40:04 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:69290</guid><dc:creator>serakar</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/69290.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=69290</wfw:commentRss><description>Ήσουν κατατοπιστικότατος και πειστικότατος &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-1.gif" alt="Smile" /&gt;.&amp;nbsp; Έχω κάνει ήδη τις αλλαγές.&amp;nbsp; Backgroundworker it is!&lt;br&gt;&lt;br&gt;Σεραφείμ&lt;br&gt;</description></item><item><title>Απ: Ανανέωση winform</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/69289.aspx</link><pubDate>Mon, 13 Feb 2012 20:34:39 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:69289</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/69289.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=69289</wfw:commentRss><description>Δεν είναι περίεργη. Είναι η τυπική συμπεριφορά των desktop εφαρμογών από καταβολής GUI. Το UI τρέχει σε ένα thread. Αν το thread υπολογίζει, δεν μπορεί να γίνει ανανέωση ή επεξεργασία των μηνυμάτων που στέλνει το λειτουργικό στην εφαρμογή (π.χ. ζωγράφισμα περιοχής, κίνηση ποντικιού, κλικ, κλπ). Ακόμα και το ζωγράφισμα της οθόνης εκτελείται μόνο όταν το λειτουργικό στείλει το μήνυμα WM_DRAW. Όταν η εφαρμογή δεν ανταποκρίνεται στα μηνύματα, το λειτουργικό την παρουσιάζει ως Non Responsive - και αυτό ακριβώς συμβαίνει.&amp;nbsp;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Μπορείς να προκαλέσεις την επεξεργασία των μηνυμάτων που έχουν μαζευτεί &amp;nbsp;με την &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx"&gt;Application.DoEvents&lt;/a&gt;, όχι την Refresh, αλλά και πάλι, αν η επεξεργασία κρατάει πολύ, το thread δεν μπορεί να ανανεώσει την οθόνη και να επεξεργαστεί τα μηνύματα.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Μπορείς να βασιστείς στην DoEvents μόνο αν η επεξεργασία κάθε ενός αρχείου κρατάει πολύ λίγο ώστε να μην προλάβει ο χρήστης να καταλάβει το μπλοκάρισμα. Φυσικά, όταν θα καλέσεις την DoEvents η εφαρμογή θα επεξεργαστεί ΚΑΙ τα click, close events τα οποία ήθελες να αποφύγεις.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Είναι αρκετά πιο πολύπλοκο να προσπαθίσεις να τα κάνεις όλα αυτά με ένα μόνο thread σε σχέση με το να χρησιμοποιήσεις τo BackgroundWorker:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Στο κομμάτι της επεξεργασίας θα κάνεις ακριβώς τα ίδια - ή μάλλον λιγότερα - πράγματα. Αντί να καλείς την DoEvents θα καλείς την ReportProgress.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Στο κομμάτι του UI, έτσι κι αλλιώς θα πρέπει να απενεργοποιήσεις εσύ με κάποιο τρόπο τα components που δεν θέλεις. Ο τρόπος που κάνεις την επεξεργασία δεν έχει σχέση και δεν επηρεάζει το μηχανισμό που θα επιλέξεις&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;</description></item><item><title>Απ: Ανανέωση winform</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/69288.aspx</link><pubDate>Mon, 13 Feb 2012 20:12:03 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:69288</guid><dc:creator>serakar</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/69288.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=69288</wfw:commentRss><description>Ο λόγος που ήθελα να το αποφύγω είναι γιατί κάποια πράγματα πρέπει να σχεδιαστούν με έναν πιο πολύπλοκο τρόπο.&amp;nbsp; Και εντάξει, δεν είναι μεγάλο το πρόβλημα, απλά αυτό το πάγωμα του UI επειδή αλλάζεις focused παράθυρο μου φάνηκε λίγο περίεργο και είπα μήπως υπάρχει κάποιος άλλος τρόπος λύσης.&amp;nbsp; Γιατί πρακτικά δεν θέλω να δουλεύουν δύο πράγματα ταυτόχρονα, να γίνεται refresh η φόρμα &lt;b&gt;ενδιάμεσα&lt;/b&gt; από τα transfers θέλω.&amp;nbsp; Και αυτό γίνεται, εκτός αν αλλάξεις focused παράθυρο, οπότε παγώνουν όλα μέχρι να τελειώσουν όλα τα transfers.&amp;nbsp; Αυτή λοιπόν η συμπεριφορά μου φάνηκε λίγο περίεργη για να είναι κανονική.&lt;br&gt;&lt;br&gt;Ευχαριστώ και πάλι για την βοήθεια.&lt;br&gt;&lt;br&gt;Σεραφείμ&lt;br&gt;</description></item><item><title>Απ: Ανανέωση winform</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/69285.aspx</link><pubDate>Mon, 13 Feb 2012 19:31:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:69285</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/69285.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=69285</wfw:commentRss><description>&lt;p&gt;Γιατί να το αποφύγεις? Αν θέλεις κάποιες εργασίες να εκτελλούνται παράλληλα (γιατί αυτό θες, να δουλεύει και το UI και να γίνεται και processing), θα πρέπει να χρησιμοποιήσεις κάποιο μηχανισμό για παράλληλη επεξεργασίας. Το BackgroundWorker είναι η απλούστερη και πιο περιορισμένη μορφή, η οποία ταιριάζει "γάντι" σε αυτό που ζητάς.&lt;/p&gt;&lt;p&gt;Όσο για το "να μην κάνει τίποτε άλλο", εδώ μιλάμε για το πως δουλεύει το UI. Καμμία σχέση με το πως γίνεται η επεξεργασία. Υπάρχουν πολλές λύσεις και το τί θα επιλέξεις εξαρτάται από το πως θέλεις να φαίνεται η εφαρμογή σου:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Μπορείς να εμφανίσεις ένα modal dialog box με το progressbar και ένα μήνυμα.&amp;nbsp; Είναι ίσως η πιο "κλασσική" υλοποίηση. Το μόνο που χρειάζεται είναι να φροντίσεις να κρύψεις το close button για να μην κλείσει κανείς τη φόρμα.&lt;/li&gt;&lt;li&gt;Αλλάζεις σε Enabled=False την κατάσταση των control που θέλεις να απενεργοποιήσεις όταν ξεκινάς και σε Enabled μόλις τελειώσεις την επεξεργασία. Αυτό είναι χρήσιμο όταν δεν θέλεις να μπορεί ο χρήστης να χρησιμοποιεί κάποια features της εφαρμογής, όχι όμως αυτά που ξεκινούν/σταματούν την επεξεργασία. Την πρόοδο μπορείς μετά να την παρουσιάσεις είτε με κάποιο modeless dialog box ή κάποιο progressbar ενσωματωμένο στη φόρμα σου.&lt;/li&gt;&lt;/ul&gt;</description></item><item><title>Απ: Ανανέωση winform</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/69284.aspx</link><pubDate>Mon, 13 Feb 2012 18:53:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:69284</guid><dc:creator>serakar</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/69284.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=69284</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;George Parissis:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Το control που χρειάζεσαι είναι το BackgroundWorker.&lt;/p&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;&lt;br&gt;Ευχαριστώ πολύ για την απάντηση.&amp;nbsp; Ήθελα να το αποφύγω αλλά... Το είδα 
λοιπόν, τροποποίησα την δομή του κώδικα, και παίζει μια χαρά.&amp;nbsp; Το νέο 
πρόβλημα που έχω τώρα λοιπόν είναι ότι πρέπει με κάποιο τρόπο να σταματήσω τον χρήστη από το να κάνει οτιδήποτε άλλο στην εφαρμογή μέχρι να τελειώσει η διαδικασία (να κλείσει την φόρμα-εφαρμογή, να μην πατάει κουμπιά, να μην αλλάζει tabs σε ένα tabcontrol που έχει πάνω η φόρμα κλπ).&amp;nbsp; Υπάρχει κάποιος εύκολος τρόπος να γίνει αυτό μαζικά ή πρέπει να ελέγχω στα πάντα ξεχωριστά αν τρέχει ο backgroundworker?&lt;br&gt;&lt;br&gt;Σεραφείμ&lt;br&gt;</description></item><item><title>Απ: Ανανέωση winform</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/69277.aspx</link><pubDate>Mon, 13 Feb 2012 12:40:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:69277</guid><dc:creator>George Parissis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/69277.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=69277</wfw:commentRss><description>&lt;p&gt;Το control που χρειάζεσαι είναι το BackgroundWorker.&lt;/p&gt;</description></item><item><title>Ανανέωση winform</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/69271.aspx</link><pubDate>Mon, 13 Feb 2012 05:42:17 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:69271</guid><dc:creator>serakar</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/69271.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=69271</wfw:commentRss><description>Καλησπέρα σε όλους&lt;br&gt;&lt;br&gt;Το πρόβλημα που έχω εμφανίζεται σε διάφορα σημεία στις εφαρμογές μου αλλά θα δώσω ένα απλό παράδειγμα.&amp;nbsp; Έχω μία winform με ένα button Και ένα progressbar.&amp;nbsp; Πατώντας το κουμπί ξενικάει μια διαδικασία που κάνει κάποιες μεταφορές data αρχείων μεταξύ δύο databases (sqlserver-odbc).&amp;nbsp; Η μεταφορά του κάθε αρχείου μπορεί να κρατήσει από μερικά δευτερόλεπτα έως αρκετά λεπτά, ανάλογα με το μέγεθος.&amp;nbsp; Θέλω λοιπόν να δείξω την πρόοδο με το progressbar.&amp;nbsp; Καταλαβαίνω ότι δεν μπορώ να έχω ανανέωση της φόρμας όσο γίνεται η κάθε μεταφορά, μια και γίνεται με μία εντολή (εκτός αν χρησιμοποιήσω async μεθόδους, αλλά γι αυτό θα περιμένω το επόμενο VS &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-1.gif" alt="Smile" /&gt; ) αλλά, μια και μιλάμε για σχεδόν 30 αρχεία, τουλάχιστον να δείχνω πόσα αρχεία έχουν ολοκληρωθεί.&amp;nbsp; Κάνω λοιπόν το max του progressbar όσα είναι τα αρχεία και τρέχω το παρακάτω loop:&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;                &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&lt;/span&gt; (&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; f &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0; f &amp;lt; Tfiles.Rows.Count; f++)
                {
                   \\  Εδώ είναι ο κώδικας που κάνει το transfer \\
                    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.progressBarTransfers.Value &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; f+1;
                    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;this&lt;/span&gt;.progressBarTransfers.Refresh();
                }&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;Πριν βάλω το Refresh() δεν έδειχνε τίποτα απολύτως στην φόρμα όσο προχώραγαν τα transfers, και μόνο όταν τελείωνε όλη η διαδικασία έδειχνε το progressbar γεμάτο.&amp;nbsp; Μετά το Refresh() δείχνει κανονικά, εκτός αν (όπως είναι φυσιολογικό όταν κάτι μπορεί να κρατήσει αρκετή ώρα σε σύνολο) κάποιος γυρίσει σε κάποια άλλη εφαρμογή (Excel, IE, οτιδήποτε), που σ' αυτή την περίπτωση η εφαρμογή εμφανίζει πλέον '(Not Responding)' στον τίτλο της και δεν κάνει καμιά ανανέωση στο progressbar μέχρι να τελειώσει όλη η διαδικασία, όπου και δείχνει το progressbar γεμάτο.&amp;nbsp; Αυτό ειναι πολύ εκνευριστικό γιατί αν θες κάποια στιγμή να γυρίσεις και να δεις σε ποιο στάδιο είναι η διαδικασία πλέον δεν μπορείς.&amp;nbsp; Τι μπορώ να κάνω για να μην συμπεριφέρεται έτσι;&lt;br&gt;&lt;br&gt;Ευχαριστώ πολύ&lt;br&gt;&lt;br&gt;Σεραφείμ&lt;br&gt;&lt;br&gt;</description></item></channel></rss>