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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
#1

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

10.12.2011, 18:40. Просмотров 2041. Ответов 18
Метки нет (Все метки)

Нужно запустить программу из другой программы:
Первая программа, которую нужно запустить:
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, и потом запускаю вычисление того, является ли оно степенью двойки в новом потоке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2011, 18:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запустить программу из другой программы в качестве нового процесса (C++):

запустить .exe из другой программы win32 - C++
Заинтересовал механизм в общих чертах, как запустить .ехе файл обычного Hello World! из другого консольного приложения, и как это...

Как запустить программу из программы на C++ - C++
Как из программы , написанной на с++ запустить другую программу(передать ей аргументы) и получить результат обратно в первую программу?

Как запустить из программы на с++ стороннюю программу? - C++
Как запустить из программы стороннюю программу и открыть в ней конкретный файл?

Порождение нового процесса - C++
Нужно немного переработать код. Задание: разработать программу, вычисляющую плотность распределения Пуассона с параметром lambda в точке k...

Включить массив в качестве нового столбца в матрицу - C++
Задан массив А размером 5 на 3 и вектор В размером 3. Элементы первой строки массива А упорядочены по убыванию. Включить массив В в...

Включить массив В в качестве нового столбца массива А - C++
1. ЗАдан массив А размером 5 на 3 и вектор В размером 3. Элементы первой строки массива А упорядочены по убыванию. Включить массив В в...

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

если консольное приложение то надо main(), если конечно вы создавали именно консольный проект
1
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;
 
}
0
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
10.12.2011, 19:12 #6
даже число нельзя ввести?
0
Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
10.12.2011, 19:19  [ТС] #7
Да, не вводится. Зависает, после сообщения ввести число

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

system("Programma_1.exe");

Вместо CreateProc
1
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", а затем создать новый поток в этой же программе, передать туда число, и вычислить является ли степенью двойки это число?
0
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); //Выход из нее
}
 
 
 
//выводим результат
 
}
1
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 минуты
Укажите хотя бы в каком месте ошибку искать!!!
0
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);
 
....
}
1
Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 51
11.12.2011, 21:09  [ТС] #13
Спасибо большое! Сам вот тоже рылся в сети и пытался инициализацию сделать.
А теперь финальный штрих: например, сделать 2 потока одинаковых(вычисление явления степени двойки) и для каждого потока дать разные приоритеты, например, максимальный и минимальный и поставить таймер. Запустить по-очереди и в конце выдать результат времени работы каждого потока?? Чтобы я окончательно разобрался с потоками
0
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
11.12.2011, 21:11 #14
на счет приоритетов ничего не могу сказать, никогда не сталкивался, тут надо специалистов)

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

тут правда думаю все очень быстро пойдет, надо хотя бы по миллиону раз вычислять функцию в цикле
1
Bers
Заблокирован
11.12.2011, 21:18 #15
А.П. Побегайло - "Системное программирование в Windows"
Избавит от множества вопросов
0
11.12.2011, 21:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2011, 21:18
Привет! Вот еще темы с ответами:

Порождение нового процесса и работа с ним - C++
Помогите разработать программу, вычисляющую плотность распределения Пуассона с параметром lambda в точке k (k - целое) по формуле...

Запуск еще одного экземпляра программы как нового процесса. - Java
Hi Kak zapustit drugoj java aplication kak novi(nezavisimi) process is pervovo aplicationa ?? znaju odin sposov no ne uveren 4to...

Большее из X(i) и Y(i) принять в качестве нового значения X(i), а меньшее - в качестве нового значения Y(i) - Matlab
1. Создать первую функцию для решения задачи, в которой предусмотреть передачу входной и выходной информации через глобальные переменные. ...

Программа, запускающая первую программу в качестве вновь созданного процесса - C++ Builder
Задание: Разработать две программы. Первая находит площадь кольца, внутренний радиус которого равен R1, а внешний радиус равен R2...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru