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

Отслеживание конца работы процесса-внука

28.04.2017, 12:56. Показов 1712. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, ув. форумчане! Пишу программу в которой запускается дочерний процесс. После своего запуска этот процесс запускает свой дочерний процесс(процесс-внук для моей главной программы), а сам закрывается. Мне нужно получить доступ к этому процессу-внуку и отследить его завершение. Возможно ли это реализовать на С#? Если да, то как?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.04.2017, 12:56
Ответы с готовыми решениями:

Отслеживание процесса
Всем привет! Помогите, пожалуйста! Задача такая: после запуска программы, она сначала смотрит на список процессов, и если известный процесс...

Отслеживание процесса (delphi 7)
Доброго времени суток. У меня возникла небольшая проблема. Запускаю со своей программы другую (это не важно, но ANSYS) в batch mode и...

Отслеживание начатого процесса
Я запускаю через своё приложение внешнее. По закрытии которого нужно выполнить код. if (thisProcess.HasExited) { //my code } ...

2
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18292 / 14216 / 5368
Регистрация: 17.03.2014
Сообщений: 28,893
Записей в блоге: 1
28.04.2017, 15:50
Лучший ответ Сообщение было отмечено Destrox_SSD как решение

Решение

Destrox_SSD, возможно тебе поможет этот код
StartProcessAndWaitForAllChildrenToExit
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
static class ProcessHelper
{
    public static void StartProcessAndWaitForAllChildrenToExit(string fileName, string arguments = null)
    {
        IntPtr hJob = NativeMethods.CreateJobObject(IntPtr.Zero, null);
        IntPtr hPort = IntPtr.Zero;
        if (hJob != IntPtr.Zero)
        {
            // Создаем процесс в suspended состоянии
            STARTUPINFO startupInfo = STARTUPINFO.New();
            PROCESS_INFORMATION processInformation;
            if (NativeMethods.CreateProcess(
                fileName, """ + fileName + "" " + arguments,
                IntPtr.Zero, IntPtr.Zero,
                false,
                ProcessCreationFlags.CreateSuspended | ProcessCreationFlags.CreateNewConsole,
                IntPtr.Zero,
                null,
                ref startupInfo,
                out processInformation
                ))
            {
                // Связываем процесс с job объектом
                NativeMethods.AssignProcessToJobObject(hJob, processInformation.hProcess);
 
                // Создаем I/O completion port и связываем его с job объектом
                hPort = NativeMethods.CreateIoCompletionPort(NativeMethods.InvalidHandleValue, IntPtr.Zero, IntPtr.Zero, 0);
                var jobPortAssoc = new JOBOBJECT_ASSOCIATE_COMPLETION_PORT();
                jobPortAssoc.CompletionPort = hPort;
                jobPortAssoc.CompletionKey = Marshal.AllocHGlobal(10);
                bool infoSet = NativeMethods.SetInformationJobObject(
                    hJob,
                    JOBOBJECTINFOCLASS.AssociateCompletionPortInformation,
                    ref jobPortAssoc,
                    (uint)Marshal.SizeOf<JOBOBJECT_ASSOCIATE_COMPLETION_PORT>()
                );
 
                // Запускаем процесс
                NativeMethods.ResumeThread(processInformation.hThread);
 
                // Ждем сообщения JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO
                // Оно говорит что процесс и все его дочерние процессы завершились
                uint completionCode;
                const int JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO = 4;
                UIntPtr completionKey;
                IntPtr overlapped;
                const uint INFINITE = UInt32.MaxValue;
                while (NativeMethods.GetQueuedCompletionStatus(hPort, out completionCode, out completionKey, out overlapped, INFINITE) && completionCode != JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO)
                {
                }
 
                Marshal.FreeHGlobal(jobPortAssoc.CompletionKey);
                NativeMethods.CloseHandle(processInformation.hThread);
                NativeMethods.CloseHandle(processInformation.hProcess);
            }
            NativeMethods.CloseHandle(hJob);
            if (hPort != IntPtr.Zero) NativeMethods.CloseHandle(hPort);
        }
    }
 
    static class NativeMethods
    {
        public static readonly IntPtr InvalidHandleValue = new IntPtr(-1);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
        public static extern IntPtr CreateJobObject(IntPtr jobAttributes, string name);
 
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "CreateProcessW")]
        public static extern bool CreateProcess(
            [MarshalAs(UnmanagedType.LPWStr)] string lpApplicationName,
            [MarshalAs(UnmanagedType.LPWStr)] string lpCommandLine,
            IntPtr lpProcessAttributes,
            IntPtr lpThreadAttributes,
            bool bInheritHandles,
            //uint dwCreationFlags,
            ProcessCreationFlags creationFlags,
            IntPtr lpEnvironment,
            [MarshalAs(UnmanagedType.LPWStr)] string lpCurrentDirectory,
            [In] ref STARTUPINFO lpStartupInfo,
            out PROCESS_INFORMATION lpProcessInformation);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool CloseHandle(IntPtr hObject);
 
        [DllImport("kernel32.dll")]
        public static extern uint ResumeThread(IntPtr hThread);
 
        [DllImport("kernel32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool AssignProcessToJobObject(IntPtr hJob, IntPtr hProcess);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern IntPtr CreateIoCompletionPort(IntPtr fileHandle, IntPtr existingCompletionPort,
            IntPtr completionKey, uint numberOfConcurrentThreads);
 
        [DllImport("kernel32.dll")]
        public static extern bool SetInformationJobObject(IntPtr hJob,
            JOBOBJECTINFOCLASS jobObjectInfoClass, ref JOBOBJECT_ASSOCIATE_COMPLETION_PORT lpJobObjectInfo,
            uint cbJobObjectInfoLength);
 
        [DllImport("kernel32.dll")]
        public static extern bool GetQueuedCompletionStatus(IntPtr completionPort, out uint lpNumberOfBytes,
            out UIntPtr lpCompletionKey, out IntPtr lpOverlapped, uint dwMilliseconds);
    }
 
 
    [StructLayout(LayoutKind.Sequential)]
    struct JOBOBJECT_ASSOCIATE_COMPLETION_PORT
    {
        public IntPtr CompletionKey;
        public IntPtr CompletionPort;
    }
 
    enum JOBOBJECTINFOCLASS
    {
        AssociateCompletionPortInformation = 7,
        BasicLimitInformation = 2,
        BasicUIRestrictions = 4,
        EndOfJobTimeInformation = 6,
        ExtendedLimitInformation = 9,
        SecurityLimitInformation = 5,
        GroupInformation = 11
    }
 
    [Flags]
    enum ProcessCreationFlags
    {
        CreateSuspended = 0x00000004,
        DetachedProcess = 0x00000008,
        CreateNewConsole = 0x00000010
    }
 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    struct STARTUPINFO
    {
        public Int32 cb;
        public IntPtr lpReserved;
        public string lpDesktop;
        public string lpTitle;
        public Int32 dwX;
        public Int32 dwY;
        public Int32 dwXSize;
        public Int32 dwYSize;
        public Int32 dwXCountChars;
        public Int32 dwYCountChars;
        public Int32 dwFillAttribute;
        public Int32 dwFlags;
        public Int16 wShowWindow;
        public Int16 cbReserved2;
        public IntPtr lpReserved2;
        public IntPtr hStdInput;
        public IntPtr hStdOutput;
        public IntPtr hStdError;
 
        public static STARTUPINFO New()
        {
            STARTUPINFO startupInfo = new STARTUPINFO();
            startupInfo.cb = Marshal.SizeOf<STARTUPINFO>();
            startupInfo.lpReserved = IntPtr.Zero;
            startupInfo.cbReserved2 = 0;
            startupInfo.lpReserved2 = IntPtr.Zero;
            return startupInfo;
        }
    }
 
    [StructLayout(LayoutKind.Sequential)]
    struct PROCESS_INFORMATION
    {
        public IntPtr hProcess;
        public IntPtr hThread;
        public int dwProcessId;
        public int dwThreadId;
    }
 
    //[StructLayout(LayoutKind.Sequential)]
    //public struct SECURITY_ATTRIBUTES
    //{
    //  public int Length;
    //  public IntPtr SecurityDescriptor;
    //  public int InheritHandle;
    //}
}

Использование
C#
1
ProcessHelper.StartProcessAndWaitForAllChildrenToExit("parent.exe");
Метод запустит parent.exe и не вернет управления пока он и все его дочерние процессы, и дочерние процессы дочерних процессов не завершат работу.
1
0 / 0 / 0
Регистрация: 28.04.2017
Сообщений: 3
29.04.2017, 15:41  [ТС]
Спасибо большое! Помогло!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2017, 15:41
Помогаю со студенческими работами здесь

Отслеживание завершения процесса
Здравствуйте форумчане! Запускаю например процесс калькулятор вот код Dim WithEvents Pr As Process Private Sub...

Отслеживание завершения процесса
процесс который будет запускать программу если ее нет в диспетчере если есть то будет проверять пока не закроют как закроется так через...

Отслеживание завершения процесса
Подскажите как реализовать задачу ? 1. Отследить завершение процесса (по имени процесса), и по завершении начать выполнять программу. ...

Завершение процесса, отслеживание
Доброго времени суток форумчане, задался вопросом, например у меня программа запускает процесс n, а после отслеживает его завершение, но...

Отслеживание состояния запущенного процесса
Здравствуйте. запускаю кнопкой выполнение программы: protected void Button3_Click(object sender, EventArgs e) { ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru