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

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

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

Способов куча:
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
Форумчанин
14 / 14 / 1
Регистрация: 20.03.2012
Сообщений: 291
Узнать о закрытии внешней программы

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

Укажи параметр P_NOWAIT вместо P_WAIT. Кто справку-то читать будет?
04.12.2012, 21:35   #5
Ddv122
Почемучка)
1217 / 277 / 10
Регистрация: 23.12.2010
Сообщений: 1,880
Записей в блоге: 1
Узнать о закрытии внешней программы

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

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

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

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

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

Вообще-то с потоком оно и попроще будет, как на мой вкус...
Вот рабочий пример:
Код 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
Форумчанин
14 / 14 / 1
Регистрация: 20.03.2012
Сообщений: 291
Узнать о закрытии внешней программы / 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
C++ Builder Доступ к компонентам внешней программы
Всем привет, мне надо обратиться к внешней программе(это я умею) и добраться в нем к компоненту Edit1, записать в него нужный текст заранее спасибо
C++ Builder KARARIN 27.02.2013 23:58
C++ Builder Как мне сделать так, чтобы данный текстовый файл был открыт один раз при запуске программы и закрыт при закрытии программы?
Привет! Возник следующий вопрос. Программа состоит из основного окна Form1 и нескольких Unit. По таймеру в Form1 запускается один из Unit'ов, в которых производятся некие вычисления и выводят данные на графики. В данном Unit'е происходит открытие текстового файла и производится либо чтение либо...
C++ Builder OmutMoren 13.09.2012 14:12
C++ Builder Перехватить событие из внешней программы
Подскажите где можно подробно почитать про события (по русски). Суть вопроса нужно перехватить событие (не знаю какое) чтобы подменить текст и вернуть во внешнюю программу, если это конечно возможно. программирую на С С классами и объектами никак не разберусь. Пользуюсь Builder 6. ...
C++ Builder vladimir_sv 07.02.2012 17:45
VBA Запуск внешней программы программы из коммнадной строки
Здравствуйте, есть программа D:\user\start.exe Как средствами excel vba вызвать командную строку и запустить программу из коммандной строки? Как запустить с параметрами start.exe -param1 Можно ли прописать относительно открытого екселевского документа путь к программе?
VBA redwert 30.10.2011 15:13
Опции темы

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

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