none
задача на c++ RRS feed

  • Общие обсуждения

  • эта программа работает: когда мы пишем (например) calc.exe,то программа открывает это приложение и ждёт завершение этого процесса,т.е я не могу ввести другое имя файла,пока не закрою calk

    подскажите,как в этом коде добавить функцию,чтобы когда  мы пишем в консоли (например) calc.exe & , то программа не ждёт завершения процесса calk, а позволяет ввести другое ямя файла и открыть его

    #include "StdAfx.h"
    #include <windows.h>
    #include <iostream>
    #include <iomanip>
    #include <TCHAR.h>
    #include <time.h>
    #include <conio.h>

    int _tmain( int argc, TCHAR *argv[] )
    {

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
    char szBuf[256];
    wchar_t szWBuf[256];

    scanf ("%s", szBuf);

    mbstowcs(szWBuf, szBuf, 256);     

    while (strcmp(szBuf, "exit") != 0)
    {

    // Запустим дочерний процесс.

    if( !CreateProcess(
    NULL,       // Нет имени модуля (используется командная строка).
                szWBuf,     // Командная строка.
    NULL,       // Дескриптор процесса не наследуемый.
    NULL,       // Дескриптор потока не наследуемый.
    FALSE,      // Установим наследование дескриптора в FALSE.
       0,          // Флажков создания нет.
       NULL,       // Используйте блок конфигурации родителя.
       NULL,      // Используйте стартовый каталог родителя.
        &si,       // Указатель на структуру STARTUPINFO.
       &pi )     // Указатель на структуру PROCESS_INFORMATION.
    )
    {
    printf( "CreateProcess failed (%d).\n", GetLastError() );
    return 0;
    }

    // Ждать до тех пор, пока дочерний процесс не выйдет из работы.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Закроем дескрипторы процесса и потока.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

    scanf ("%s", szBuf);
    mbstowcs(szWBuf, szBuf, 256); 
    }
    }

    25 декабря 2012 г. 10:03

Все ответы

  • нужно создать второй поток
    25 декабря 2012 г. 11:02
  • а как его создать?
    25 декабря 2012 г. 11:04
  • #include <process.h>
    void thread(void *x){ } //функция твоего потока
    _beginthread(thread, 0, 0); //запуск

    25 декабря 2012 г. 11:07
  • что-то ничего не понятно, можно показать куда это вставить в в верхний код)
    25 декабря 2012 г. 11:09
  • // help.cpp: определяет точку входа для консольного приложения.
    //
    
    #include "stdafx.h"
    #include <windows.h>
    #include <iostream>
    #include <iomanip>
    #include <TCHAR.h>
    #include <time.h>
    #include <conio.h>
    #include <process.h>
    void thread(void *x);
    
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    char szBuf[256];
    wchar_t szWBuf[256];
    
    int _tmain( int argc, TCHAR *argv[] )
    {
    
    
    	ZeroMemory( &si, sizeof(si) );
    	si.cb = sizeof(si);
    	ZeroMemory( &pi, sizeof(pi) );
    
    
    
    	scanf ("%s", szBuf);
    
    	mbstowcs(szWBuf, szBuf, 256);
    
    	//_beginthread(thread, 0, 0);
    
    	while (strcmp(szBuf, "exit") != 0) {
    
    // Запустим дочерний процесс.
    		_beginthread(thread, 0, 0);
    
    
    		scanf ("%s", szBuf);
    		mbstowcs(szWBuf, szBuf, 256);
    	}
    
    
    
    }
    
    void thread(void *x)
    {
    
    	if( !CreateProcess(
    				NULL,       // Нет имени модуля (используется командная строка).
    				szWBuf,     // Командная строка.
    				NULL,       // Дескриптор процесса не наследуемый.
    				NULL,       // Дескриптор потока не наследуемый.
    				FALSE,      // Установим наследование дескриптора в FALSE.
    				0,          // Флажков создания нет.
    				NULL,       // Используйте блок конфигурации родителя.
    				NULL,      // Используйте стартовый каталог родителя.
    				&si,       // Указатель на структуру STARTUPINFO.
    				&pi )     // Указатель на структуру PROCESS_INFORMATION.
    	  ) {
    		printf( "CreateProcess failed (%d).\n", GetLastError() );
    		//return 0;
    	}
    
    // Ждать до тех пор, пока дочерний процесс не выйдет из работы.
    	WaitForSingleObject( pi.hProcess, INFINITE );
    
    // Закроем дескрипторы процесса и потока.
    	CloseHandle( pi.hProcess );
    	CloseHandle( pi.hThread );
    }

    25 декабря 2012 г. 11:22
  • это код у меня не работает
    25 декабря 2012 г. 11:33
  • а что конкретно происходит не так
    у меня запускается пишу calc.exe жму  enter

    запускается калкулятор при этом в консоль можно писать

    25 декабря 2012 г. 11:37
  • теперь у меня работает,но после того как я пишу calc.exe я не могу вызвать другое приложение,не закрыв calc.exe,а мне надо,чтобы можно было вызывать новые процессы,не закрывая старые
    25 декабря 2012 г. 12:02
  • // help.cpp: определяет точку входа для консольного приложения.
    //
    
    //#include "stdafx.h"
    #include <StdAfx.h>
    #include <windows.h>
    #include <iostream>
    #include <iomanip>
    #include <TCHAR.h>
    #include <time.h>
    #include <conio.h>
    #include <process.h>
    void thread(void *x);
    
    
    char szBuf[256];
    wchar_t szWBuf[256];
    
    int _tmain( int argc, TCHAR *argv[] )
    {
    	
    
    	scanf ("%s", szBuf);
    	mbstowcs(szWBuf, szBuf, 256);	
    
    	while (strcmp(szBuf, "exit") != 0) {
    		// Запустим дочерний процесс.
    		_beginthread(thread, 0, 0);
    		scanf ("%s", szBuf);
    		mbstowcs(szWBuf, szBuf, 256);
    	}
    }
    
    void thread(void *x)
    {
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    	ZeroMemory( &si, sizeof(si) );
    	si.cb = sizeof(si);
    	ZeroMemory( &pi, sizeof(pi) );
    
    	if( !CreateProcess(
    				NULL,       // Нет имени модуля (используется командная строка).
    				szWBuf,     // Командная строка.
    				NULL,       // Дескриптор процесса не наследуемый.
    				NULL,       // Дескриптор потока не наследуемый.
    				FALSE,      // Установим наследование дескриптора в FALSE.
    				0,          // Флажков создания нет.
    				NULL,       // Используйте блок конфигурации родителя.
    				NULL,      // Используйте стартовый каталог родителя.
    				&si,       // Указатель на структуру STARTUPINFO.
    				&pi )     // Указатель на структуру PROCESS_INFORMATION.
    	  ) {
    		printf( "CreateProcess failed (%d).\n", GetLastError() );
    		//return 0;
    	}
    
    // Ждать до тех пор, пока дочерний процесс не выйдет из работы.
    	WaitForSingleObject( pi.hProcess, INFINITE );
    
    // Закроем дескрипторы процесса и потока.
    	CloseHandle( pi.hProcess );
    	CloseHandle( pi.hThread );
    }

    чуть чуть подправил

    запускаю

    пишу calc жму enter открывается калькулятор

    пишу notepad жму enter открывается блокнот

    ..... и тд и тп

    у меня всё работает

    кстати чем строиш проект я VS2008


    • Изменено maxillion 25 декабря 2012 г. 12:11 789
    25 декабря 2012 г. 12:09
  • я работаю в VS2010 и у меня все равно ждёт,пока я закрою calc, только потом можно писать(((
    25 декабря 2012 г. 12:17
  • блин,завтра последний день сдачи этой задачи((( неужели,это всё из-за разных версий?
    25 декабря 2012 г. 12:21
  • я работаю в VS2010 и у меня все равно ждёт,пока я закрою calc, только потом можно писать(((

    хм странно попробуй перестроить проект или создать новый

    у меня vs2010 бывает такой глюк внес изменения в код... построил... запустил... а изменения почему то не вступили в силу

    25 декабря 2012 г. 12:22
  • скорее всего здесь надо сделать  что-то с флагами,вот только что....
    25 декабря 2012 г. 12:23
  • теперь,когда я создаю новый проект,у меня пишет,что не удается найти указанный файл

    25 декабря 2012 г. 12:29
  • теперь,когда я создаю новый проект,у меня пишет,что не удается найти указанный файл

    какой файл

    WaitForSingleObject (толи синхронная толи асинхронная) суть дела в том что пока она не завершится управление в твой код не возвратится да и вообше какая суть задачи. Запускать множество программ через консоль тогда выкинь из кода WaitForSingleObject не думаю что будет очень страшно

    • Изменено maxillion 25 декабря 2012 г. 12:33 5
    25 декабря 2012 г. 12:32
  • он пишет    не удаётся запустить программу F:\c++\Debug\3.exe

    не удаётся найти указанный файл

    25 декабря 2012 г. 12:40
  • теперь,когда я создаю новый проект,у меня пишет,что не удается найти указанный файл

    какой файл

    WaitForSingleObject (толи синхронная толи асинхронная) суть дела в том что пока она не завершится управление в твой код не возвратится да и вообше какая суть задачи. Запускать множество программ через консоль тогда выкинь из кода WaitForSingleObject не думаю что будет очень страшно

    всё равно ждёт пока закрою калькулятор
    25 декабря 2012 г. 12:44
  • хорошо выложу то что строит мой vs скачай и попробуй сам это
    25 декабря 2012 г. 12:55