Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > Форум Форум программистов > Форум C++ > Форум C++ Builder
Восстановить пароль Регистрация

Ответ Создать новую тему
 
03.12.2012, 15:06   #1
znseday
Форумчанин
Регистрация: 20.03.2012
Сообщений: 287
Репутация: 13 (13)
Лучшие ответы: 1
Узнать о закрытии внешней программы / C++ Builder

Я запускаю внешнюю программу при помощи ShellExecute. Как узнать, что внешняя программа закрывается? Можно ли вообще перехватывать любые события, происходящие в другой программе (если так же это моя программа)? Данными обмениваться необязательно. Очень нет времени изучать OLE или DDE. Нужно просто, чтобы первая программа узнала о завершении второй.
03.12.2012, 15:06
AdAgent
Объявления
03.12.2012, 15:38   #2
mimicria
return (true);
Регистрация: 19.04.2011
Сообщений: 2,033
Репутация: 1834 (968)
Лучшие ответы: 40
Узнать о закрытии внешней программы

Способов куча:
1. Искать окно FindWindow
2. Использовать WaitForSingleObject
3. Использовать GetProcessTimes (конкретно lpExitTime)
Я когда была необходимость запустить стороннюю программу и дождаться её завершения, не предпринимая никаких действий в процессе работы, использовал вместо ShellExecute() spawnlp() с параметром P_WAIT
Другие темы раздела
Деление на ноль C++ Builder
Внезапно. int a = 0; int b = 0; int c = (float)a/(float)b; // no exception int a = 0; int b = 0; int c = a/b; // exception
C++ Builder Перевод на C++
Помогите перевести на C++ uses crt,graphABC; const nmax=25; t=0.001;{точность сравнения вещественных чисел} {площадь треугольника по координаьам вершин} function Plos(x1,y1,x2,y2,x3,y3:real):real; begin Plos:=abs((x1-x2)*(y3-y2)-(y1-y2)*(x3-x2))/2;
04.12.2012, 14:09  [ТС]   #3
znseday
Форумчанин
Регистрация: 20.03.2012
Сообщений: 287
Репутация: 13 (13)
Лучшие ответы: 1
Узнать о закрытии внешней программы

Цитата Сообщение от mimicria Посмотреть сообщение
Я когда была необходимость запустить стороннюю программу и дождаться её завершения, не предпринимая никаких действий в процессе работы, использовал вместо ShellExecute() spawnlp() с параметром P_WAIT
А как не блокировать работу первой программы?
WaitForSingleObject - все равно блокирует насколько я понял. А FindWindow нужно вызывать самому (или опрашивать таймером, что не вариант).
04.12.2012, 17:24   #4
BRcr
Модератор
Регистрация: 03.02.2011
Сообщений: 3,801
Репутация: 2887 (1576)
Записей в блоге: 6
Лучшие ответы: 88
Узнать о закрытии внешней программы

Укажи параметр P_NOWAIT вместо P_WAIT. Кто справку-то читать будет?
04.12.2012, 17:24
AdAgent
Объявления
04.12.2012, 21:35   #5
Ddv122
Почемучка)
Регистрация: 23.12.2010
Сообщений: 1,860
Репутация: 1213 (273)
Записей в блоге: 1
Лучшие ответы: 10
Узнать о закрытии внешней программы

Извините, не сюда написал)
Но Спасибо за spawnlp()
07.12.2012, 14:00  [ТС]   #6
znseday
Форумчанин
Регистрация: 20.03.2012
Сообщений: 287
Репутация: 13 (13)
Лучшие ответы: 1
Узнать о закрытии внешней программы

Цитата Сообщение от BRcr Посмотреть сообщение
Укажи параметр P_NOWAIT вместо P_WAIT
А как узнать о завершении программы то?)
07.12.2012, 14:49   #7
BRcr
Модератор
Регистрация: 03.02.2011
Сообщений: 3,801
Репутация: 2887 (1576)
Записей в блоге: 6
Лучшие ответы: 88
Узнать о закрытии внешней программы

Если подвешивать свою программу нельзя, тогда только опрашивать таймером или вынести ожидание в поток, других вариантов не ведаю.
При этом ты до сих пор не сообщил, почему это вдруг таймер не вариант...
07.12.2012, 16:08  [ТС]   #8
znseday
Форумчанин
Регистрация: 20.03.2012
Сообщений: 287
Репутация: 13 (13)
Лучшие ответы: 1
Узнать о закрытии внешней программы

Цитата Сообщение от BRcr Посмотреть сообщение
почему это вдруг таймер не вариант...
Включать таймер в программе А и проверять в нем FindWindow пробграммы B? Какой интервал задавать, чтобы не грузить систему? Не будет ли такого, что окна B уже не существует, но еще не выполнены операции деструктора B? Где гарантии, что пока программа B ищется на жестком диске и загружается в оперативную память сработает таймер в программе A? Все это наводит на мысли о ненадежности и нестабильности на разных компьютерах.
У Вас есть опыт, как это организовывается при помощи таймера, чтобы все было окей?

Добавлено через 1 минуту
О многопоточности думал. Но хотелось бы простой способ какой-нибудь.
08.12.2012, 12:17   #9
BRcr
Модератор
Регистрация: 03.02.2011
Сообщений: 3,801
Репутация: 2887 (1576)
Записей в блоге: 6
Лучшие ответы: 88
Узнать о закрытии внешней программы

Вообще-то с потоком оно и попроще будет, как на мой вкус...
Вот рабочий пример:
Код 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
class TForm1
               : public TForm
{
__published: // IDE-managed Components
    TEdit *edit1;
    TButton *btn1;
    TLabel *lbl1;
    TLabel *lbl2;
    TButton *btn2;
    void __fastcall btn2Click( TObject *Sender );
private: // User declarations
public:  // User declarations
    __fastcall TForm1( TComponent *Owner );
};
// ---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
// ---------------------------------------------------------------------------
class process_await_thread
               : public TThread {
private:
 
protected:
 
public:
    HANDLE process;
    void __fastcall Execute( ) {
        WaitForSingleObject( process, INFINITE );
        Synchronize( &action );
    }
    void __fastcall action( ) {
        Form1->lbl2->Caption = "процесс завершен";
    }
    __fastcall process_await_thread( bool _suspended )
                   : TThread( _suspended ) {};
};
// ---------------------------------------------------------------------------
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TForm1::btn2Click( TObject *Sender ) { // запуск программы
    SHELLEXECUTEINFO ei;
    String filename = "notepad.exe";
 
    SecureZeroMemory( &ei, sizeof( SHELLEXECUTEINFO ) );
    ei.cbSize = sizeof( SHELLEXECUTEINFO );
    ei.fMask |= SEE_MASK_NOCLOSEPROCESS;
    ei.lpFile = ( LPCTSTR )filename.c_str( );
    ei.nShow |= SW_SHOWDEFAULT;
 
    if ( ShellExecuteEx( &ei ) ) {
        lbl2->Caption = "процесс запущен";
        process_await_thread *thr = new process_await_thread( true );
        thr->FreeOnTerminate = true;
        thr->process = ei.hProcess;
        thr->Resume( );
    }
}
Экзешник:
Вложения
Тип файла: rar Project1.rar (468.1 Кб, 13 просмотров)
14.12.2012, 21:25  [ТС]   #10
znseday
Форумчанин
Регистрация: 20.03.2012
Сообщений: 287
Репутация: 13 (13)
Лучшие ответы: 1
Узнать о закрытии внешней программы / C++ Builder

Почему возникает предупреждение?
[BCC32 Warning] W8111 Accessing deprecated entity '_fastcall TThread::Resume()'
14.12.2012, 21:25
Yandex
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
Delphi Запуск внешней программы в форме программы
Всем привет :) может Вы меня и не поймете, но не пинайте, я только учусь :) Делаю я оболочку для CarPc. И главная затея, сделать или сотворить одну классную вещь, а вещь заключается в том, что можно будет запускать другие внешние программы в форме программы сделанной в делфи. Допустим я...
Delphi для начинающих Civic 23.02.2014 17:33
Pascal ABC вызов внешней программы
Как осуществить переход к внешней программе?
Pascal ABC Ksenia S 30.11.2013 16:59
VBA Запуск внешней программы программы из коммнадной строки
Здравствуйте, есть программа D:\user\start.exe Как средствами excel vba вызвать командную строку и запустить программу из коммандной строки? Как запустить с параметрами start.exe -param1 Можно ли прописать относительно открытого екселевского документа путь к программе?
VBA redwert 30.10.2011 15:13
C# Запуск внешней программы из кода программы
Имеется программа А using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.IO; namespace ThreaddingToFile { class MyThread {
C# для начинающих Koran 29.01.2011 22:15
PHP Запуск внешней программы
Очень прошу помощи. С php толком никогда дела не имел. Задача следующая: Нужно, чтобы при нажатии на ссылку запускалась внешняя программа и выводила результат своей работы в браузер.
PHP для начинающих P-VS-S 25.05.2010 15:56
Опции темы

Текущее время: 05:17. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.