Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запуск только одной копии приложения, Суть внутри... 
:(
    Опции темы
CasperSC
Дата 17.7.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Здравствуйте! Написал программу, использую Mutex для ограничения одновременно запущенных копий программы. Но вот когда я выбераю тип построения Release, то этот Mutex перестаёт работать. Вообще я понял так, на это влияет опция "Оптимизировать код". Дело в том, что отключить эту опцию не вариант, после любого обфускатора этот Mutex также не работает. Вообще не знаю что делать.

Код

    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main(string[] arguments)
        {
            //Включаем визуальные стили раньше, чем будет проверка, чтобы MessageBox выглядел современно
            Application.EnableVisualStyles(); 
            Application.SetCompatibleTextRenderingDefault(false);

            const String AppName = "My Program"; //Просто название приложения
            bool oneOnly;
            bool NeedHide = false;
            if (arguments.Length != 0)
            {
                if (arguments[0] == "-hide")
                {
                    NeedHide = true;
                }
            }

            // Указываем имя своей программы. В нашем случае My Program
            Mutex m = new Mutex(true, AppName + "7696579547995", out oneOnly);
            if (oneOnly)
            {
                Application.Run(new MainForm(NeedHide));
            }
            else
            {
                MessageBox.Show("Приложение " + AppName + " уже запущено.");
            } 
        
        }
    }


Может есть вариант какой нибудь другой ограничивающий кол-во запущенных приложений?

Это сообщение отредактировал(а) CasperSC - 17.7.2010, 18:06
PM MAIL   Вверх
mihryak
Дата 17.7.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



сделай мюьтекс полем класса, в релизе он идёт в мусор и там освобождается, т.к. никто ссылку на него не хранит

Добавлено через 1 минуту и 36 секунд
или, что правильней, наверное, после Application.Run(new MainForm(NeedHide)); вызови его освобождение
PM MAIL ICQ   Вверх
CasperSC
Дата 18.7.2010, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Добавил освобождение Mutex'a, теперь всё нормально работает и обфускатор тоже ничего не портит, как портил раньше.. Спасибо!
Код

            // Указываем имя своей программы. В нашем случае My Program
            Mutex m = new Mutex(true, AppName + "7696579547995", out oneOnly);
            if (oneOnly)
            {
                Application.Run(new MainForm(NeedHide));
                m.ReleaseMutex();
            }
            else
            {
                MessageBox.Show("Приложение " + AppName + " уже запущено.");
            } 


Это сообщение отредактировал(а) CasperSC - 18.7.2010, 01:07
PM MAIL   Вверх
Mephisto
Дата 26.7.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Так будет лучше
Код

// Указываем имя своей программы. В нашем случае My Program
            Mutex m = new Mutex(true, AppName + "7696579547995", out oneOnly);
            if (oneOnly)
            {
                try
                {
                    Application.Run(new MainForm(NeedHide));
                }
                finally
                {
                    m.ReleaseMutex();
                }
            }
            else
            {
                MessageBox.Show("Приложение " + AppName + " уже запущено.");
            } 

хотя, вот подумал. Может в майкрософте уже сделали нечто похожее у себя внутри, хотя не факт. Я бы перестраховался.
PM   Вверх
nmn
Дата 26.7.2010, 22:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: 1
Всего: 1



можно в роли имени мьютекса использовать guid, тогда имя будет точно уникальным
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.