Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 11
1
.NET 4.x

Как перезапустить процесс в taskmgr?

08.09.2018, 18:50. Показов 2165. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Появилась необходимость при запуске программы проверить работает ли в винде процесс, и если работает, то закрыть его и заново запустить, а если не работает, то просто запустить его.
Пока смутно представляю как это сделать, если просто прописать запуск процесса то можно словить Exception что процесс уже работает, а если прописать process.stop(); то можно поймать процесс не найден, смутно себе представляю обернуть всё в try/catch и задать условие через if. Может кто помочь советом как реализовать поставленную задачу?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2018, 18:50
Ответы с готовыми решениями:

Как можно перезапустить любой процесс при его закрытии
Как можно перезапустить процесс, если его закрыли, завершили? Например, на vbs я могу это сделать...

Как програмно остановить(перезапустить) процесс в диспетчере задач
Меня, в частности интересует процесс wdm.exe (диспетчер рабочего стола) в windows Vista. Помогите...

Процесс taskmgr.exe грузит процессор на 100 %
этот вот файл taskmgr.exe или программа не знаю что это, занимает процессор на 100 %, он находится...

Завершить процесс и перезапустить службу
Всем привет.Подскажите как написать правильно батник который сначала убивает процесс nusb3mon.exe...

8
Заблокирован
08.09.2018, 20:57 2
Проверить работает ли процесс(не заглючил ли часом...) методами C# - думаю, не реально.

Цитата Сообщение от TedKachinsky Посмотреть сообщение
Появилась необходимость при запуске программы проверить работает ли в винде процесс, и если работает, то закрыть его и заново запустить, а если не работает, то просто запустить его.
Та что там?
http://pinvoke.net/
, а именнно
GetWindow и GetWindowByName -если что гуглите в этом направлении.
Отловить его и прибить, потом Process.Start();

Мютесы нельзя этому процессу делать? (чтоб знать запущен ли он?)
0
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 11
08.09.2018, 22:09  [ТС] 3
Всё на много проще(
Есть кассовый аппарат который подключен к компу, стартует он с exe'шника SparkSrv.exe а этот exe'шник запускает еще один exe'шник WSOFD.exe, вот как раз таки второй exe'шник не успевает нормально запуститься и приходится его убивать и заново стартовать, в противном случае он висит в процессах и не отправляет ОФД отчетность в налоговую, и память накопителя в кассовом аппарате переполняется. Программа написана не мной и исходников у меня к ней нет, пишу заплатку для неё, чтобы в дальнейшем было меньше заявок в траблтикет по поводу висит кассовый аппарат там, и там, и там.

Вот пока что накидал возможный вариант
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
namespace TestTasks
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public bool FindAndKillProcess(string name)
        {
            try
            {
                foreach (Process clsProcess in Process.GetProcesses())
                {
                    if (clsProcess.ProcessName.StartsWith(name))
                    {
                        clsProcess.Kill();
 
                        clsProcess.WaitForExit();
                       
                        if (clsProcess.HasExited)
                            return true;
                        else
                            return false;
                    }
                }
                return false;
            }
            catch (Exception)
            {
                return false;
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Process Test = new Process();
            Test.StartInfo.FileName = @"D:\calc.exe";
            Test.Start();
        }
    }
}
И пока это не работает, тестирую на калькуляторе, в состоянии не запущен и наоборот.

Добавлено через 9 минут
Цитата Сообщение от Моя говорить Посмотреть сообщение
Мютесы нельзя этому процессу делать? (чтоб знать запущен ли он?)
Можно, даже нужно.
0
Заблокирован
08.09.2018, 22:41 4
Цитата Сообщение от TedKachinsky Посмотреть сообщение
Мютесы нельзя этому процессу делать? (чтоб знать запущен ли он?)
Можно, даже нужно.
Вы неправильно поняли, мютекс(объект ядра Виндовс создает сама программа, как правило это применяется для недопущения повторных запусков одной и той же программы)

Цитата Сообщение от TedKachinsky Посмотреть сообщение
стартует он с exe'шника SparkSrv.exe а этот exe'шник запускает еще один exe'шник WSOFD.exe, вот как раз таки второй exe'шник не успевает нормально запуститься и приходится его убивать и заново стартовать,
Попробуйте сделать через cmd|bat - и не нужно на Шарпе будет кодить. В батнике пропишите старт первой проги, потом Delay, потом убийство второй проги и перезапуск второй проги.(Если нужно, есть утилитка bat2exe в свободном распространении в инете - из батника сделать экзэшник).
0
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 11
08.09.2018, 22:47  [ТС] 5
Всё же лучше в Шарпе реализовать, защитившись от нетерпимых рук желающих закрыть окно консоли до его выполнения.
P.S: батник есть, толку ноль, операторы всё равно тыкают на него.
0
Заблокирован
08.09.2018, 23:10 6
Цитата Сообщение от TedKachinsky Посмотреть сообщение
P.S: батник есть, толку ноль, операторы всё равно тыкают на него.
Та да, оператор - самый тормознутый элемент компъютера - я это уже понял и давно.
(Вот недавно было, в прошлую пятницу(то есть вчера): звонит юзер коллеге, коллега спрашивает имя его компьютера(чтоб удаленно подключится) - тот называет свое имя-отчество(и так несколько раз), в итоге коллега пошел к нему чтоб по-месту сделать).
Вспоминается анекдот про стаю волков у которых у главаря во лбу дырка.

Цитата Сообщение от TedKachinsky Посмотреть сообщение
Всё же лучше в Шарпе реализовать, защитившись от нетерпимых рук желающих закрыть окно консоли до его выполнения.
Тогда только через WIN.API.
Как я уже говорил http://pinvoke.net/ в помощь.
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
09.09.2018, 15:34 7
Лучший ответ Сообщение было отмечено TedKachinsky как решение

Решение

TedKachinsky, попробуй такую реализацию
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public bool KillProcess(string processName)
{
    var processes = Process.GetProcessesByName(processName);
    if (processes.Length > 0)
    {
        foreach (Process proc in processes)
        {
            try
            {
                for (int i = 0; i < 5; i++)
                {
                    proc.Kill();
                    proc.WaitForExit(TimeSpan.FromSeconds(2));
                    if (proc.HasExited) break;
                }
            }
            catch
            {
            }
        }
        
        processes = Process.GetProcessesByName(processName);
    }
    
    return processes.Length == 0;
}
 
private void Form1_Load(object sender, EventArgs e)
{
    if (KillProcess("WSOFD"))
    {
        Process.Start("WSOFD.exe");
    }
}
1
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 11
09.09.2018, 15:51  [ТС] 8
Спасибо, только пришлось параметр TimeSpan.FromSeconds(2) убрать, иначе ругается на тип данных, просит конвертировать в int32, в целом всё работает, если экзешник снова будет вешаться, то тогда конвертирую в int а после укажу нужный таймаут, хотя на msdn пишут, что при запуске WaitForExit система дожидается полного завершения процесса и только после стартует.
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
09.09.2018, 15:55 9
TedKachinsky, убрать таймаут плохая идея. Я его специально поставил чтобы не было риска подвисания проверки если завершаемый процесс не завершиться. Замени TimeSpan.FromSeconds(2) на 2000.
1
09.09.2018, 15:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2018, 15:55
Помогаю со студенческими работами здесь

Как перезапустить цикл for?
У меня есть код Python, где я прокручиваю каждую строку в файловом объекте с типичным синтаксисом...

Как перезапустить проект?
Как програмно перезапустить проект и чтобы перезапустилась она на нужную форму?

Как перезапустить программу?
Нужно чтобы по окончанию игры и выборе &quot;сыграть ещё раз&quot; игра перезапускалась снова в этом же окне...

Как перезапустить скрипт?
Нужно, чтобы при выполнении некоторого условия текущий скрипт выполнялся бы сначала. И второй...

Как перезапустить программу
мне нужно чтобы программа запускалась заново или все переменные очистились (во всей программе) и...

Как перезапустить форму?
Всем привет.Вопрос следующий: у меня есть форма и мне надо ,чтоб пользователь по нажатию на кнопку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru