Я хочу сделать это, так как хочу, чтобы в какой-то момент был открыт только 1 экземпляр.
20.01.2009 02:07
Чтобы выровнять элемент по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов.
Это коммюнике первоначально появилось на Symfony Station .
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим.
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете.
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше.
Перейти к ответу Данный вопрос помечен как решенный
Ответы 12
Обычное решение — создать именованный, общесистемныймьютекс.
Что делать если пишет, что приложение уже запущено, а оно нихуя не запущено?
- Если вам удастся его создать, вы — единственное работающее приложение.
- Если нет, значит, есть другой.
Обновлено:
Я не предоставил код, так как не знаю Delphi. Я могу предоставить код C#, если это будет полезно.
20.01.2009 02:11
Вы создаете системамьютекс.
У меня нет кода Delphi, но вот код C++:
HANDLE Mutex; const char MutexName[] = «MyUniqueProgramName»; Mutex = OpenMutex(MUTEX_ALL_ACCESS, false, MutexName); if (Mutex) throw Exception(«Program is already running.»); else Mutex = CreateMutex(NULL, true, MutexName);
Комментарии (3)
У вас там состояние гонки. Всегда вызывайте CreateMutex, а не OpenMutex. Затем используйте GetLastError, чтобы узнать, кто выиграл гонку.
этот ответ следует удалить.
20.01.2009 02:15
Всемогущий JVCL имеет компонент для этой цели. См. «TJvAppInstances».
20.01.2009 02:18
Как впервые предложил Джон, вы можете попробовать создать мьютекс. Позвоните CreateMutex . Если вы получите обратно ненулевой дескриптор, вызовите GetLastError . Он скажет вам, были ли вы тем, кто создал мьютекс, или он уже был открыт ранее ( Error_Already_Exists ). Обратите внимание, что нет необходимо, чтобы получить право владения мьютексом. Мьютекс не используется для взаимного исключения. Он используется, потому что это именованный объект ядра. Событие или семафор тоже могут работать.
Техника мьютекса дает вам логический ответ: да, есть другой экземпляр, или нет, его нет.
Вы часто хотите знать больше, чем просто это. Например, вы можете захотеть узнать дескриптор главного окна другого экземпляра, чтобы вы могли сказать ему, чтобы он перешел на передний план вместо вашего другого экземпляра. Вот где может пригодиться файл с отображением в память; он может содержать информацию о первом экземпляре, чтобы последующие экземпляры могли ссылаться на него.
Будьте осторожны при выборе имени мьютекса. Внимательно прочтите документацию и помните, что некоторые символы (например, обратная косая черта) не разрешены в некоторых версиях ОС, но необходимы для определенных функций в других версиях ОС.
Также помните о проблеме других пользователей. Если ваша программа может быть запущена через удаленный рабочий стол или быстрое переключение пользователей, тогда могут быть другие пользователи, уже запускающие вашу программу, и вы, возможно, действительно не захотите ограничивать текущего пользователя от запуска вашей программы. В этом случае не используйте глобальное имя. Если вы делать хотите ограничить доступ для всех пользователей, убедитесь, что атрибуты безопасности объекта мьютекса таковы, что каждый сможет открыть его дескриптор. Для этого недостаточно использовать нулевой указатель для параметра lpSecurityAttributes ; «дескриптор безопасности по умолчанию», упоминаемый в MSDN, дает полный доступ текущему пользователю и не дает доступа другим.
Вам разрешено редактировать файл DPR вашей программы. Обычно это хорошее место для таких вещей. Если вы дождетесь события OnCreate одной из ваших форм, тогда ваша программа уже имеет некоторый импульс к нормальной работе, поэтому пытаться завершить ее в этот момент будет неуклюже. Лучше завершить работу, пока не было выполнено слишком много работы с пользовательским интерфейсом. Например:
var mutex: THandle; mutexName: string; begin mutexName := ConstructMutexName(); mutex := CreateMutex(nil, False, PChar(mutexName)); if mutex = 0 then RaiseLastOSError; // Couldn’t open handle at all. if GetLastError = Error_Already_Exists then begin // We are not the first instance. SendDataToPreviousInstance(. ); exit; end; // We are the first instance. // Do NOT close the mutex handle here. It must // remain open for the duration of your program, // or else later instances won’t be able to // detect this instance. Application.Initialize; Application.CreateForm(. ); Application.Run; end.
Возникает вопрос, когда закрыть дескриптор мьютекса. Вам не нужно его закрывать. Когда ваш процесс, наконец, завершится (даже если он выйдет из строя), ОС автоматически закроет все невыполненные дескрипторы, а когда больше не будет открытых дескрипторов, объект мьютекса будет уничтожен (что позволит другому экземпляру вашей программы запуститься и считать, что он быть первым).
Но вы все равно можете захотеть закрыть ручку. Предположим, вы решили реализовать функцию SendDataToPreviousInstance , о которой я упоминал в коде. Если вы хотите пофантазировать, вы можете учесть случай, когда предыдущий экземпляр уже отключается и не может принимать новые данные. Тогда вам совсем не захочется закрывать второй экземпляр.
Первый экземпляр может закрыть дескриптор мьютекса, как только он узнает, что он закрывается, по сути становясь экземпляром «хромой утки». Второй экземпляр попытается создать дескриптор мьютекса, будет успешным и будет считать себя настоящим первым экземпляром. Предыдущий экземпляр закроется без прерывания. Используйте CloseHandle , чтобы закрыть мьютекс; вызовите его, например, из обработчика событий OnClose вашей основной формы или из любого другого места, где вы вызываете Application.Terminate .
Вам нужно закрыть дескриптор мьютекса при выходе из приложения?
Нет, поскольку мьютекс, как и все другие ресурсы ОС, освобождается / освобождается / что угодно, когда процесс-владение завершается. Это также большой плюс этого решения по сравнению с временными файлами, которые могут все еще существовать после сбоя приложения.
Настоятельно рекомендуется добавить «Global \» к имени мьютекса, чтобы мьютекс имел глобальную область видимости. Если вы входите в систему как другой сеанс или запускаете приложение как сервис, мьютексы, которые не являются глобальными, могут быть созданы в отдельных неконфликтующих пространствах имен.
Эйнштейн, да, глобальный мьютекс — это хорошо, если Артур этого хочет. Однако, основываясь на одном из его предыдущих вопросов, я не думаю, что это так. И, насколько я помню, до Win2k не допускалось использование обратных косых черт в имени, поэтому вы также не можете обязательно использовать одно и то же имя все время.
Сэм, ОС сделает это за вас. Но вы можете захотеть закрыть его раньше. Если текущий экземпляр закрывается, он не сможет принимать сообщения от другого экземпляра. В этот момент для «нового» экземпляра может быть лучше взять на себя роль «экземпляра» и просто оставить первый экземпляр «умереть».
Роб, я просто перечитал ваш ответ, и ИМХО вам следует пояснить, что «может быть запущено на сервере терминалов». Многие разработчики, вероятно, отклонят это как неважное для них, хотя на самом деле быстрого переключения пользователей было бы достаточно, чтобы вызвать проблему.
извините за то, что я новичок, но какие единицы используются в этом примере, кроме «окон»?
Он использует Windows и Forms, а также любые блоки, содержащие код ты write для предоставления ConstructMutexName и SendDataToPreviousInstance. Если вы хотите, чтобы кто-то написал их для вас, задавайте новые вопросы: «Как мне создать имя мьютекса?» и «Как мне отправить данные в другой экземпляр моей программы?»
20.01.2009 02:20
Я бы сказал, что вы можете использовать несколько различных стратегий. Но самый простой из них (не зависящий от платформы) — это тот, который вы сами предложили, а именно: в начале программы проверить, есть ли файл блокировки, созданный в заданном определенном месте. Если этот файл блокировки существует, значит, другой экземпляр уже запущен, если он не существует, то другой экземпляр не запущен. Когда ваша программа закрывается, вы удаляете файл блокировки.
Однако при использовании этой стратегии у вас возникает другая проблема: что произойдет, если ваша программа выйдет из строя? Файл блокировки по-прежнему остается, и этот конкретный случай требует обработки.
Другая стратегия — это общесистемное решение мьютекса, при котором вы регистрируете свое присутствие в операционной системе (или также вероятно, что это делается автоматически). Когда второй экземпляр затем пытается запуститься, он проверяет, активен ли уже процесс с определенным идентификатором. Если он уже существует, второй процесс решает не запускаться и, при необходимости, переводит окно первого процесса в фокус (если рассматриваемый процесс владеет окном, которое есть).
Однако эта стратегия зависит от платформы, и реализация будет отличаться от платформы к платформе.
Источник: reddeveloper.ru
Как сделать так, чтобы одна копия программы работала, другая не могла открыться?
Как сделать так, чтобы одна копия программы работала, другая не могла открыться?
Или еще лучше, как сделать так, чтобы если одна копия уже запущена, то попытка запустить другую копию будет действовать так, как если бы вы максимизировали исходный процесс?
Посмотри на этот вопрос, товарищ: Другой вопрос — Spence
Это не совсем дубликат, поскольку другой вопрос касается WPF и C #, а не WinForms или консоли. И я пишу приложение WinForms. — Alex Baranosky
5 ответы
+1 за использование класса WindowsFormsApplicationBase. Хотя, если это консольное приложение, вам нужно будет использовать мьютексы. Вот хороший пример: ai.uga.edu/mc/SingleInstance.html — Дарин Димитров
объясняет, как создать правда единственный экземпляр:
В этой статье просто объясняется, как создать приложение Windows с контролем количества его экземпляров или запустить только один экземпляр. Это очень типичная потребность бизнес-приложения. Уже существует множество других возможных решений, позволяющих контролировать это.
например, Проверка списка процессов с именем нашего приложения. Но эти методы не кажутся хорошим подходом, поскольку все решается только на основе имени приложения, которое может быть или не быть уникальным во всем.
using System; using Microsoft.VisualBasic.ApplicationServices; namespace Owf < public class SingleInstanceController : WindowsFormsApplicationBase < public SingleInstanceController() < // Set whether the application is single instance this.IsSingleInstance = true; this.StartupNextInstance += new StartupNextInstanceEventHandler(this_StartupNextInstance); >void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e) < // Here you get the control when any other instance is // invoked apart from the first one. // You have args here in e.CommandLine. // You custom code which should be run on other instances >protected override void OnCreateMainForm() < // Instantiate your main application form this.MainForm = new Form1(); >> >
Измените основную функцию следующим образом:
[STAThread] static void Main()
Источник: stackovergo.com
another instance is running что делать
Сегодня расскажем как исправить ошибку при запуске игры Euro Truck Simulator 2 «Another instance is already running». Инструкция так же подойдёт для других игрушек с площадки Стим и других клиентов. В начале кратко расскажем о возможных причинах такой ошибки, а ниже дадим рекомендации как исправить проблему.
Another instance is already running error
Причины ошибки
Кому интересен перевод ошибки? Окно с предупреждение сообщает: «Ошибка запуска. Копия приложения уже запущена». Причин тут несколько:
- Вы уже запустили игру двойным кликом или из лаунчера, а потом запустили игру второй раз. Таким образом в системе появилось два процесса.
- В системе завис процесс игры ETS 2 или «TruckersMP лаунчера».
- Если у вас слабый ПК нажмите ОК и ждите запуска либо перезапускаем компьютер. Если ошибка повторяется — читаем дальше.
Если дело в зависшем процессе — откройте Диспетчер задач (Ctrl+alt+Del) или клик ПКМ на панели задач — «Диспетчер задач». Находим процесс TruckersMP, нажимаем правой и выбираем «Завершить процесс» или «закрыть задачу» в зависимости от версии операционной системы.
Запускаем Диспетчер задач
Как исправить Another instance is already running
Поскольку ошибку вызывает зависший процесс — самый простой способ перезагрузка ПК. После перезагрузки сначала запускаем Steam, а потом пробуем запустить лаунчер игры, саму игру.
Если процесс зависают каждый раз тут лучше перестраховаться и поступить как советуют на форумах и переустановить лаунчер.
- Нажимаем клавишу Виндовс + R на клавиатуре. Или Пуск — Выполнить.
- Набираем в строке «%programdata%» и жмем Enter(набираем без кавычек).
- Находим и удаляем папку «TruckersMP».
- Далее открываем папку C:Program Files и удаляем оттуда лаунчер «TruckersMP Launcher».
- Идем на сайт truckersmp.com загружаем его и переустанавливаем.
- Запускаем лаунчер с правами Администратора и нажимаем «Установить доступные обновления».
- Перезапускаем компьютер и пробуем запустить игру.
Так же игроки пигут, что помогает загрузка и установка Microsoft Directx 9, скачать можно по этой ссылке с официального сайта Майрософт: Microsoft DirectX® 9.0c. Русский язык присутствует.
Заключение
Надеюсь вы разобрались как исправить оршибку при запуске ETS 2 «Another instance is already running error». Похожим образом можно исправить ошибки при запуске игр из Стима. Первым делом проверяем и завершаем процесс игры или лаунчера. Потом обновляем их, перезагружаем ПК и пробуем запустить. Напишите в комментариях какой из способов помог вам.
Если у вас схожие ошибки- пишите в комментарии к этой странице и мы поможем найти решение.
Иногда при запуске какой либо игры можно получить ошибку «Another instance of game already running». Часто, для устранение данной ошибки пользователи прибегают к проверенному традиционному способу, а именно, перезагрузке ПК. Однако ошибка устраняется весьма просто.
Данное сообщение говорит о том, что другой экземпляр игры уже запущен. Это происходит, когда после предыдущего закрытия игры, ее процесс остается.
Стоит зайти в Диспетчер задач (Ctrl+ Alt+ Delet) и в списке процессов найти процесс игры и завершить его. Теперь можно вновь запускать игру и ошибка не возникнет.
Здраствуйте, пытался обновить драйвера и после распоковки выдает ошибку:
Another instance is running.
Такого процесса в диспетчере задач не нашел.
Источник: computermaker.info