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

 

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

C++ συνάρτηση Sleep που καλείται από C#

Îåêßíçóå áðü ôï ìÝëïò m6s. Τελευταία δημοσίευση από το μέλος darklynx στις 27-06-2009, 04:58. Υπάρχουν 12 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-06-2009, 15:47 51813

    C++ συνάρτηση Sleep που καλείται από C#

    Καλημέρα!

    Υπήρξε μια φαεινή ιδέα, τις προάλλες και μου έχει κάψει τα εγκεφαλικά κύτταρα...όσα έχουν μείνει καλοκαιριάτικα! :-)

    Έχω μια εφαρμογή C# που αποτελείται απο ένα server και πολλά client μηχανάκια, τα οποία συνδέονται μέσω Remoting και παίρνουν διάφορα data ώστε να ρυθμιστούν ώς "πελάτες".

    Στόν server, υλοποιώ ένα μικρό snippet το οποίο το μόνο που κάνει είναι Sleep για την ακριβεία :
    bool Class::CheckSleep()
    bool sleep = true;
    while (sleep) {
    cout << "Sleep in..." << endl;
    Sleep(10000)
    cout << "Sleep out." << endl;
    sleep = false;
    return true;
    }

    Το κάνα dll σίγουρα φορτώνεται απο τον C# κώδικα, και πραγματικά έχω και έξοδο στο τερματικό μηνυμάτων.
    Παρόλαυτα...η κλήση της C++ συνάρτησης, που θεωρητικά παγώνει την εφαρμογή για 10sec(?), δεν παγώνει πραγματικά τίποτα.
    Ο κώδικας C#, συνεχίζει απτότητα, και βλέπω μετά απο λίγo ..."Sleep out".
    Στον κώδικα δε, της C# πρόσθεσα έπειτα και αυτό :
    while ( CheckSleep(clientIP) ) {
                    System.Threading.Thread.Sleep(2000);
                }
    Ενοείται ότι η CheckSleep καλεί την ομόνυμη συνάρτηση στην dll.
    Και πάλι όμως δεν πετυχαίνω τον κώδικα της C# να "παγώσει" μέχρι να βγεί η C++ απο τον "ύπνο" και την λούπα....

    Καμιά ιδέα...?
  •  18-06-2009, 17:20 51816 σε απάντηση της 51813

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Τι προσπαθείς να πετύχεις με αυτόν τον κώδικα;Προφανώς όχι να βάλεις τον client να κοιμηθεί για 10 δευτερόλεπτα γιατί απλά θα έδινες απευθείας την εντολή από αυτόν.Τι σκοπό εξυπηρετεί αυτό το unmanaged dll;Και γιατί δίνεις δύο διαφορετικές sleep εντολές;Ανάλογα με αυτόν τον σκοπό εξαρτάται και η λύση στο πρόβλημά σου,που θα μπορούσε π.χ να είναι απλά η χρήση ενός synchronization object.

    Από ότι είδα στον unmanaged κώδικα χρησιμοποίησες την Sleep με τέτοιο τρόπο σαν να περίμενες να συνεχίσει να εκτελείται ο κώδικας κάτω από αυτήν προτού τελειώσουν τα 10 δευτερόλεπτα,πράγμα που δεν ισχύει.Επίσης το dll σου και ο client σου είναι λογικά σε διαφορετικά threads. 

     

  •  18-06-2009, 17:30 51817 σε απάντηση της 51816

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Εφόσον η Sleep παγώνει την εκτέλεση του προγράμματος, προσπαθώ καλώντας την Sleep σε C,C++ dll, να "παγώσω" και τον κώδικα που εκτελείται σε C#, και ο οποίος καλεί την DLL. Ουσιαστικά να κάνω "unresponsive" τον server.

    Το ότι δίνω 2 διαφορετικές εντολές, στο τέλος είναι για να πεισθώ ότι συμβαίνει αυτό που δεν έχω βρεί γραμμένο...(ίσως να μου έχει ξεφύγει...) δηλαδή ότι πρέπει πολύ πιθανώς σε άλλο thread η C++ και σε άλλο thread ο C# κώδικας να εκτελείται....πράγμα...που δεν καταλαβαίνω γιατί...

    Και αν αυτό ισχύει, πώς τότε καλείς μια dll και περιμένεις η οποία δεν θές να κάνει ένα printf...ένα cout, αλλά να επεξεργαστεί κάτι να βγάλει αποτέλεσμα...και το αποτέλεσμα να το επιστρέψει στην C#. Και μόνο τότε η C# να προχωρήσει...αλλιώς να περιμένει...
  •  22-06-2009, 20:05 51932 σε απάντηση της 51817

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Φίλτατε darklynx, το synchronized object που είπες με οδήγησε στην λύση. Το πρόβλημα ήταν ο timer (χρονόμετρο). Απλά το χρονόμετρο κάθε Χ δεύτερα ξεκίναγε νέο event χωρίς να ελέγχει αν το προήγουμενο τελείωσε. Με ένα στατικό locker όμως λύθηκε το θέμα, στο οποίο ξεκινάω το thread και ελέγχω αν είναι ήδη ενεργοποιημένο, να κάνει join() αλλιώς αν το isliving() είναι ψευδές, ξεκίνα νέα εκτέλεση του C++ κώδικα...
    Ευχαριστώ.
  •  23-06-2009, 01:40 51936 σε απάντηση της 51932

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Χαίρομαι,είχα την απορία τι προκαλούσε το πρόβλημα αλλά ο timer εξηγεί την κατάσταση.Πρόσεξε μόνο να βάλεις timeout στην join γιατί αν συμβεί οτιδήποτε που να κολλήσει την εκτέλεση του "χρονοβόρου" κώδικα θα έχεις deadlock στο main thread σου..
  •  23-06-2009, 12:41 51938 σε απάντηση της 51936

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Το πρόβλημα είναι σχεδόν αυτό όμως...Δηλαδή, να παγώσω όλο το interface θέλω. Παρόλο ότι πέτυχα ο timer να "βουτάει" στο κώδικα της dll, και παρόλο ότι πράγματι περιμένει το συγκεκριμένο κομμάτι κώδικα την εκτέλεση και επιστροφή απο το dll απάντησης, το υπόλοιπο interface έξω απο το timer, δεν σταματάει την λειτουργεία του. Το πρόβλημα είναι ότι θέλω και το main thread ( parent thread, να το πώ; ) να σταματάει...Οπότε προς το παρόν, μου προκύπτει μισή λύση...στο πρόβλημα...Καμιά ιδέα ακόμα; :-)
  •  23-06-2009, 12:57 51939 σε απάντηση της 51938

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Μου φαίνεται πελαγοδρομείς χωρίς λόγο. Κανονικά θα πρέπει όταν καλείς το web service να εμφανίζεις ένα modal dialog "please wait", ενδεχομένως με ένα cancel button, και όταν τελειώνει η κλήση να το εξαφανίζεις. Το modal dialog δεν θα επιτρέπει στο χρήστη να κάνει τίποτε άλλο πέρα από το να περιμένει.


    Vir prudens non contra ventum mingit
  •  23-06-2009, 13:20 51941 σε απάντηση της 51939

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Τελικά....σώθηκα απο το πελαγοδρόμισμα ;-) χρησιμοποιώντας System.Windows.Forms.Timer ( που ευελπιστώ, να μην γίνει deprecated :-p )
    Ευχαριστώ παιδιά!
  •  23-06-2009, 15:51 51948 σε απάντηση της 51938

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    m6s:
    Το πρόβλημα είναι σχεδόν αυτό όμως...Δηλαδή, να παγώσω όλο το interface θέλω. Παρόλο ότι πέτυχα ο timer να "βουτάει" στο κώδικα της dll, και παρόλο ότι πράγματι περιμένει το συγκεκριμένο κομμάτι κώδικα την εκτέλεση και επιστροφή απο το dll απάντησης, το υπόλοιπο interface έξω απο το timer, δεν σταματάει την λειτουργεία του. Το πρόβλημα είναι ότι θέλω και το main thread ( parent thread, να το πώ; ) να σταματάει...Οπότε προς το παρόν, μου προκύπτει μισή λύση...στο πρόβλημα...Καμιά ιδέα ακόμα; :-)

    Αν απλά θες να απενεργοποιήσεις το UI το παλιό καλό οπλοστάσιο (disable της φόρμας,modal dialogs,progress bars κ.τ.λ) είναι παραπάνω από αρκετό.Αν το πρόβλημα είναι να συγχρονίσεις server και client τότε η λύση είναι να κάνεις το remoting σου ασύγχρονο.Ο timer από ότι περιγράφεις συγχρονισμό κάνει απλά όχι με τον καλύτερο τρόπο.Το συγκεκριμένο dll περιέχει το remoting object σου;Και πως ακριβώς το χρησιμοποιείς;Ίσως η δομή του project σε κάποιο σημείο είναι πιο πολύπλοκη από ότι χρειάζεται.Αν θες να κάνεις attach ένα τμήμα του κώδικα που να φανερώνει τη δομή του και κυρίως το πως υλοποιείς το remoting σίγουρα θα έχουμε ιδέες για να το βελτιώσεις.

  •  26-06-2009, 15:55 52021 σε απάντηση της 51948

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Καταρχήν, ξανά σε ευχαριστώ για την ενασχόληση σου με το θέμα. Αργησα να απαντήσω, ένεκα γαστρεντερίτιδας...(μετά απο βρώση κρέπας, όπως έγραφε και η γνωμάτευση lol ).

    Δυστυχώς δεν μπορώ να δώσω κώδικα αυτούσιο, το όλο concept το έχεις όμως.
    Η εφαρμογή ξεκινάει, ο κώδικας μέσα απο έλεγχο if ( t.isAlive() ) t.Join() else t.Start() οπου t είναι το thread του C++, ελέγχω ότι μια φορά εκτελείται ο κώδικας μέσα στην C++. Και είναι "sweet as a dream". Το μόνο που μου μεινε και που μου χαλάει την μαγεία, είναι το γεγονός, ότι χρησιμοποιώ τον timer της φόρμας, και δίνω ενα απειροελάχιστο this.Enabled = false, στην φόρμα. Με αποτέλεσμα, ενώ σε χρόνο dt ο C++ κώδικας επιστρέφει τιμή true, το interface κάνει flicker...

    Προκύπτει λοιπόν μια απορία...μπορώ να περάσω τον "pointer"(!) της φόρμας..C# στον κώδικα της C++, και να κάνω this.Enabled = true μέσα στη C++ ?


  •  26-06-2009, 23:10 52034 σε απάντηση της 52021

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Αν έφτιαχνες το dll με C++/CLI (έκανες δηλαδή ένα mixed code assembly) το να πάρεις τη φόρμα και να της αλλάξεις ότι properties θέλεις θα ήταν παιχνιδάκι,δεν ξέρω όμως αν ταιριάζει με τις προδιαγραφές του project σου.

    Μια άλλη λύση είναι να περάσεις το property Handle της φόρμας στον unmanaged κώδικα και να χρησιμοποιήσεις Win32 API,π.χ EnableWindow για να κάνεις disable την φόρμα.Αυτό όμως έχει δύο μειονεκτήματα:τα properties της φόρμας δεν θα έχουν απαραίτητα την σωστή τιμή και επιπλέον το Handle property μπορεί να αλλάξει σε ανύποπτο χρόνο από τη φόρμα σου (μερικές φορές κάνει recreate το handle) και να μην ισχύει πια η τιμή που έχεις περάσει στον unmanaged κώδικα.

    Όσον αφορά την βρώση κρέπας,εύχομαι η δυσάρεστη κατάληξη να μην σε αποτρέψει από ανάλογο εγχείρημα στο μέλλον.Pizza

  •  27-06-2009, 00:32 52036 σε απάντηση της 52034

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    oxi tixea loipon se lene dark? Big Smile  mou arese oti akrivos eipes & krepa xlomo na fao gia poli kairo   Wink
    thanx man
  •  27-06-2009, 04:58 52043 σε απάντηση της 52036

    Απ: C++ συνάρτηση Sleep που καλείται από C#

    Χεχε δεν έφτιαξα το nickname μου σκεπτόμενος το μαύρο χιούμορ μου αλλά είναι και αυτό μια οπτική γωνία του πράγματος.Stick out tongue

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems