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

Консольное приложение - C++

Восстановить пароль Регистрация
 
bolddot
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 5
30.11.2013, 03:36     Консольное приложение #1
Здравствуйте!

Имеется консольное приложение, которое при наборе команды "start" выполняет запуск программы. Проблема в том, что пока я не завершу второе приложение, я не могу управлять командами первого. Можно ли как ни будь переключаться между ними?

Оба приложение консольные.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(int argc, CHAR* argv[])
{
    string input = "";
    system("TITLE Test");
    system("@ECHO OFF");
    setlocale(LC_ALL, "Russian");
        while(true){
        getline(cin, input);
        if(input == "start"){
                system("java -Xincgc -Xmx1G -jar lib.jar");
        }
        {
        return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2013, 03:36     Консольное приложение
Посмотрите здесь:

C++ Консольное приложение + DDE
Разработать консольное приложение C++
консольное приложение C++
C++ Консольное приложение на С++
лан и консольное приложение C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
30.11.2013, 09:27     Консольное приложение #2
Цитата Сообщение от bolddot Посмотреть сообщение
роблема в том, что пока я не завершу второе приложение, я не могу управлять командами первого. Можно ли как ни будь переключаться между ними?
ты имеешь ввиду,что у тебя твой супер софт висит на строчке
Цитата Сообщение от bolddot Посмотреть сообщение
system("java -Xincgc -Xmx1G -jar lib.jar");
???
Дебагером проверь.

Если так - тогда запускай свой джава файл в отдельном потоке
bolddot
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 5
30.11.2013, 11:50  [ТС]     Консольное приложение #3
newbie666, Спасибо за ответ. Да, походу так и сделаю. Буду использовать pipes для перехвата, дочернего процесса.

Нашел некий код, буду разбираться.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
//------------Пример использования CreateProcess и Anonymous Pipes------
 
// childspawn.cpp
// Приложение запускает shell и перехватывает его ввод/вывод
 
//---------------------use freely---------------------------------------
 
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#pragma hdrstop
#include <condefs.h>
 
 
 
#define bzero(a) memset(a,0,sizeof(a)) //для сокращения писанины
 
 
 
bool IsWinNT()  //проверка запуска под NT
{
  OSVERSIONINFO osv;
  osv.dwOSVersionInfoSize = sizeof(osv);
  GetVersionEx(&osv);
  return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
 
 
 
void ErrorMessage(char *str)  //вывод подробной информации об ошибке
{
 
  LPVOID msg;
 
  FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // язык по умолчанию
    (LPTSTR) &msg,
    0,
    NULL
  );
 
  printf("%s: %s\n",str,msg);
  LocalFree(msg);
 
}
 
 
 
//----------------------------------------------------------------------
 
void main()
 
{
 
  char buf[1024];           //буфер ввода/вывода
 
 
 
  STARTUPINFO si;
  SECURITY_ATTRIBUTES sa;
  SECURITY_DESCRIPTOR sd;        //структура security для пайпов
  PROCESS_INFORMATION pi;
 
  HANDLE newstdin,newstdout,read_stdout,write_stdin;  //дескрипторы
                                                      // пайпов
 
 
  if (IsWinNT())        //инициализация security для Windows NT
  {
    InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(&sd, true, NULL, false);
    sa.lpSecurityDescriptor = &sd;
  }
 
  else sa.lpSecurityDescriptor = NULL;
 
  sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle = true;       //разрешаем наследование дескрипторов
 
 
  if (!CreatePipe(&newstdin,&write_stdin,&sa,0))   //создаем пайп
                                                   // для stdin
  {
    ErrorMessage("CreatePipe");
    getch();
    return;
  }
 
  if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //создаем пайп
                                                  // для stdout
  {
    ErrorMessage("CreatePipe");
    getch();
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
    return;
  }
 
 
 
  GetStartupInfo(&si);      //создаем startupinfo для
                            // дочернего процесса
 
  /*
 
  Параметр dwFlags сообщает функции CreateProcess
  как именно надо создать процесс.
 
  STARTF_USESTDHANDLES управляет полями hStd*.
  STARTF_USESHOWWINDOW управляет полем wShowWindow.
 
  */
 
  si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
  si.wShowWindow = SW_HIDE;
  si.hStdOutput = newstdout;
  si.hStdError = newstdout;   //подменяем дескрипторы для
  si.hStdInput = newstdin;    // дочернего процесса
 
  char app_spawn[] = "d:\\winnt\\system32\\cmd.exe"; //это просто
                                                     // пример,
                                                     //замените на то,
                                                     // что вам нужно
 
 
 
  //создаем дочерний процесс
 
  if (!CreateProcess(app_spawn,NULL,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,
                     NULL,NULL,&si,&pi))
  {
    ErrorMessage("CreateProcess");
    getch();
    CloseHandle(newstdin);
    CloseHandle(newstdout);
    CloseHandle(read_stdout);
    CloseHandle(write_stdin);
    return;
  }
 
 
 
  unsigned long exit=0;  //код завершения процесса
  unsigned long bread;   //кол-во прочитанных байт
  unsigned long avail;   //кол-во доступных байт
 
 
 
  bzero(buf);
 
  for(;;)      //основной цикл программы
  {
    GetExitCodeProcess(pi.hProcess,&exit); //пока дочерний процесс
                                           // не закрыт
    if (exit != STILL_ACTIVE)
      break;
 
    PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);
 
    //Проверяем, есть ли данные для чтения в stdout
 
    if (bread != 0)
    {
      bzero(buf);
      if (avail > 1023)
      {
        while (bread >= 1023)
        {
          ReadFile(read_stdout,buf,1023,&bread,NULL);  //читаем из
                                                       // пайпа stdout
          printf("%s",buf);
          bzero(buf);
        }
      }
 
      else {
        ReadFile(read_stdout,buf,1023,&bread,NULL);
        printf("%s",buf);
      }
    }
 
    if (kbhit())      //проверяем, введено ли что-нибудь с клавиатуры
    {
      bzero(buf);
      *buf = (char)getche();
 
      //printf("%c",*buf);
 
      WriteFile(write_stdin,buf,1,&bread,NULL); //отправляем это
                                                // в stdin
 
      if (*buf == '\r') {
        *buf = '\n';
        printf("%c",*buf);
        WriteFile(write_stdin,buf,1,&bread,NULL); //формирум конец
                                                  //строки, если нужно
 
      }
    }
  }
 
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(newstdin);            //небольшая уборка за собой
  CloseHandle(newstdout);
  CloseHandle(read_stdout);
  CloseHandle(write_stdin);
}
 
//----------------------------EOF-----------------------------------
 
//------------------------------------------------------------------
newbie666
Заблокирован
30.11.2013, 12:41     Консольное приложение #4
Цитата Сообщение от bolddot Посмотреть сообщение
Буду использовать pipes
с пайпами лучше не связывайся - муть полнейшая
Цитата Сообщение от bolddot Посмотреть сообщение
для перехвата, дочернего процесса.
твой джава процесс не дочерний, да и потом, что ты имеешь ввиду под перехватом? чего ты добиться то хочешь?
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
30.11.2013, 13:53     Консольное приложение #5
Цитата Сообщение от bolddot Посмотреть сообщение
Проблема в том, что пока я не завершу второе приложение, я не могу управлять командами первого.
Используйте вместо start функцию CreateProcess.

Цитата Сообщение от newbie666 Посмотреть сообщение
с пайпами лучше не связывайся - муть полнейшая
Ага, особенно если не знать, как с ними работать и полагаться на неизвестно
откуда взятую копи-пасту.
bolddot
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 5
03.12.2013, 01:17  [ТС]     Консольное приложение #6
Спасибо за ответы!
Во всем разобрался, вроде бы работает. Но, возник еще вопросик! Не волнуйтесь, его я опишу более подробно .

Когда я пытаюсь удалить часть текста, он не всегда срабатывает, и как бы пропускает строку.

C++
1
2
3
char buf[1024]; //буфер ввода/вывода
unsigned long bread; //кол-во прочитанных байт
unsigned long avail; //кол-во доступных байт
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
void ReceiveMessages()
{
    string temp = "";
    PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);
    if (bread != 0)
    {
        bzero(buf);
        if (avail > 1023)
        {
            while (bread >= 1023)
            {
                ReadFile(read_stdout,buf,1023,&bread,NULL);
                if(buf != ""){
                temp = buf;
                temp.erase(0,33); //+
                cout << temp;
                                }
                bzero(buf);
            }
      } else {
            ReadFile(read_stdout,buf,1023,&bread,NULL);
            if(buf != ""){
                temp = buf;
                temp.erase(0,33); /++
                cout << temp;
            }
        }
    }
}
Выход:
start
Starting minecraft server version 1.7.2
Loading properties
Default game type: SURVIVAL
Generating keypair
Starting Minecraft server on 127.0.0.1:25565
**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!
[08:19:24] [Server thread/WARN]: The server will make no attempt to authenticate usernames. Beware.
While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose.
[08:19:24] [Server thread/WARN]: To change this, set "online-mode" to "true" in the server.properties file.
Preparing level "world"
Preparing start region for level 0
Preparing spawn area: 12%
Preparing spawn area: 52%
Preparing spawn area: 82%
Done (4,026s)! For help, type "help" or "?"
При повторном запуске получаю уже другое...

Добавлено через 14 часов 15 минут
Отмена, все! Работает.

Добавлено через 1 час 21 минуту

http://oi39.tinypic.com/v75m5i.jpg
Yandex
Объявления
03.12.2013, 01:17     Консольное приложение
Ответ Создать тему
Опции темы

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