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

 

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

WriteFile & ReadFile αλληλομπλοκαρονται σε Non-overlapped I/O

Îåêßíçóå áðü ôï ìÝëïò mixio. Τελευταία δημοσίευση από το μέλος mixio στις 02-03-2009, 18:20. Υπάρχουν 18 απαντήσεις.
Σελίδα 1 από 2 (19 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-02-2009, 23:58 48657

    WriteFile & ReadFile αλληλομπλοκαρονται σε Non-overlapped I/O

    Χρησιμοποιω την WriteFile() απο την Main() για να γραφω σε μια συσκευη.
    Εχω ενα θεμα και πρεπει να χρησιμοποιω Timer για να γραφω με την WriteFile() και σε τακτα χρονικα διαστηματα.
    Το προβλημα ειναι οτι οταν καλω την WriteFile() μεσα απο τo time_elapsed του Timer αυτη δεν λειτουργει (η WriteFile)
    Απ΄οτι καταλαβα η WriteFile αν κληθει απο καποιο αλλο νημα εκτος του Main() δεν τρεχει .

    Μπορει καποιος να βοηθησει;
    Ειναι το τελευταιο θεμα που εμεινε για να ολοκληρωσω την εφαρμογη της πτυχιακης μου. Big Smile

    Sleep-deprived psychotic hacker

  •  24-02-2009, 00:22 48658 σε απάντηση της 48657

    Απ: WriteFile & Threads

    Προσδιόρισε για ποια WriteFile μιλάς για να μην ψάχνεται ο κόσμος και παίρνεις και τζάμπα άσχετες απαντήσεις. Αν θυμάμαι καλά από παλιό σου thread μιλάς για κάποια WriteFile του kernel32; Όχι π.χ. για την Response.WriteFile της ASP.NET.

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  24-02-2009, 12:10 48671 σε απάντηση της 48658

    Απ: WriteFile & Threads

    Η υπογραφη της WriteFile ειναι αυτη
      
            public static extern bool WriteFile(
                IntPtr hFile,
                byte[] lpBuffer,
                int nNumberOfBytesToWrite,
                out int lpNumberOfBytesWritten,
                IntPtr lpOverlapped
            );

    και την χρησιμοποιω ως εξης
    Kernel32.WriteFile(TunHandle, packet, packet.Length, out BytesWritten, IntPtr.Zero)


    Η υπογραφη της CreateFile:

            public static extern IntPtr CreateFile(
                string filename,
                uint fileaccess,
                uint fileshare,
                IntPtr securityattributes,
                uint creationdisposition,
                uint flags,
                IntPtr template
            );

    και ανοιγω την συσκευη σε synchronous mode με

    Kernel32.CreateFile(
                            "\\\\.\\Global\\" + devGuid + ".tap",
                            (uint)(Kernel32.AccessRights.GENERIC_READ|Kernel32.AccessRights.GENERIC_WRITE),
                            (uint)(Kernel32.ShareModes.FILE_SHARE_READ|Kernel32.ShareModes.FILE_SHARE_WRITE),
                            IntPtr.Zero,
                            (uint)(Kernel32.CreationDispositions.OPEN_EXISTING),
                            Kernel32.FILE_ATTRIBUTE_SYSTEM,
                            IntPtr.Zero);

    Το προβλημα ειναι πως η WriteFile δεν λειτουργει αν την καλεσεις απο αλλο νημα εκτος του Main().


    Sleep-deprived psychotic hacker

  •  24-02-2009, 22:40 48706 σε απάντηση της 48671

    Απ: WriteFile & Threads

    Άρα όντως μιλάς για την WriteFile του Kernel. Μιλάς δηλαδή για unmanaged κώδικα. Γενικά, καλό είναι οι ερωτήσεις να γίνονται στα κατάλληλα forum, διαφορετικά δημιουργείται σύγχιση. Στην περίπτωση σου για παράδειγμα, το λογικότερο θα ήταν να υποθέσει κάποιος ότι αφού γράφεις στο .NET Framework forum, αναφέρεσαι σε κάποια μέθοδο κάποιας κλάσης του .NET, π.χ. της HttpResponse.WriteFile.

    Όσον αφορά τη WriteFile και το main thread, είναι απολύτως βέβαιο ότι δουλεύει από οποιοδήποτε thread. Το multi-threading δεν είναι ανακάλυψη του .NET Framework. Υπάρχουν χιλιάδες unmanaged εφαρμογές οι οποίες χρησιμοποιούν multithreading και χρησιμοποιούν την WriteFile από διαφορετικά threads. Μάλιστα, η εκτέλεση του I/O σε ξεχωριστά threads είναι μία από τις βασικότερες τεχνικές για να βελτιώσεις την απόδοση μίας εφαρμογής.

    Το πρόβλημα (το οποίο δεν αναφέρεις) βρίσκεται σίγουρα στον δικό σου κώδικα. Τί εννοείς "δεν λειτουργεί"? Τί συμβαίνει" Εμφανίζεται error? Επιστρέφει κάποιο Error Code? Ποιό είναι αυτό? Έχεις περάσει τους σωστούς pointers από το ένα thread στο άλλο?

    Και γιατί τέλος πάντων, δεν χρησιμοποιείς τις I/O κλάσεις του .ΝΕΤ αλλά παίζεις με unmanaged κλήσεις μέσα σε managed κώδικα?


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  24-02-2009, 23:06 48707 σε απάντηση της 48706

    Απ: WriteFile & Threads

    Παναγιώτης Καναβός:

    Άρα όντως μιλάς για την WriteFile του Kernel. Μιλάς δηλαδή για unmanaged κώδικα. Γενικά, καλό είναι οι ερωτήσεις να γίνονται στα κατάλληλα forum, διαφορετικά δημιουργείται σύγχιση. Στην περίπτωση σου για παράδειγμα, το λογικότερο θα ήταν να υποθέσει κάποιος ότι αφού γράφεις στο .NET Framework forum, αναφέρεσαι σε κάποια μέθοδο κάποιας κλάσης του .NET, π.χ. της HttpResponse.WriteFile.


    Όσον αφορά τη WriteFile και το main thread, είναι απολύτως βέβαιο ότι δουλεύει από οποιοδήποτε thread. Το multi-threading δεν είναι ανακάλυψη του .NET Framework. Υπάρχουν χιλιάδες unmanaged εφαρμογές οι οποίες χρησιμοποιούν multithreading και χρησιμοποιούν την WriteFile από διαφορετικά threads. Μάλιστα, η εκτέλεση του I/O σε ξεχωριστά threads είναι μία από τις βασικότερες τεχνικές για να βελτιώσεις την απόδοση μίας εφαρμογής.


    Το πρόβλημα (το οποίο δεν αναφέρεις) βρίσκεται σίγουρα στον δικό σου κώδικα. Τί εννοείς "δεν λειτουργεί"? Τί συμβαίνει" Εμφανίζεται error? Επιστρέφει κάποιο Error Code? Ποιό είναι αυτό? Έχεις περάσει τους σωστούς pointers από το ένα thread στο άλλο?


    Και γιατί τέλος πάντων, δεν χρησιμοποιείς τις I/O κλάσεις του .ΝΕΤ αλλά παίζεις με unmanaged κλήσεις μέσα σε managed κώδικα?



    Οκ, μολις τελιωσει αυτο το thread ας το περασει καποιος moderator εκει που πρεπει. Ειλικρινα δεν γνωριζα αυτα που ειπες.

    Τι να σου πω. Εκτελω το παρακατω απο εναν Timer που δημιουργησα στην Main()

                if (Kernel32.WriteFile(TunHandle, packet, packet.Length, out BytesWritten, IntPtr.Zero))
                {
                    Console.WriteLine("Written: " + BytesWritten);
                }
                else
                {
                    Console.WriteLine("WriteTun: Could not write on tun.");
                }

    Δεν βγαζει κανενα απο τα δυο μηνυματα.
    Τον ιδιο κωδικα αν τον τρεξω μεσα στην Main() δουλευει κανονικα.
    Για τα errors που λες υπαρχει κατι που μπορω να προσθεσω στον κωδικα αυτον για να μου τυπωνει τα ενδεχομενα errors?
    Γιατι αναφερεσαι σε pointers? Με μπερδευεις. Υπενθυμιζω οτι εχω ανοιξει το TunHandle σε non-overlapped mode.

    Φιλε μου για το τελευταιο που ρωτησες δεν υπαρχει απαντηση. Δεν ξερω πως κατεφυγα σε unmanaged κλησεις που λες παντως θυμαμαι οταν χρησιμοποιουσα FileStream για I/O στο εικονικο device τιποτα δε επαιζε.
    Ευχαριστω για το χρονο σου.


    PS. θυμηθηκα γιατι μπηκα σε unmanged. Υπαρχει αυτο το thread http://www.dotnetzone.gr/cs/forums/thread/46385.aspx
    Sleep-deprived psychotic hacker

  •  25-02-2009, 20:08 48733 σε απάντηση της 48707

    Απ: WriteFile & Threads

    Καμια βοηθεια ρε παιδες; Tongue Tied

    Sleep-deprived psychotic hacker

  •  26-02-2009, 12:12 48740 σε απάντηση της 48733

    Απ: WriteFile & Threads

    Λοιπον βρηκα μια αλλη πληροφορια που ισως βοηθησει.

    Οταν τερματιζεται η εφαρμογη ολα WriteLine() που δεν εκτελεσθηκαν απο τα timer_elapsed που γιναν καθ'ολη την διαρκεια,
    εκτελουνται ολα μαζι στο τελος με αποτελεσμα να βλεπω στην κονσολα μαζεμενα
    "Written: x bytes"
    "Written: y bytes"
    "Written: z bytes"
    ...

    Καποιος; Κερναω μπυρες Beer σε οποιον συνδραμει Big Smile

    Sleep-deprived psychotic hacker

  •  26-02-2009, 14:39 48741 σε απάντηση της 48740

    Απ: WriteFile & Threads

    Είσαι σίγουρος ότι ο timer εκτελείται όπως νομίζεις? Υπάρχουν 3 διαφορετικοί timers, με διαφορετκή συμπεριφορά. Ποιόν χρησιμοποιείς εσύ? Πως τον καλείς?  Γιατί πιστεύεις ότι η WriteFile δεν εκτελείται? Το είδες στον Debugger ή θεωρείς ότι επειδή δεν είδες αμέσως τα αποτελέσματα της Console.WriteLine δεν έτρεξε και ο κώδικας?

    mixio, μπλέκεις πάρα πολλά πράγματα μαζί με αποτέλεσμα να πελαγοδρομείς. Δεν γίνεται να γράψεις κώδικα, ειδικά για διπλωματική, αντιγράφοντας ένα code snippet και παλεύοντας να το κάνεις να δουλέψει. Επίσης, μας λες τί συμβαίνει αποσπασματικά, με αποτέλεσμα να μην μπορεί κανείς να καταλάβει τί συμβαίνει.

    Για παράδειγμα, ΟΛΕΣ οι παράμετροι της WriteFile είναι pointers. Αν δεν καταλαβαίνεις τί είναι αυτές οι παράμετροι, δύσκολα θα κάνεις και την WriteFile να δουλέψει. Αν κοίταζες το documentation της WriteFile θα έβλεπες ότι περιέχει παραδείγματα πως να την καλέσεις και πως να δεις τί λάθος συμβαίνει με την GetLastError().

    Άλλο παράδειγμα, μετά από τόσα posts αναφέρεις ότι χρησιμοποιείς κάποιο timer, αλλά πρέπει από την ναφορά στο Timer_Elapsed να καταλάβω ότι μάλλον μιλάς για τον System.Timers.Timer.

    Όταν αντιμετωπίζεις πρόβλημα θα πρέπει να το σπάσεις σε κομμάτια. Καταρχήν, αναντιμετωπίζεις περίεργη μπεριφορά, κατά κανόνα το πρόβλημα βρίσκεται στον κώδικα σου και όχι στο λειτουργικό (η WriteFile είναι τμήμα του λειτουργικού). Πιστεύεις ότι έχει πρόβλημα ή WriteFile? Απομόνωσε τη σε ένα ανεξάρτητο πρόγραμμα ή μέθοδο, και δοκίμασε αυτή και μόνο. Νομίζεις ότι έχει πρόβλημα ο Timer? Φτιάξε ένα άλλο πρόγραμμα, μόνο με τον timer, και δες πως δουλεύει μέσα από το debugger.

    Το άλλο σημαντικό που πρέπει να κάνεις, είναι το RTFM. Όταν ασχολείσαι με κάποιο API ή function που δεν έχεις ξαναχρησιμοποιήσει, το RTFM ΔΕΝ είναι προαιρετικό. Ειδικά για το Windows API, το documentation έχει κοσκινιστεί εδώ και 10 χρόνια, με αποτέλεσμα να έχει πολύ καλή δομή, τόσο στις επεξηγήσεις όσο και στα παραδείγματα. Εκεί θα βρεις σχεδόν ό,τι χρειάζεσαι.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  26-02-2009, 16:18 48743 σε απάντηση της 48741

    Απ: WriteFile & Threads

    Χρησιμοποιω τον System.Timers.Timer() με
                    timer.Elapsed += new ElapsedEventHandler(ping_elapsed);
                    timer.Interval = 1000;
                    timer.Start();
    Μεσα στην ping_elapsed() εχω την WriteFile() και πριν απο την WriteFile() τυπωνω ενα μηνυμα για να δω μεχρι που εφτασε η ροη. Δεν ειδα σε debugger τιποτα.

    Την WriteFile την εχω μελετησει μια χαρα γι'αυτο αλλωστε ολη εφαρμογη δουλευει μεχρι τωρα. Στις αρχες μονο ειχα κατι προβληματα γιατι ανοιγα την συσκευη σε overlapped mode. Την GetLastError() την γνωριζω αλλα δεν την χρησιμοποιω γιατι πιστευω οτι δεν θα βγει κατι απο 'κει. Εννοειτε πως το προβλημα ειναι στον κωδικα και οχι στο OS. Δεν υπαρχει θεμα γι'αυτο. Ενταξει πρωτη φορα ασχοληθηκα στα βαθια με windows API λογικο δεν ειναι να πελαγοδρομισω; Angel

    Μια που ειπες οτι υπαρχουν και αλλοι timers θα τους βρω και 8α τους δοκιμασω.
    Τι αλλες πληροφοριες θα σου ηταν χρησιμες; επειδη λες οτι περιγραφω αποσπασματικα. Θα δω και στον debugger τιποτα.

    Ευχαριστω.



    Sleep-deprived psychotic hacker

  •  26-02-2009, 16:53 48745 σε απάντηση της 48743

    Απ: WriteFile & Threads

    Η αλήθεια είναι ότι δε χρησιμοποιώ Timers, δεν μου έχουν χρειαστεί δηλαδή μέχρι τώρα. Είσαι σίγουρος ότι έχεις διαβάσει σωστά την τεκμηρίωση της Timer Class; Καλείς την Timer_Elapsed μέσα από visual component; Αν ναι, έχεις θέσει το SynchronizingObject; Αντιγράφω από το documentation:

    When the Elapsed event is handled by a visual Windows Forms component, such as a button, accessing the component through the system-thread pool might result in an exception or just might not work. Avoid this effect by setting SynchronizingObject to a Windows Forms component, which causes the method that handles the Elapsed event to be called on the same thread that the component was created on.

     


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  26-02-2009, 17:48 48751 σε απάντηση της 48745

    Απ: WriteFile & Threads

    Markos δεν ειμαι σε GUI. Απλη console ειναι η εφαρμογη. Smile

    Sleep-deprived psychotic hacker

  •  26-02-2009, 18:40 48754 σε απάντηση της 48751

    Απ: WriteFile & Threads

    Μη δημιυργήσεις τον Timer μέσα στη Main() αλλά σε ξεχωριστή κλάση, κάπως έτσι:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Timers;

    namespace TimerExample
    {
       class Program
       {
          static void Main(string[] args)
          {
             Timming timming = new Timming();
             //
             Console.ReadLine();
          }
       }

       class Timming
       {
          Timer timer = new Timer();
          int iter = 0;
          //
          public Timming()
          {
             this.timer.Interval = 1000;
             this.timer.Enabled = true;
             this.timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
          }

          void timer_Elapsed(object sender, ElapsedEventArgs e)
          {
             iter++;
             Console.WriteLine("Iterations: " + iter.ToString());
          }

       }
    }

    Δοκίμασέ το και πες μας αν λειτούργησε.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  26-02-2009, 19:04 48755 σε απάντηση της 48754

    Απ: WriteFile & Threads

    Και στην Main να τον αφήσει, πάλι θα παίξει ο κώδικας. Δεν έχει σημασία σε ποιά κλάση είναι ο timer. Και ο παρακάτω κώδικας παίζει, χωρίς πρόβλημα:

    class Program
    {

    static void Main(string[] args)
    {
    System.Timers.Timer myTimer = new System.Timers.Timer();
    myTimer.Interval = 100;
    myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
    myTimer.Start();
    Thread.Sleep(1000);
    }

    static void myTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
    Console.WriteLine(e.SignalTime.ToString());
    }
    }

    ..........

    Μου ήρθε μία φλασιά. mixio, μήπως όλα τα threads προσπαθούν να γράψουν χρησιμοποιώντας το ίδιο handle? Μήπως η συσκευή που χρησιμοποιείς δεν επιτρέπει σε πολλά thread να γράψουν ή να την ανοίξουν ταυτόχρονα? Το ότι άνοιξες τη συσκευή με FILE_SHARE_WRITE δεν σημαίνει ότι δέχεται κιόλας να την ανοίξουν ή να γράψουν πολλοί ταυτόχρονα σε αυτή.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  26-02-2009, 19:16 48756 σε απάντηση της 48755

    Απ: WriteFile & Threads

    OK. Απλά μου πέρασε από το μυαλό μήπως ορίζει κάποιες static μεταβλητές που του δημιουργούν πρόβλημα. Γι' αυτό του είπα να τα βάλει σε μία κλάση. Βλέπεις, δε δίνει όλο τον κώδικα.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  26-02-2009, 23:33 48769 σε απάντηση της 48755

    Απ: WriteFile & Threads

    Παιδια εχω δοκιμασει αυτα που λετε εδω και καιρο αλλα τζιφος.

    Παναγιώτης Καναβός:

    Μου ήρθε μία φλασιά. mixio, μήπως όλα τα threads προσπαθούν να γράψουν χρησιμοποιώντας το ίδιο handle? Μήπως η συσκευή που χρησιμοποιείς δεν επιτρέπει σε πολλά thread να γράψουν ή να την ανοίξουν ταυτόχρονα? Το ότι άνοιξες τη συσκευή με FILE_SHARE_WRITE δεν σημαίνει ότι δέχεται κιόλας να την ανοίξουν ή να γράψουν πολλοί ταυτόχρονα σε αυτή.



    Ναι Πανο. Ειναι ενα global handle και ολα τα threads γραφουν σε αυτο (οχι παραλληλα). Πες μου οτι δεν ειναι σωστο;
    Πως να ξερω αν η συσκευη επιτρεπει ή οχι πολλα νηματα να γραφουν;
    Για να εξηγησω τι ειναι αυτη η συσκευη........ Ειναι μια εικονικη συσκευη που την δημιουργει ο Tap Driver του OpenVPN Project.
    Η χρηση της ειναι να μιλαει με userspace για να υλοποιειται οποιοδηποτε ειδος tunneling. Ολα αυτα τα VPN και λοιπα που ακουτε καθε μερα χρησιμοποιουν μια τετοια συσκευη.


    Sleep-deprived psychotic hacker

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