|
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) Не надо ничего захватывать. Просто создается именованный объект. Как файл. Просто в отличие от файла если приложение закроется, то закроется и описатель объекта. Файл в таком случае остается на диске, а именованный объект удалается из диспетчера объектов, т.к. это был единственный описатель.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |