Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Threading + Clipboard

Îåêßíçóå áðü ôï ìÝëïò dimos.homatas. Τελευταία δημοσίευση από το μέλος Markos στις 28-03-2011, 13:01. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  17-03-2011, 23:26 64300

    Threading + Clipboard

    Καλησπέρα σας, έχω ένα 'περίεργο' πρόβλημα...

    φτιάχνω ένα εργαλειάκι κάνει αναζητήσεις στο bing επιλέγοντας κείμενο από οπουδήποτε. Κάτι σαν αυτό που κάνουν οι browsers αλλά εκτός περιβάλλοντος browser.

    Υπάρχει μία ικανοποιητική δόση unmanaged κώδικα αλλά αυτά δουλεύουν σωστά.

    Ποια είναι η λογική:

    Ξεκινά ένα thread το οποίο μεταξύ άλλων χρησιμοποιεί τον clipboard ως buffer για να τσιμπήσει το κείμενο που έχει επιλέξει ο χρήστης.

    Γίνεται έλεγχος εάν υπάρχουν δεδομένα στον clipboard.

    Εάν ναι, τότε αυτά αποθηκεύονται στον σε έναν buffer, χρησιμοποιείται ο clipboard για να πάρει η εφαρμογή το κείμενο, και μετά τα αρχικά δεδομένα επαναφέρονται.

    Και εδώ είναι το πρόβλημα:

    "System.Runtime.InteropServices.ExternalException: Requested Clipboard operation did not succeed."

    Πότε βγαίνει, πότε δεν βγαίνει... από ότι διάβασα εδώ προτείνεται η χρήση του Clipboard.SetDataObject(object data, bool copy, int retryTimes, int retryDelay). 

    Εγώ από την άλλη υλοποίησα αυτό:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
                    bool textfailed = false;
                    do
                    {
                        try
                        {
                            Clipboard.SetText(ClipText);
                            textfailed = false;
                            return;
                        }
                        catch 
                        {
                            textfailed = true;
                        }
                        
                    } while (textfailed);

    Τα δεδομένα είναι:

    1) Σίγουρα κάποιο μπέρδεμα γίνεται με τα threads, αλλά οι δοκιμές μου είναι τόσο αθώες που δεν δικαιολογείται αυτό. Κάνω μόνο ένα copy
    2) Χτυπάει χωρίς να αντιληφθώ κάποιο pattern
    3) Δεν χρησιμοποιώ την SetDataObject, γιατί απλά δεν ξέρω ΠΟΣΕΣ φορές θα χτυπήσει! Βέβαια και η δική μου λύση είναι λίγο... πατέντα. Γιατί ποιος ξέρει πότε θα βγει από το loop.
    4) Από την άλλη και SetDataObject κάτι τέτοιο θα κάνει, και δεδομένου ότι περνάει και όρισμα τις επαναλήψεις και τις καθυστερήσεις, μάλλον το κάνει και με... χειρότερο τρόπο.
    5) Να επισημάνω ότι χειρίζομαι τους υπόλοιπους τύπος δεδομένων με παρεμφερή τρόπο, απλώς παραθέτω το παράδειγμα του text
    6) Χρησιμοποιώ .ΝΕΤ 3.5 SP1

    Επίσης να πω ότι φταίει... ο Chrome! Για κάποιον λόγο, δεν κάνει απευθείας copy όταν πάρει εντολή και χρειάζεται κάποια αναμονή μέχρι να μπουν τα δεδομένα στον clipboard. Το γιατί, θα σας γελάσω, μόνο στον chrome συμβαίνει αυτό. Και μιλάω τόσο για browsers όσο και για όλων των ειδών τα παράθυρα. Οπότε αναγκάστηκα να βάλω ένα Thread.Sleep μέσα σε ένα υπάρχον thread. Κάπου εκεί χάνεται το παιχνίδι, αλλά... δεν μπορώ να καταλάβω περαιτέρω και ακολουθώ συμπτωματική θεραπεία.

    Το μόνο που πάει το μυαλό μου είναι να φτιάξω κάναν πιο ψαγμένο μηχανισμό, πχ να αποθηκεύει σε κάποια ουρά τα προϋπάρχοντα δεδομένα του clipboard και να υπάρχει ένα άλλο πρόγραμμα/thread που να κάνει κάποιου είδους clipboard management, αλλά μου φαίνεται υπερβολικό.

    Ή θα μπορουσα και να πω στον χρήστη "τα δεδομένα σου χάθηκαν" αλλά αυτό δεν είναι καλό.

    Οποιαδήποτε βοήθεια/insight είναι παραπάνω από ευπρόσδεκτη.


    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  18-03-2011, 12:07 64302 σε απάντηση της 64300

    Απ: Threading + Clipboard

    Δεν έχω ασχοληθεί στο παρελθόν με κάτι τέτοιο, αλλά μου φαίνεται ότι προσπαθείς να φτιάξεις κάποιο clipboard activity monitor. Ίσως σε βοηθήσουν αυτά τα δύο άρθρα:

    1. Monitoring Clipboard Activity in C#.
    2. Create a Windows Clipboard Monitor in C# using SetClipboardViewer.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  18-03-2011, 12:25 64303 σε απάντηση της 64302

    Απ: Threading + Clipboard

    Ευχαριστώ, τα έριξα μια ματιά και μου φαίνεται ότι είναι στην σωστή κατεύθυνση. Θα δοκιμάσω την προσέγγιση τώρα το ΠΣΚ και θα ενημερώσω.

    Να αναφέρω επίσης ότι όσο οι λειτουργίες αυτές βρίσκονταν μέσα στο UI Thread, δούλευε σωστά. Το πρόβλημα προέκυψε επειδή έχω και ένα mousehook και έτρωγε ένα σκάλωμα η διαδικασία βρες παράθυρο -> κάνε copy, οπότε μπήκε όλο μαζί σε άλλο thread. Και ενώ ξεσκάλωσε το UI, προέκυψε το θέμα με τον clipboard.

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  28-03-2011, 12:01 64645 σε απάντηση της 64303

    Απ: Threading + Clipboard

    Τελικά (και για την ιστορία) άλλαξα τον σχεδιασμό. Αφενός μεν ο Clipboard πρέπει να είναι σε STAThread, αφετέρου δε δεν ήταν αυτή η περίπτωση: στις λειτουργίες του clipboard έπρεπε να είχαν πρόσβαση διαφορετικά threads, και εκεί χαλούσε το θέμα ότι apartment και να υπήρχε.

    Η λύση που ακολούθησα: οι λειτουργίες του clipboard εκτελούνται αποκλειστικά από το UI Thread κατόπιν "παραγγελίας" από τα διάφορα άλλα threads. Στον ρόλο του... σερβιτόρου ένα flag και ένας timer!

    Μάρκο, ευχαριστώ για το feedback. 

    Το ερώτημα που προκύπτει είναι προς τι αυτή η ιδιοτροπία του Chrome... κάτι σε quick n dirty πατσάρισμα μου μυρίζεται.

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  28-03-2011, 13:01 64646 σε απάντηση της 64645

    Απ: Threading + Clipboard

    Ρίξε μια ματιά εδώ. Απ' ό,τι βλέπω βέβαια, η ApartmentState porperty είναι obsolete κι έχει αντικατασταθεί από την SetApartmentState method.

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems