Ir ao conteúdo
  • Cadastre-se

C 2 programas em 1


Posts recomendados

Boa noite.

tenho 2 programas na linguagem c, 1º exibe o menu e tem uma função cadastro, o 2º tem a função de reservas de lugares, através do 1º programa eu chamo o 2º usando a função system("caminho do executável"), quando efetuo a reservas dos lugares e volto para o 1º programa o 2º programa fecha perdendo todos os dados, para n ter esta perda de dados ? tem como deixar o 2º sempre aberto, mais só se torna visível quando eu o chamar ??

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Matheus Miranda Souza

14 horas atrás, Matheus Miranda Souza disse:

Boa noite.

tenho 2 programas na linguagem c, 1º exibe o menu e tem uma função cadastro, o 2º tem a função de reservas de lugares, através do 1º programa eu chamo o 2º usando a função system("caminho do executável"), quando efetuo a reservas dos lugares e volto para o 1º programa o 2º programa fecha perdendo todos os dados, para n ter esta perda de dados ? tem como deixar o 2º sempre aberto, mais só se torna visível quando eu o chamar ??

Qual é o sistema operacional?

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Matheus Miranda Souza disse:

Windows 64bits, uso a ide codeblock.

 

Se seu objetivo é mostrar e ocultar janelas do console, então use as seguintes funções

BOOL escoda_me( void )
{ BOOL hide= ShowWindow( GetConsoleWindow(), SW_HIDE );
  return hide;
}


BOOL mostre_me( void )
{ BOOL show= ShowWindow( GetConsoleWindow(), SW_SHOW );
  return show;
}

Para tanto importe também a biblioteca microsoft  (windows.h), porém antes do comando include, defina o macro constante de nome _WIN32_WINNT conforme a versão do seu sistema. Segue um atalho com os valores para constante: https://msdn.microsoft.com/en-us/library/6sehtctf.aspx

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Em 28/10/2018 às 05:44, Matheus Miranda Souza disse:

usando a função system("caminho do executável")

Primeiro acredito que essa não seja a função correta. Seria infinitamente melhor usar CreateProcess da biblioteca windows.h
Com system você seu programa se detém para executar o segundo programa, e só volta quando o segundo termine. A solução é criar outro processo assim você tem por um lado processo A, que funciona independente de processo B, B seria um processo filho de A, mas são os 2 separados.
 

 

Em 28/10/2018 às 05:44, Matheus Miranda Souza disse:

para n ter esta perda de dados ? tem como deixar o 2º sempre aberto, mais só se torna visível quando eu o chamar ?? 

Para não perder os dados existem muitas estratégias a seguir. Se você seguir o conselho sobre dividir o programa em 2 processos separados, você precisa buscar alguma estratégia de comunicação entre processos. Algumas dessas podem ser pipes, sockets, memória compartilhada, permanência de dados(arquivos), etc, não são as únicas mas são as que tenho constância.

acredito que para seu caso você deva procurar algo sobre CeateProcess junto com pipes, mas realmente não sei si lhe estou indicando um caminho correto, espero que outros usuários contribuam na ajuda até tomar uma boa direção.

Para ver o que estou falando vou lhe deixar um exemplo de como usar CreateProcess. Mas sem comunicação entre processos.

O exemplo a seguir você pode chamar ele de main.c, e o programa a ser executado vou chamar de modulo1, com a ideia de ter mais tarde vários outros módulos(outros programas). Resumindo... O main.c(main.exe) abre o modulo1.c(modulo1.exe) e passa um mensagem, no qual o segundo vai mostrar na tela. Vão ser abertas 2 janelas, mas pode ser aberta uma só se você trocar o parâmetro da função CreateProcess chamado CREATE_NEW_CONSOLE por 0, neste caso abriria 1 só janela.
main.c

#include<stdio.h>
#include <windows.h>


int main(){
	HWND				hWnd;
	STARTUPINFO			sInfo;
	PROCESS_INFORMATION	pInfo;

	ZeroMemory(&sInfo, sizeof(sInfo));
	sInfo.cb = sizeof(sInfo);
	ZeroMemory(&pInfo, sizeof(pInfo));
	char * cmd = ( char* ) "Isso vai receber o modulo1";
	if (
		CreateProcess(
			"modulo1.exe", 
			cmd, 
			NULL, 
			NULL, 
			false, 
			CREATE_NEW_CONSOLE, // Trocar por 0 se quiser uma só janela, porém o 1º programa não vai esperar 2º programa, quando o segundo terminar volta automatico ao primeiro.		 
			NULL, 
			NULL, 
			&sInfo, 
			&pInfo
		)
	)
	{
		do {
			printf("Esperando 100 micro segundos...\n");
			Sleep(100);
		} while ((hWnd = FindWindow(NULL, "modulo1.exe")) != NULL);

		MoveWindow(hWnd, 0, 0, 800, 600, true);
		CloseHandle(pInfo.hProcess);
	}
	return 0;
}

modulo1.c

#include<stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]){
    
    printf("Recebido: ");
    if ( argc > 1 ){
        for (int i = 0; i < argc ; i++) {
            printf("%s ", argv[i]);
            
        }
        printf("\n");
        
    }
    
    
    system("pause");
    return 0;
}

você deve se perguntar como o segundo programa recebeu "Isso vai receber o modulo1". Isso é por causa dos parâmetros de main, mas isso só serve para passar dados na hora que abrir o segundo programa, não estariam se comunicando realmente, pois não teria como passar dados de volta ao primeiro, mas ja é um começo.

adicionado 1 minuto depois

compile os 2 e deixe ambos na mesma pasta e rode o main.exe e veja a magia acontecer. Prove trocar CREATE_NEW_CONSOLE por 0 para ver o que acontece.

adicionado 2 minutos depois

Talvez você esteja procurando respostas fáceis, mas realmente sinto muito, não há uma forma "fácil" de se fazer isso.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...