Имя: Пароль:
IT
 
C#, Блокировка повторного запуска программы.
0 megabax
 
23.06.13
15:12
С целью блокировать повторный запуска программы сделал вот так:
           string name = "OptionProtector";
           Process[] pr2 = Process.GetProcesses();
           for (int i = 0; i < pr2.Length; i++)
           {
               if (pr2[i].ProcessName  == name || pr2[i].ProcessName == name+".exe")
               {
                   return;
               }
           }
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
           Application.Run(new frmRobotArb());
Оказалость, теперь прога вообще не запускается. В принципе, понятно почему: прога натыкается на саму себя (когда идет проверка, сам то экзешник уже запущен), думает что она уже запущена и не запускается. Посоветуй плз, какой можно из данного положения найти выход.
1 IamAlexy
 
23.06.13
15:15
ну это же очевидно -исправь ошибку и все заработает как надо
2 МихаилМ
 
23.06.13
15:15
(0)
проверять кол-во процессов
3 sda553
 
23.06.13
15:16
(0) посчитать сколько процессов, если всего один, то ок, если два и более - не запускаться
4 megabax
 
23.06.13
15:18
(3) о точно, спасибо!
5 megabax
 
23.06.13
15:24
сделал вот так, теперь заработало:
           string name = "OptionProtector";
           Process[] pr = Process.GetProcesses();
           int count = 0;
           for (int i = 0; i < pr.Length; i++)
           {
               if (pr[i].ProcessName  == name || pr[i].ProcessName == name+".exe")
               {
                   count++;
               }
           }
           if (count > 1) return;
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
           Application.Run(new frmRobotArb());
6 viraboy
 
23.06.13
15:28
Использовать мьютекс не предлагать?
7 H A D G E H O G s
 
23.06.13
15:29
8 megabax
 
23.06.13
15:29
(6) что такое мьютекс?
9 H A D G E H O G s
 
23.06.13
15:31
10 oleg_km
 
23.06.13
15:54
А сравнить с текущим процессом разве нельзя:

       string name = "OptionProtector";
          Process[] pr2 = Process.GetProcesses();
          for (int i = 0; i < pr2.Length; i++)
          {
              if ((pr2[i].ProcessName  == name || pr2[i].ProcessName == name+".exe") && pr2[i].Id <> Process.GetCurrentProcess().Id)
              {
                  return;
              }
          }
          Application.EnableVisualStyles();
11 megabax
 
23.06.13
15:55
(10) кстати, тоже вариант
12 HeroShima
 
23.06.13
16:54
В винде обычно мютексом.
13 HeroShima
 
23.06.13
16:56
Можно лок-файлом.
14 megabax
 
23.06.13
17:14
(13) лок файл не прокатит. Что, если прога завершиться аварийно?
15 Funeral_Worm
 
23.06.13
17:31
(0) Использовать шаблон Singleton.
16 Бертыш
 
23.06.13
17:36
(14) А если его блокировать на операции с ним. Прога отвалится аварийно и блокировка с ней.
17 megabax
 
23.06.13
17:53
(16) как вариант да но мен кажется способ в (5) или в (10) проще
18 HeroShima
 
23.06.13
18:49
Имена процессов не отличаются уникальностью.
19 Dorosh
 
24.06.13
09:15
Вариант с перебором процессов очень тормозной. Нормально использовать мьютекс.
20 Xapac
 
24.06.13
09:40
(15)слова выучил красивые, а ума не прибавилось...
21 Xapac
 
24.06.13
09:41
(19)мьютекс? пишите как.
22 ЧеловекДуши
 
24.06.13
09:44
(0) Некошеная блокировка :)
23 ЧеловекДуши
 
24.06.13
09:46
(16) Тоже отстойное решение :)
24 oleg_km
 
24.06.13
09:50
(21) А что там писать? Сначала проверяешь, можно ли открыть объект с специальным твоим именем, если можно, значит он уже созда, значит твоя прога уже запущена, значить нужно отвалиться, выдать сообщение  и т.п. Если объект не открывается, значит его можно создать и запустить приложение. В данной ситуации абсолютно не важно, что это будет мутекс, можно и событие и семафор. Главное чтобы это был именованный объект ядра, который прибивается, когда на него кончаются ссылки
25 Xapac
 
24.06.13
09:52
(24)ах вот они каике, я джумал виндовыфе мьютекся попроще, а они почти что спутниками управляют...
26 HeroShima
 
24.06.13
09:53
когда-то в msdn для win 95 майкрософт дала пример с мьютексом, оттуда и пошло
27 Xapac
 
24.06.13
09:58
http://www.firststeps.ru/mfc/winapi/r.php?118

При запуске программы она создает объект с именем "FirstStep", если захватить его удается WaitForSingleObject(), то программа выполняется якобы, ждет пока Вы введете число и нажмете Enter. Если захватить его не удается, то выходит с надписью fail. Если Вы попробуете, то Вы сможете запустить только одну копию.
28 oleg_km
 
24.06.13
10:08
(27) Не надо ничего захватывать. Просто создается именованный объект. Как файл. Просто в отличие от файла если приложение закроется, то закроется и описатель объекта. Файл в таком случае остается на диске, а именованный объект удалается из диспетчера объектов, т.к. это был единственный описатель.
2 + 2 = 3.9999999999999999999999999999999...