Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/58: Рейтинг темы: голосов - 58, средняя оценка - 4.71
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53

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

10.12.2011, 18:40. Показов 12168. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2011, 18:40
Ответы с готовыми решениями:

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

Запуск еще одного экземпляра программы как нового процесса.
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)
1. Создать первую функцию для решения задачи, в которой предусмотреть передачу входной и выходной информации через глобальные переменные. ...

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

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

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

system("Programma_1.exe");

Вместо CreateProc
1
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53
10.12.2011, 19:50  [ТС]
Спасибо! Получилось)
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
я бы сделал так;


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

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

тут правда думаю все очень быстро пойдет, надо хотя бы по миллиону раз вычислять функцию в цикле
1
Заблокирован
11.12.2011, 21:18
А.П. Побегайло - "Системное программирование в Windows"
Избавит от множества вопросов
0
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53
12.12.2011, 07:30  [ТС]
Вопросы все-таки есть:
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
что сразу бросается в глаза это

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
 Аватар для Klendathu
6 / 6 / 0
Регистрация: 10.11.2011
Сообщений: 53
13.12.2011, 09:09  [ТС]
Цитата Сообщение от DeadRipper Посмотреть сообщение
printf("%d.%d.%d %d:%d:%d",t.wDay,t.wMonth,t.wYear,t.wHou r,t.wMinute,t.wSecond);
А как получить в миллисекундах? А то все время ноль выводит
0
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
14.12.2011, 19:34
C++
1
t.wMilliseconds должно быть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.12.2011, 19:34
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru