Форум программистов, компьютерный форум CyberForum.ru

Запустить программу из другой программы в качестве нового процесса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Klendathu
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
10.12.2011, 18:40     Запустить программу из другой программы в качестве нового процесса #1
Нужно запустить программу из другой программы:
Первая программа, которую нужно запустить:
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
#include <iostream>
using namespace std;
int n, cnt;
bool ok = false;
 
int main(){
cout<<"Enter the number:";
cin>>n;
while(n>=2){
  if (n%2!=0)
    ok = true;
  n = n/2;
  cnt++;
} 
 
if (ok == true)
  cout<<"NO";  
else
  cout<<cnt;
 
 
  return 0;
 
}
Вторая программа, которая должна запустить экзешник первой:
C++
1
2
3
4
5
6
7
8
9
#include <windows.h>
void WinMain ()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
if(!CreateProcess("Programma_1.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)){    
}
}
При компиляции второй, выдается непонятная ошибка. Помогите разобратся) Обе программы в одной папке

Добавлено через 1 час 31 минуту
Еще вопрос:
Как сделать так, чтобы в одной программе запустить функцию как новый поток? Например, я принял число N, и потом запускаю вычисление того, является ли оно степенью двойки в новом потоке?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
10.12.2011, 18:49     Запустить программу из другой программы в качестве нового процесса #2
какая ошибка то
Klendathu
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
10.12.2011, 18:55  [ТС]     Запустить программу из другой программы в качестве нового процесса #3
Вот такая:
Миниатюры
Запустить программу из другой программы в качестве нового процесса  
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
10.12.2011, 18:57     Запустить программу из другой программы в качестве нового процесса #4
дак у вас void WinMain()

если консольное приложение то надо main(), если конечно вы создавали именно консольный проект
Klendathu
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
10.12.2011, 19:07  [ТС]     Запустить программу из другой программы в качестве нового процесса #5
Спасибо, теперь работает. Но, когда запускаю Programma2, он запускает Programma1 и программа застревает на
C++
1
cout<<"Enter the number:";
То есть, выходит это и все, дальше не идет.
Вот переделанный Programma2:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <windows.h>
 
int main (){
STARTUPINFO si;
 
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
if(!CreateProcess("Programma_1.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)){    
}
 
  return 0;
 
}
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
10.12.2011, 19:12     Запустить программу из другой программы в качестве нового процесса #6
даже число нельзя ввести?
Klendathu
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
10.12.2011, 19:19  [ТС]     Запустить программу из другой программы в качестве нового процесса #7
Да, не вводится. Зависает, после сообщения ввести число

Добавлено через 2 минуты
А нет, вводится, но какая-то фигня получается - буквы друг на друга лезут и вводятся в коммандной строке, и результата нет
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
10.12.2011, 19:22     Запустить программу из другой программы в качестве нового процесса #8
советую сделать открытие проги консольным методом для соответствия

system("Programma_1.exe");

Вместо CreateProc
Klendathu
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
10.12.2011, 19:50  [ТС]     Запустить программу из другой программы в качестве нового процесса #9
Спасибо! Получилось)
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <windows.h>
 
int main (){
STARTUPINFO si;
 
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
system("Programma_1.exe");    
 
  return 0;
 
}
Добавлено через 21 минуту
А как теперь сделать так, чтобы в одной программе спросить "Enter the number", а затем создать новый поток в этой же программе, передать туда число, и вычислить является ли степенью двойки это число?
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
10.12.2011, 20:02     Запустить программу из другой программы в качестве нового процесса #10
я бы сделал так;


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
char res=2; результат(1 если является степенью двойки. 0 если нет)
CRITICAL_SECTION cs;//создаем критическую секцию чтобы не повредить переменную res
 
char StepenDvoiki(long chislo)
{
// проверяем число
//возвращаем 1 если степень двойки 0 если нет
 
return ...;
}
 
 
unsigned long _stdcall _thread_StepenDvoiki(void* chislo)  
{
 
EnterCriticalSection(&cs); //Входим в критическую секцию
  res=StepenDvoiki(*(long*)chislo);
LeaveCriticalSection(&cs); //Выход из нее
 
} 
 
 
void main()
{
//вводим число long chislo;
 
//запускаем поток.
 
CreateThread(0,0,_thread_StepenDvoiki,&chislo,0,0);
 
while(1) //ждем пока отработает наш поток
{
Sleep(0);// отдаем процессору время
 
EnterCriticalSection(&cs); //Входим в критическую секцию
 
//тут проверяем если res!=2 то результат получен (при инциализации res=2)
 
if(res!=2) break;
 
LeaveCriticalSection(&cs); //Выход из нее
}
 
 
 
//выводим результат
 
}
Klendathu
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
11.12.2011, 19:21  [ТС]     Запустить программу из другой программы в качестве нового процесса #11
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
#include <iostream>
#include <windows.h>
using namespace std;
int cnt; 
long chislo;
char res=2; //результат(1 если является степенью двойки. 0 если нет)
CRITICAL_SECTION cs;//создаем критическую секцию чтобы не повредить переменную res
 
char PowerOfN(long n){
  bool ok = false;
  while(n>=2){
    if (n%2!=0)
      ok = true;
    n = n/2;
    cnt++;
  } 
  
  if (ok == true)
    return 0;  
  else
    return 1;
 
// проверяем число
//возвращаем 1 если степень двойки 0 если нет
}
 
 
unsigned long _stdcall _thread_PowerOfN(void* n)  {
  EnterCriticalSection(&cs); //Входим в критическую секцию
    res=PowerOfN(*(long*)n);
  LeaveCriticalSection(&cs); //Выход из нее
 
} 
 
 
int main(){
//вводим число long chislo;
cout<<"Enter the number"<<endl;
cin>>chislo; 
//запускаем поток.
 
CreateThread(0,0,_thread_PowerOfN,&chislo,0,0);
 
while(1) //ждем пока отработает наш поток
{
Sleep(0);// отдаем процессору время
 
EnterCriticalSection(&cs); //Входим в критическую секцию
 
//тут проверяем если res!=2 то результат получен (при инциализации res=2)
 
if(res!=2) break;
 
LeaveCriticalSection(&cs); //Выход из нее
}
 
 
if (res=='1')
  cout<<cnt;
else
  cout<<"NO";
     
//выводим результат
  return 0;
 
}
Написал как понял. Компилируется, но выкидывает потом из программы, когда число ввожу

Добавлено через 20 часов 4 минуты
Что, никто не может помочь?

Добавлено через 2 часа 52 минуты
Укажите хотя бы в каком месте ошибку искать!!!
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
11.12.2011, 20:59     Запустить программу из другой программы в качестве нового процесса #12
забыл еще дописать вам в тот раз
критическую секцию надо сначала инициализировать было в начале main()
C++
1
2
3
4
5
6
int main(){
 
InitializeCriticalSection(&cs);
 
....
}
Klendathu
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
11.12.2011, 21:09  [ТС]     Запустить программу из другой программы в качестве нового процесса #13
Спасибо большое! Сам вот тоже рылся в сети и пытался инициализацию сделать.
А теперь финальный штрих: например, сделать 2 потока одинаковых(вычисление явления степени двойки) и для каждого потока дать разные приоритеты, например, максимальный и минимальный и поставить таймер. Запустить по-очереди и в конце выдать результат времени работы каждого потока?? Чтобы я окончательно разобрался с потоками
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
11.12.2011, 21:11     Запустить программу из другой программы в качестве нового процесса #14
на счет приоритетов ничего не могу сказать, никогда не сталкивался, тут надо специалистов)

а таймер то можно брать функцией GetTickCount();
берем его до выполнения функции и после, и вычитаем результаты

тут правда думаю все очень быстро пойдет, надо хотя бы по миллиону раз вычислять функцию в цикле
Bers
Заблокирован
11.12.2011, 21:18     Запустить программу из другой программы в качестве нового процесса #15
А.П. Побегайло - "Системное программирование в Windows"
Избавит от множества вопросов
Klendathu
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
12.12.2011, 07:30  [ТС]     Запустить программу из другой программы в качестве нового процесса #16
Вопросы все-таки есть:
1. SetThreadPriority () - как ей правильно пользоватся и куда вписывать? После создания потока или до?
2. Откопал функцию вычисления времени затраченной потоком на работу, но не понял как ею пользоватся:
C++
1
2
3
4
5
6
7
8
9
10
BOOL GetThreadTimes (
   HANDLE Thread,
   PFILETIME Created, 
      // Время с 01.01.1601 в сотнях нс до создания потока
   PFILETIME Exited, 
      // Время с 01.01.1601 в сотнях нс до завершения потока
   PFILETIME Kernel, 
      // Время в сотнях нс, затраченное потоком на код ОС
   PFILETIME User);  
      // Время в сотнях нс, затраченное потоком на код программы
Добавлено через 8 часов 26 минут
С потоками разобрался, а время засечь не могу.
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
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
int cnt; 
long chislo;
char res='2'; 
CRITICAL_SECTION cs;
 
char PowerOfN(long n){
  bool ok = false;
  while(n>=2){
    if (n%2!=0)
      ok = true;
    n = n/2;
    cnt++;
  } 
  
  if (ok == true)
    return '0';  
  else
    return '1';
 
}
 
 
unsigned long _stdcall _thread_PowerOfN(void* n)  {
  EnterCriticalSection(&cs); 
    res=PowerOfN(*(long*)n);
  LeaveCriticalSection(&cs);  
} 
 
 
int main(){
HANDLE  hThread;
 
InitializeCriticalSection(&cs);
cout<<"Enter the number"<<endl;
cin>>chislo; 
//запускаем поток.
 
CreateThread(0,0,_thread_PowerOfN,&chislo,0,0);
hThread = GetCurrentThread();
SetThreadPriority(hThread, THREAD_PRIORITY_LOWEST);   
while(1){
Sleep(0);
 
EnterCriticalSection(&cs); 
 
 
if(res!='2') break;
 
LeaveCriticalSection(&cs); 
}
 
if (res=='1')
  cout<<cnt<<endl;
else
  cout<<"NO"<<endl;
     
cnt = 0;
res = '2';
 
   
 
//second run
InitializeCriticalSection(&cs);
 
cout<<"Enter the number"<<endl;
cin>>chislo; 
 
CreateThread(0,0,_thread_PowerOfN,&chislo,0,0);
hThread = GetCurrentThread();
SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);   
while(1){
Sleep(0);
 
EnterCriticalSection(&cs); 
 
 
if(res!='2') break;
 
LeaveCriticalSection(&cs); 
}
 
 
if (res=='1')
  cout<<cnt;
else
  cout<<"NO";
  
  
  
  return 0;
 
}
Как использовать?
Цитата Сообщение от Klendathu Посмотреть сообщение
C++
1
2
3
4
5
6
BOOL GetThreadTimes ( 
HANDLE Thread, 
PFILETIME Created, // Время с 01.01.1601 в сотнях нс до создания потока 
PFILETIME Exited, // Время с 01.01.1601 в сотнях нс до завершения потока 
PFILETIME Kernel, // Время в сотнях нс, затраченное потоком на код ОС 
PFILETIME User); // Время в сотнях нс, затраченное потоком на код программы
Откуда взять значение Created, Exited, Kernel, User???
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
12.12.2011, 17:09     Запустить программу из другой программы в качестве нового процесса #17
что сразу бросается в глаза это

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//hThread = GetCurrentThread(); //берет текущий поток тоесть наш главный процесс
hThread=CreateThread(0,0,_thread_PowerOfN,&chislo,0,0); //надо получить указатель именно на созданный поток
SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);   // теперь приоритет пойдет куда надо
 
//функция GetThreadTimes  как я понял возвращает все 4 значения времени Created, Exited, Kernel, User;
 
//надо просто создать их экземпляры
FILETIME t1,t2,t3,t4;
SYSTEMTIME t;
....
GetThreadTimes (hThread,&t1,&t2,&t3,&t4);
//нам интересно лишь t3
 
FileTimeToSystemTime(&t3,&t); //переводим процессорное время в системное
printf("%d.%d.%d %d:%d:%d",t.wDay,t.wMonth,t.wYear,t.wHour,t.wMinute,t.wSecond); //выводим время по частям
//еще мне кое что не нравится в этой функции что она под NT и win2000, у некоторых она возвращает ноль
Klendathu
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
13.12.2011, 09:09  [ТС]     Запустить программу из другой программы в качестве нового процесса #18
Цитата Сообщение от DeadRipper Посмотреть сообщение
printf("%d.%d.%d %d:%d:%d",t.wDay,t.wMonth,t.wYear,t.wHour,t.wMinute,t.wSecond);
А как получить в миллисекундах? А то все время ноль выводит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2011, 19:34     Запустить программу из другой программы в качестве нового процесса
Еще ссылки по теме:

C++ как запустить прогу из другой проги
запустить .exe из другой программы win32 C++
C++ Функция в качестве аргумента другой функции по умолчанию

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

Или воспользуйтесь поиском по форуму:
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
14.12.2011, 19:34     Запустить программу из другой программы в качестве нового процесса #19
C++
1
t.wMilliseconds должно быть
Yandex
Объявления
14.12.2011, 19:34     Запустить программу из другой программы в качестве нового процесса
Ответ Создать тему
Опции темы

Текущее время: 17:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru