6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53
1

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

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

Author24 — интернет-сервис помощи студентам
Нужно запустить программу из другой программы:
Первая программа, которую нужно запустить:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2011, 18:40
Ответы с готовыми решениями:

Порождение нового процесса и запуск программы в рамках порожденного процесса
Цель работы. Изучение программных средств создания процессов, а также простейших способов обмена...

Запуск еще одного экземпляра программы как нового процесса.
Hi Kak zapustit drugoj java aplication kak novi(nezavisimi) process is pervovo aplicationa ?? ...

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

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

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

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

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

system("Programma_1.exe");

Вместо CreateProc
1
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53
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
65 / 71 / 9
Регистрация: 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
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53
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
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
11.12.2011, 20:59 12
забыл еще дописать вам в тот раз
критическую секцию надо сначала инициализировать было в начале main()
C++
1
2
3
4
5
6
int main(){
 
InitializeCriticalSection(&cs);
 
....
}
1
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53
11.12.2011, 21:09  [ТС] 13
Спасибо большое! Сам вот тоже рылся в сети и пытался инициализацию сделать.
А теперь финальный штрих: например, сделать 2 потока одинаковых(вычисление явления степени двойки) и для каждого потока дать разные приоритеты, например, максимальный и минимальный и поставить таймер. Запустить по-очереди и в конце выдать результат времени работы каждого потока?? Чтобы я окончательно разобрался с потоками
0
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
11.12.2011, 21:11 14
на счет приоритетов ничего не могу сказать, никогда не сталкивался, тут надо специалистов)

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

тут правда думаю все очень быстро пойдет, надо хотя бы по миллиону раз вычислять функцию в цикле
1
Заблокирован
11.12.2011, 21:18 15
А.П. Побегайло - "Системное программирование в Windows"
Избавит от множества вопросов
0
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53
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???
0
65 / 71 / 9
Регистрация: 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, у некоторых она возвращает ноль
1
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53
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);
А как получить в миллисекундах? А то все время ноль выводит
0
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
14.12.2011, 19:34 19
C++
1
t.wMilliseconds должно быть
0
14.12.2011, 19:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2011, 19:34
Помогаю со студенческими работами здесь

Как запустить программу в качестве системной службы?
Товарищи, подскажите пожалуйста. Написал программу ведения электронного журнала (клиент-сервер на...

Как написать вторую программу, чтобы она открывала первую в качестве процесса?
Помогите разобраться, я написала одну программу на нахождение площади равностороннего треугольника...

Получение переменных из процесса другой программы
Есть задача - написать переименовщик файлов изображений под определенные нужды, а именно...

Составьте UNIX-программу на языке С, порождающую в качестве дочернего процесса свою копию и ожидающую ее завершения
Составьте UNIX-программу на языке С, порождающую в качестве дочернего процесса свою копию и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru