PDA

Visualizza la versione completa : [C++] Il programma continua in background


Manii
08-06-2014, 14:08
Ciao a tutti, da un po' di tempo sto lavorando a un programma in c++ usando come compilatore Visual Studio 2013. Proprio oggi ho notato che il programma da me creato non si chiude più, ovvero la finestra (è un applicazione Win32) viene distrutta ma il programma resta attivo in background. Infatti il compilatore mi dà errore LNK1168 perchè il file .exe è ancora in esecuzione e mi tocca aprire il task manager e terminare il processo manualmente. Fino a ieri invece era tutto ok. Cosa può essere? Davvero non riesco a capire :bhò: non ho apportato nessuna grande modifica al codice!

oregon
08-06-2014, 14:34
Praticamente impossibile dire qualcosa senza vedere il codice, soprattutto nella parte dove dovrebbe terminare il programma.

Manii
08-06-2014, 14:44
Già hai ragione :D ora posto la parte finale perchè il codice intero è molto lungo:


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
MSG msg;
bool done = false;
.....
while(!done){
// main loop
}

KillGLWindow(); // distrugge la finestra
return msg.wparam;
}

oregon
08-06-2014, 14:56
Ma dal ciclo come esce?

Manii
08-06-2014, 15:08
Impostando la variabile done a true:


...
done = gest->getFine();
...

Dove gest è un'istanza della classe Gestore, la quale classe gestisce le operazioni principali del programma.

oregon
08-06-2014, 15:17
La struttura del codice non è chiarissima ... puoi postarlo tutto ?

Manii
08-06-2014, 15:28
Certo, avevo saltato alcune parti per cercare di snellirlo un po' :D premetto comunque che questo programma è scritto utilizzando le librerie OpenGL. Praticamente è un giochino semplice, in cui vi sono dei frutti e lo scopo è tagliarli (non mi dilungo troppo).
Questa è la main:



int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
MSG msg;
bool done = false;

mouse.init();
aumento = 8.25f/90.0f;

if (MessageBox(NULL,"Eseguire in modalità fullscreen?", "FullScreen?", MB_YESNO|MB_ICONQUESTION)==IDNO){ // chiede all'utente se vuole che il programma venga eseguito in modalità schermo intero
fullscreen=false;
}

if (!CreateGLWindow("Fruit killer :D",640,480,16,fullscreen)){ // crea la finestra
return 0;
}

while(!done){
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if (msg.message==WM_QUIT){
done = true;
}else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}else{
if(!caricato){ // carico tutti i modelli 3D
ShowCursor(FALSE);

frutta = new Frutti(hDC, &barra, aumento, loading);
ortaggi = new Ortaggi(hDC, &barra, aumento, loading);
vari = new Vari(hDC, &barra, aumento, loading);
scia = new Scia(spade, &mouse, 200);
esplosione = new Scia(spade, &mouse, 2000);
banane = new Scia(spade, &mouse, 150);
esplosione->setSel(0);
gest = new Gestore(&hDC, &hInstance, (Frutti*)frutta, (Ortaggi*)ortaggi, (Vari*)vari, &mouse, &spade, scia, esplosione, banane, &writers, &comic, &menu_tex, &splash, &bonus_tex);
caricato=true;
}

if (gest->getCur()){
ShowCursor(TRUE);
}

if (gest->getLuce()){
glDisable(GL_LIGHT0);
}
else{
glEnable(GL_LIGHT0);
}

if (gest->getNebbia()){
glEnable(GL_FOG);
}
else{
glDisable(GL_FOG);
}

if ((active && !DrawGLScene())){
done=TRUE;
}else{
SwapBuffers(hDC);
}

if (keys[VK_ESCAPE]){
keys[VK_ESCAPE] = FALSE;
gest->pausa();
}

done = gest->getFine();
}
}

delete frutta;
delete ortaggi;
delete vari;
delete gest;
delete scia;

glDisable(GL_LIGHTING);

KillGLWindow();
return (msg.wParam);
}

oregon
08-06-2014, 15:41
Controlla che done diventi effettivamente true quando termina il programma.

Manii
08-06-2014, 15:48
Trovato l'errore!! All'inizio del programma, dopo aver caricato gli oggetti riproduco un video di presentazione (formato AVI). Avevo dimenticato di richiamare la funzione che chuide il file AVI :facepalm: adesso è ok, il programma si chiude :D scusate non me ne ero proprio accordo!!

oregon
08-06-2014, 15:51
:facepalm:

Loading