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

 

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

One Instance of an Application

Îåêßíçóå áðü ôï ìÝëïò plavidas. Τελευταία δημοσίευση από το μέλος KelMan στις 12-06-2005, 23:40. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-06-2005, 20:38 2681

    Lightning [li] One Instance of an Application

    Χαιρετώ και πάλι το forum χωρίς αυτή τη φορά να κάνω κάποια ερώτηση αλλα για να μιλήσω... [<:o)]

    μπορούμε πολύ εύκολα να ελέγξουμε άν η εφαρμογή μας τρέχει ήδη και να μην αφήνουμε να φορτωθεί δεύτερη φορά...

    'Returns true if it finds more than 'one processName' running
    Private Function CheckForDuplicateProcess(ByVal processName As String) As Βoolean

       'function returns true if it finds more than one 'processName' running
       Dim Procs() As Process
       'get ALL processes running on this machine in all desktops
       'this also finds all services running as well. 
       Procs = Process.GetProcesses()
       Dim count As Integer = 0
       
       For
    Each proc As Process In Procs
       
          If
    proc.ProcessName.ToString.Equals(processName) Then
             count += 1
          End If
       
       Next
    proc
          
       If
    count > 1 Then
          
    Return True
       Else
          Return False
       End If

    End
    Function

    Μπορεί για κάποιους να είναι χρήσιμη αυτή η Function

    Παναγιώτης Λαβίδας
    Software Developer


    Παναγιώτης Λαβίδας
    Software Developer
  •  12-06-2005, 14:30 2694 σε απάντηση της 2681

    Re: One Instance of an Application

    Χρήσιμος κώδικας, αλλά είναι λίγο αργός, όταν έχεις πολλά processes. Δεν μας επηρεάζει βέβαια αυτό πάρα πολύ μια και δεν πρόκειται να τρέχει συνεχώς (μονο στην αρχή), αλλα απλά το επισημαίνω.

    Στο loop, καλό είναι να προσθέσεις τη γραμμή:


    If count > 1 Then Exit For
     
    για να αποφύγεις να συνεχίσεις τον έλεγχο αφότου βρείς και δεύτερο process με το ίδιο όνομα. Ουσιαστικά θέλεις να μην φορτώσεις το ίδιο πράγμα αν το βρεις ήδη δύο φορές. (Μια αυτό που έχει τρέξει και μια αυτό που τρέχει τώρα).

    Επίσης να συμπληρώσω οτι το process name το παίρνεις με τον εξης κώδικα:


    Dim strCurrentProcessName As String
    strCurrentProcessName = _
    System.Diagnostics.Process.GetCurrentProcess.ProcessName.ToString()

     

    Τωρα βέβαια δεν ξέρω αν αυτός ο τρόπος είναι ασφαλής. Το process name εικάζω οτι πιθανόν να είναι κοινό και για εφαρμογές που μπορεί να μην είναι ίδιες.

    Κοιτώντας, βρήκα και ένα αρθράκι στο code project, που μπορεί να είναι χρήσιμο.

    Happy coding!






    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  12-06-2005, 17:48 2699 σε απάντηση της 2694

    Re: One Instance of an Application

    Mιας και είναι της μόδας Stick out tongue τα patterns, και μιας ο Panagiotis μάλλον ετοιμάζει τις βαλίτσες του για το TechEd και δεν πρόσεξε το post Stick out tongueStick out tongue, ορίστε πως λύνεται το πρόβλημα μέσω του singleton pattern...

    Public Class SingletonForm

        Inherits Form

        Private Shared theInstance As SingletonForm

     

        Private Sub New()

        End Sub

     

        Public Shared Function GetInstance() As SingletonForm

            If theInstance Is Nothing Then

                theInstance = New SingletonForm

            End If

            Return theInstance

        End Function

     

        Protected Overrides Sub OnClosing(ByVal e As System.ComponentModel.CancelEventArgs)

            e.Cancel = True

            Me.Hide()

        End Sub

    End Class


    To πλεονέκτημα αυτής της λύσης είναι ότι
    i) Όταν περιγράφετε την εφαρμογή που φτιάχνετε σε συνάδελφους developers θα αναφέρεστε στο pattern και έτσι θα είστε μέσα στο hype
    ii) Mπορεί να εφαρμοσθεί και για μεμονωμένες
    φόρμες μέσα στην εφαρμογή που θέλουμε να ανοίγουν μόνο μια φορά. Αν θέλουμε να ισχύει για όλη την εφαρμογή, μέσα από ένα Main καλούμε το SingletonForm.GetInstance, παίρνουμε το reference και το περνάμε στο Application.Run.

    Vir prudens non contra ventum mingit
  •  12-06-2005, 18:58 2704 σε απάντηση της 2699

    Re: One Instance of an Application

    Ενώ είχα γνώση του singleton pattern, και είχα βρεί και αντίστοιχα δείγματα κώδικα, αυτό που με προβλημάτιζε ήταν πως θα μπορούσα να πω σε μια εφαρμογή (και όχι σε μια μεμονωμένη φόρμα) οτι πρέπει να είναι singleton.

    Φαίνεται οτι μου λύνεις εδώ την απορία, Μανο. Θα μπορούσες να το περιγράψεις με περισσότερη λεπτομέρεια, ωστε και οι υπόλοιποι συνάδελφοι που τυχόν έχουν τον ίδιο προβληματισμό να πάρουν ιδέες;



    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  12-06-2005, 19:08 2705 σε απάντηση της 2704

    Re: One Instance of an Application

    Με πέτυχες την στιγμή που φεύγω για σινεμά... Θα απαντήσω μόλις γυρίσω...


    Vir prudens non contra ventum mingit
  •  12-06-2005, 23:32 2708 σε απάντηση της 2705

    Re: One Instance of an Application

    Δεν νομίζω ότι η εφαρμογή του singleton pattern σε επίπεδο κύριας φόρμας θα λειτουργήσει. Το νέο instance της εφαρμογής είναι σε άλλο AppDomain.

    Μιά καλή λύση (συνίσταται και στο MSDN) είναι η χρήση Mutex. Δες τον παρακάτω κώδικα (C# Console Application, προσαρμογή του κώδικα των links παρακάτω):



    using System;

    using System.Threading;

    namespace SingleInstance

    {

       /// <summary>

       /// Summary description for Class1.

       /// </summary>

       class Class1

       {

          private static Mutex mtx = null;

          /// <summary>

          /// The main entry point for the application.

          /// </summary>

          [STAThread]

          static void Main(string[] args)

          {

             if (IsAnotherInstanceRuning()) return;

             // Rest of code

             Console.Write("First instance\nPress Enter to close");

             Console.ReadLine();

             // DO NOT FORGET TO RELEASE IT
             if
    (mtx != null) mtx.ReleaseMutex();

          }

          private static bool IsAnotherInstanceRuning()

          {

             bool granted;

             mtx = new Mutex(true, "MyNamespace.MyApplication", out granted); // <-- Something unique for the App

             return !granted;

          }   

       }

    }


     

    Εάν θες να περιορίσεις την εφαρμογή σε ένα instance ακόμα και σε αλλαγή χρηστών (fast user switch - στα XP), κάνεις το mutex global. Για να το κάνεις αυτό, αντικατέστησε το "MyNamespace.MyApplication" με "GLOBAL\\MyNamespace.MyApplication"

    Τα σχετικά links:
    How to limit 32-bit applications to one instance in Visual C++
    How To Write an Application That Supports Fast User Switching in Windows XP

    Άρης


    Aris
  •  12-06-2005, 23:40 2710 σε απάντηση της 2708

    Re: One Instance of an Application

    Ναι, αυτό ετοιμαζόμουν να γράψω κι εγώ μόλις τώρα! Βιάστηκα λίγο προηγουμένως... Smile
    Τα mutexes είναι ωραίος τρόπος, χρησιμοποιούνται για interprocess synchronization και είναι και thread safe...


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