То, как удостовериться, что существует один экземпляр приложения, работает

Наконец, я нашел ответ, добавив следующий код

оператор импорта в MainApplication.java:

import com.facebook.react.BuildConfig;

Нашел ответ по следующей ссылке

React Native Ошибка сборки Android MainActivity.java:29: ошибка: не удается найти символ

7
задан Mark Brackett 24 December 2008 в 13:44
поделиться

10 ответов

Наиболее распространенный шаблон для того, чтобы сделать это должен использовать Шаблон "одиночка". Поскольку Вы не указали на язык, я собираюсь предположить, что Вы обращаетесь к C# здесь - в противном случае, принципы являются все еще тем же на большинстве языков OO.

Эта статья должна дать Вам некоторую справку.

-1
ответ дан 6 December 2019 в 07:28
поделиться

Это - что-то, что я использовал... (C# на.NET 2.0)

    [STAThread]
    private static void Main(string[] args)
    {
        //this follows best practices on
        //ensuring that this is a single instance app.
        string mutexName = "e50cf829-f6b9-471e-8d9f-67eac3699f09";
        bool grantedOwnership;
        //we prefix the mutexName with "Local\\" to allow this to run under terminal services.
        //The "Local\\" prefix forces this into local user space.
        //If we want to forbid this in TS, use the "Global\\" prefix.
        Mutex singleInstanceMutex = new Mutex(true, "Global\\" + mutexName, out grantedOwnership);
        try
        {
            if (!grantedOwnership)
            {
                MessageBox.Show("Error: X is already running.\n\nYou can only run one copy of X at a time.", "X", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                Application.Exit();
            }
            else
            {
                Application.Run(new X(args));
            }
        }
        finally
        {
            singleInstanceMutex.Close();
        }
    }
8
ответ дан 6 December 2019 в 07:28
поделиться

В.NET VB существует булево свойство IsSingleInstance, которое делает задание для Вас.

В VB (взятый отсюда):

Public Class Program
        Inherits Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase

       Public Sub New()
            Me.IsSingleInstance = True
        End Sub



End Class

Вот то, как Вы используете его в C# (взятый отсюда):

// SingleInstanceApplication.cs
class SingleInstanceApplication : WindowsFormsApplicationBase {

 // Must call base constructor to ensure correct initial 
 // WindowsFormsApplicationBase configuration
 public SingleInstanceApplication() {

  // This ensures the underlying single-SDI framework is employed, 
  // and OnStartupNextInstance is fired
  this.IsSingleInstance = true;
 }
}


// Program.cs
static class Program {
 [STAThread]
 static void Main(string[] args) {
  Application.EnableVisualStyles();
  SingleInstanceApplication application = 
   new SingleInstanceApplication();
  application.Run(args);
 }
}

Удостоверьтесь, что сослались на Microsoft.VisualBasic.dll в своем проекте.

6
ответ дан 6 December 2019 в 07:28
поделиться

Откройте свои Свойства проекта (Вкладка Приложения) и проверьте Делание единственного параметра приложения экземпляра.

От вкладки Application можно также нажать кнопку View Application Events, для создания класса ApplicationEvents.vb, где можно обработать второе событие экземпляра:

Partial Friend Class MyApplication
    Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
        ' Bring First Instance to Foreground
        e.BringToForeground = True
        ' Pass Second Instance Command Line to First Instance
        AppShared.DoSomethingWithCommandLine(e.CommandLine)
    End Sub
End Class
3
ответ дан 6 December 2019 в 07:28
поделиться

В VB.NET единственное приложение экземпляра является просто флажком на странице Свойства проекта. Можно также захватить Мой. Приложение. Событие StartupNextInstance, чтобы иметь Ваш единственный экземпляр делает что-то, когда другая копия запускается. Это может использоваться, например, для MDI как поведение открытия требуемого документа в исходном экземпляре.

Негласно, это инкапсулирует хороший бит взаимного исключения, и липкая вещь IPC - видят WindowsFormApplicationBase - и может использоваться от C# также.

2
ответ дан 6 December 2019 в 07:28
поделиться

У Scott Hanselman есть хорошая статья об этом. Код находится в C#, но я предполагаю, что будет легко портировать его на VB.

http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx

Вот еще одна статья о теме в случае, если это не удовлетворит Ваши потребности:

http://www.codeproject.com/KB/cs/cssingprocess.aspx

2
ответ дан 6 December 2019 в 07:28
поделиться

Использовать Mutex. Эффективно, a Mutex может быть назван со строкой и уникален через CLR.

Пример кода:

try
{
mutex = Mutex.OpenExisting(mutexName);
//since it hasn’t thrown an exception, then we already have one copy of the app open.
MessageBox.Show(”A copy of Todo 3.0 is already open. Please check your system tray (notification area).”,
“Todo 3.0″, MessageBoxButtons.OK, MessageBoxIcon.Information);
Environment.Exit(0);
}
catch (Exception Ex)
{
//since we didn’t find a mutex with that name, create one
Debug.WriteLine(”Exception thrown:” + Ex.Message + ” Creating a new mutex…”);
mutex = new Mutex(true, mutexName);
}

Из этого сообщения:

1
ответ дан 6 December 2019 в 07:28
поделиться

Если Ваше приложение находится в VB.NET 2.0-3.5, самый легкий способ поддерживать единственный экземпляр в рабочем состоянии программы при помощи 'Свойств Платформы Приложения Windows'. Для получения там щелкните правой кнопкой по названию проекта и перейдите к 'Свойствам'. Однажды там, установите флажок 'Make single instance appliation'.

Можно также использовать ApplicationEvents.vb, чтобы показать пользователю, что они запустили программу во второй раз. Можно создать/просмотреть это легко в том же окне свойств путем нажимания кнопки 'View Application Events'. В там, можно выбрать MyApplication_StartupNextInstance sub и войти в код там, как это:

Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
    MessageBox.Show("This program is already running.  If you do not see the program running, please check your " _
        & "Windows Task Manager for this program name in the 'Processes' Tab." & vbNewLine & vbNewLine & "WARNING: " _
        & " If you terminate the process, you will terminate the only instance of this program!", My.Application.Info.ProductName.ToString _
        & " is Running!", MessageBoxButtons.OK, MessageBoxIcon.Warning)

End Sub

Сообщите мне, помогает ли это! JFV

1
ответ дан 6 December 2019 в 07:28
поделиться

Присвойте Вашему приложению некоторый уникальный идентификатор, такой как hardcoded гуид и создайте Взаимоисключающий экземпляр, где Вы присваиваете взаимное исключение это тот идентификатор. Если это выдает исключение затем, если средства, которые уже выполняет Ваше приложение (поскольку этому успешно удалось создать взаимное исключение),

0
ответ дан 6 December 2019 в 07:28
поделиться

Я думал, что будет легче иметь образец прямо здесь вместо ссылки.

    [STAThread]
    static void Main()
    {
        if (!IsAppAlreadyRunning())
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1()); /* Change Form1 for your main Form */
        }
        else
        {
            MessageBox.Show("Application is already running!");
        }
    }

    public static bool IsAppAlreadyRunning()
    {
        Process currentProcess = Process.GetCurrentProcess();
        return (IsAppAlreadyRunning(currentProcess.Id, 
                                    currentProcess.ProcessName));
    }

    private static bool IsAppAlreadyRunning(int ID, string Name)
    {
        bool isAlreadyRunning = false;
        Process[] processes = Process.GetProcesses();
        foreach (Process process in processes)
        {
            if (ID != process.Id)
            {
                if (Name == process.ProcessName)
                {
                    isAlreadyRunning = true;
                    break;
                }
            }
        }
        return isAlreadyRunning;
    }
0
ответ дан 6 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: