Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92

Создание и обработка события Process Exited

07.12.2015, 19:43. Показов 2114. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем хай
в форме имеется код
C++
1
2
Process^ myProcess = gcnew Process();
myProcess->Exited  += gcnew System::EventHandler(this, &Form1::myProcess_Exited);
и потом ниже
C++
1
2
3
4
private: System::Void myProcess_Exited(System::Object^  sender, System::EventArgs^  e)
{
      Show();
}
Однако форма не появляется обратно, что здесь не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2015, 19:43
Ответы с готовыми решениями:

Обработка события Process.Exited
Здравствуйте. Имеется код: // файл создадим в "Моих Документах" String file =...

MPI win32, process exited without calling finalize
// Lab11.cpp: определяет точку входа для консольного приложения. #include <iostream> #include <stdio.h> #include...

Вылетает и пишет Process exited after 4.107 seconds with return value 3221225477
Вылетает и пишет Process exited after 4.107 seconds with return value 3221225477 , подскажите, в чем проблема? #include <stdlib.h> ...

9
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
08.12.2015, 00:19
Fenix78563, во-первых, событие Exited предназначено для мониторинга других процессов. Во-вторых, если твоя цель на позволить закрыть форму, то используй событие FormClosing. В него передается FormClosingEventArgs в котором можно установить свойсто Cancel для отмены закрытия.
1
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
08.12.2015, 17:58  [ТС]
OwenGlendower, у меня в форме запускается игра, и когда она закрывается я хочу чтобы у меня выполнялся определенный код, походу дела я прячу форму на время работы игры но вот код походу в событие выхода заходит неверно, вот я и спрашиваю как надо правильно сделать

Добавлено через 12 секунд
ибо на msdn все как у меня в коде
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
08.12.2015, 20:20
Fenix78563, я тебе уже ответил - код который должен сработать при закрытии формы следует разместить в событии FormClosing. Или в FormClosed, если нет необходимости отменять закрытие.

Цитата Сообщение от Fenix78563 Посмотреть сообщение
ибо на msdn все как у меня в коде
Где именно? На странице о событии Exited другой пример.
1
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
09.12.2015, 18:16  [ТС]
OwenGlendower, там для обработки нет примера на с++ есть с#
C#
1
 private void myProcess_Exited(object sender, System.EventArgs e)
если перевести это в c++ то получается это
C++
1
private: System::Void myProcess_Exited(System::Object^  sender, System::EventArgs^  e)
может я не правильно создаю событие в этом коде?
C++
1
myProcess->Exited  += gcnew System::EventHandler(this, &Form1::myProcess_Exited);
Добавлено через 2 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
я тебе уже ответил - код который должен сработать при закрытии формы следует разместить в событии FormClosing
и у меня закрывается не форма а программа из экзешника, поэтому событие FormClosing сюда не подходит
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
10.12.2015, 02:44
Fenix78563, Ок. Я тебя неправильно понял.

Сигнатура обработчика и подписка на событие сделаны правильно. Были бы ошибки - компилятор бы сообщил. Свойству EnableRaisingEvents ты присвоил true? Если да, то показывай весь код. Хотя в части связанной с запуской нового процесса и отслеживания выхода.
1
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
10.12.2015, 18:09  [ТС]
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
private: System::Void button_play_Click(System::Object^  sender, System::EventArgs^  e)
{
    button_play->Enabled = false;
    client->DownloadProgressChanged += gcnew DownloadProgressChangedEventHandler(this, &Form1::DownloadProgressCallback );
    client->DownloadFileCompleted += gcnew AsyncCompletedEventHandler(this, &Form1::Downl_compl);
    Process^ myProcess = gcnew Process();
    myProcess->EnableRaisingEvents=true;
    myProcess->Exited  += gcnew System::EventHandler(this, &Form1::myProcess_Exited);
    if(ver1 != name)
    {
        if (!File::Exists (dwg+"\\Downloads\\"+fileName))
        {
            try
            {
                Uri^ adr = Uri1;
                client->DownloadFileAsync(adr, fileName);
                label1->Text = L"Идет загрузка";
            }
            catch (WebException^ e)
            {
                try
                {
                    Uri^ adr2 = Uri2;
                    client->DownloadFileAsync(adr2, fileName);
                }
                catch (WebException^ e)
                {
                    label1->Text = L"Необходима установка";
                    MessageBox::Show(
                        "Не удалось загрузить файл\nПроверьте подключение к сети или попробуйте позднее.",
                        "Ошибка!",
                        MessageBoxButtons::OK,
                        MessageBoxIcon::Error);
                }
            }
        }
        else
        {
            progressBar1->Value = 0;
            label1->Text = L"Загружено!";
            this->progressBar1->Style = System::Windows::Forms::ProgressBarStyle::Marquee;
            label1->Text = L"Обработка";
            progressBar1->Value = 10;
            if (Directory::Exists(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()))
            {
                Directory::Delete(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString(),true);
            }
            Directory::CreateDirectory(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString());
            ZipFile::ExtractToDirectory(dwg+"\\Downloads\\"+fileName, dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString());
            this->progressBar1->Style = System::Windows::Forms::ProgressBarStyle::Blocks;
            label1->Text = L"Игра готова к запуску";
            progressBar1->Value = 0;
            File::WriteAllText(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()+"\\settings.txt", fileName);
            Process^ myProcess = gcnew Process();
            myProcess->Start(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()+"\\McnCraft.exe");
            button_play->Enabled =true;
        }
    }
    else
    {
        myProcess->Start(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()+"\\McnCraft.exe"); /*Hide();*/ button_play->Enabled =true;
    }
}
потом ниже
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
private: System::Void  Downl_compl(Object^ sender, AsyncCompletedEventArgs^ e)
{
    progressBar1->Value = 0;
    label1->Text = L"Загружено!";
    this->progressBar1->Style = System::Windows::Forms::ProgressBarStyle::Marquee;
    label1->Text = L"Обработка";
    progressBar1->Value = 10;
    File::Copy(fileName, dwg+"\\Downloads\\"+fileName);
    File::Delete(fileName);
    if (Directory::Exists(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()))
    {
        Directory::Delete(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString(),true);
    }
    Directory::CreateDirectory(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString());
    ZipFile::ExtractToDirectory(dwg+"\\Downloads\\"+fileName, dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString());
    this->progressBar1->Style = System::Windows::Forms::ProgressBarStyle::Blocks;
    label1->Text = L"Игра готова к запуску";
    progressBar1->Value = 0;
    File::WriteAllText(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()+"\\settings.txt", fileName);
    Process^ myProcess = gcnew Process();
    myProcess->EnableRaisingEvents=true;
    myProcess->Start(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()+"\\McnCraft.exe");
    button_play->Enabled =true;             
    myProcess->Exited  += gcnew System::EventHandler(this, &Form1::myProcess_Exited); 
}
и само событие
C++
1
2
3
4
5
6
7
8
9
10
11
12
private: System::Void myProcess_Exited(System::Object^  sender, System::EventArgs^  e)
{
    String^ fileName2 = "mcnl.txt";
    StreamReader^ din = File::OpenText(fileName2);
    System::String^ dwg;
    dwg = din->ReadLine();
    din->Close();
    System::String^ s1 = "\U005C";
    System::String^ s2 = s1+s1;
    dwg->Replace(s1,s2);dwg=dwg->Replace("L","");
    Show();
}
весь код не кидаю ибо там около 10 тысяч строк

Добавлено через 5 минут
блин пока понял что за дичь 4 раза отредактировал, дабы выглядело по божески пришлось 3 обратных слеша ставить а то он один стирает

Добавлено через 12 минут
Ему может не нравиться что я генерирую один и тот-же процесс и событие в разных ветках?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
10.12.2015, 18:52
Лучший ответ Сообщение было отмечено Fenix78563 как решение

Решение

Fenix78563, в коде несколько ошибок.

Первое и главное. Ты вызываешь static метод Start который сам создает экземпляр Process и в котором нет подписки на событие Exited. То есть вместо строк вида myProcess->Start("...") нужно делать так:
C++
1
2
myProcess->StartInfo->FileName = "...";
myProcess->Start();
Второе. Внутри button_play_Click ты перезаписываешь значение myProcess, когда нужно использовать уже готовое значение. Смотри строку №51.

Третье. Переменную myProcess стоит сделать полем класса чтобы сборщик мусора не собрал его.

В итоге код должен быть примерно таким:
Кликните здесь для просмотра всего текста
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
private: Process^ myProcess;
 
private: System::Void button_play_Click(System::Object^  sender, System::EventArgs^  e) 
{
    button_play->Enabled = false;
    client->DownloadProgressChanged += gcnew DownloadProgressChangedEventHandler(this, &Form1::DownloadProgressCallback );
    client->DownloadFileCompleted += gcnew AsyncCompletedEventHandler(this, &Form1::Downl_compl);
    
    myProcess = gcnew Process();
    myProcess->EnableRaisingEvents=true;
    myProcess->Exited  += gcnew System::EventHandler(this, &Form1::myProcess_Exited);
    myProcess->StartInfo->FileName = dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()+"\\McnCraft.exe";
    
    if(ver1 != name)
    {
        if (!File::Exists (dwg+"\\Downloads\\"+fileName))
        {
            try 
            {
                Uri^ adr = Uri1;
                client->DownloadFileAsync(adr, fileName);
                label1->Text = L"Идет загрузка";
            }   
            catch (WebException^ e)
            {
                try 
                {
                    Uri^ adr2 = Uri2;
                    client->DownloadFileAsync(adr2, fileName);
                }
                catch (WebException^ e)
                {
                    label1->Text = L"Необходима установка";
                    MessageBox::Show(
                        "Не удалось загрузить файл\nПроверьте подключение к сети или попробуйте позднее.",
                        "Ошибка!",
                        MessageBoxButtons::OK,
                        MessageBoxIcon::Error);
                }
            }
        }
        else 
        {
            progressBar1->Value = 0;
            label1->Text = L"Загружено!"; 
            this->progressBar1->Style = System::Windows::Forms::ProgressBarStyle::Marquee;
            label1->Text = L"Обработка";
            progressBar1->Value = 10;
            if (Directory::Exists(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()))
            {
                Directory::Delete(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString(),true);
            }
            Directory::CreateDirectory(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString());
            ZipFile::ExtractToDirectory(dwg+"\\Downloads\\"+fileName, dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString());
            this->progressBar1->Style = System::Windows::Forms::ProgressBarStyle::Blocks;
            label1->Text = L"Игра готова к запуску";
            progressBar1->Value = 0;
            File::WriteAllText(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()+"\\settings.txt", fileName);
            myProcess->Start();
            button_play->Enabled =true;
        }
    }
    else
    {
        myProcess->Start();
        /*Hide();*/
        button_play->Enabled =true;
    }
}
 
private: System::Void  Downl_compl(Object^ sender, AsyncCompletedEventArgs^ e)
{
    progressBar1->Value = 0;
    label1->Text = L"Загружено!";
    this->progressBar1->Style = System::Windows::Forms::ProgressBarStyle::Marquee;
    label1->Text = L"Обработка";
    progressBar1->Value = 10;
    File::Copy(fileName, dwg+"\\Downloads\\"+fileName);
    File::Delete(fileName);
    if (Directory::Exists(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()))
    {
        Directory::Delete(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString(),true);
    }
    Directory::CreateDirectory(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString());
    ZipFile::ExtractToDirectory(dwg+"\\Downloads\\"+fileName, dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString());
    this->progressBar1->Style = System::Windows::Forms::ProgressBarStyle::Blocks;
    label1->Text = L"Игра готова к запуску";
    progressBar1->Value = 0;
    File::WriteAllText(dwg+"\\Profiles\\"+this->comboBox1->SelectedItem->ToString()+"\\settings.txt", fileName);
    button_play->Enabled =true;             
    myProcess->Start();
}


Не по теме:

Коду требуется рефакторинг. Сейчас это мешанина действий с повторениями.

1
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
12.12.2015, 13:15  [ТС]
Огромное спасибо код работает и заходит в событие Process exited
Однако когда в этом событии я вызываю метод "Show()"
Получаю это
Первый этап обработки исключения типа "System.InvalidOperationException" в приложении System.Windows.Forms.dll
Необработанное исключение типа "System.InvalidOperationException" произошло в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Form1' не из того потока, в котором он был создан.
вот Код:
C++
1
2
3
4
private: System::Void myProcess_Exited(System::Object^  sender, System::EventArgs^  e)
{
Show();
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
12.12.2015, 20:54
Лучший ответ Сообщение было отмечено Fenix78563 как решение

Решение

Fenix78563, значит обработчик события Exited выполняется не в UI потоке и придется делать так:
C++
1
2
3
4
5
6
7
8
9
private: System::Void myProcess_Exited(System::Object^  sender, System::EventArgs^  e)
{
    Invoke(gcnew Action(this, &Form1::ProcessExited));
}
 
System::Void ProcessExited()
{
    Show();
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2015, 20:54
Помогаю со студенческими работами здесь

2 GB ОЗУ и Parent: child process exited with status 3221225477 -- Restarting
Доброго времени суток. Проблема над которой бьюсь уже 2 недели. Есть зацикленный php скрипт который выполняет некоторые действия, за...

Обработка события Click, вставка html после генерации и обработка этого кода
Подскажите пожалуйста как заставить работать эту часть кода 18 строка $(".image").click(function() { ...

Ошибка The thread 0x390 has exited with code 0 (0x0). The program 'D:AlexVVCPr1DebugPr1.exe' has exited with code 0 (0x0).
Loaded 'D:WINNTSystem32 tdll.dll', no matching symbolic information found. Loaded 'D:WINNTsystem32kernel32.dll', no matching symbolic...

Создание объекта-события и обработчика события
Допустим у меня есть следующий класс: public class Example { private boolean bool; public boolean isBool() { return bool;...

[SQL Server]Transaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock viсtim.
1С 7.7, сервер win2003, 4 клиентские машины с ХР - на одной из них все время вылетает ошибка: SQL State: 40001 Native: 1205 ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru