|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
[Visual C++] Far comparire una finestra da applicazione console è possibile?
Salve a tutti,
sto lavorando ad un progetto visual C++ 2010, a 64bit in modalità console di windows, insomma modalità testo in prompt dei comandi. Sto usando OpenGL e OpenCV per elaborare delle immagini, ma mi servirebbe far comparire un bottone nella finestra di OpenGL per chiudere tutta l'elaborazione (assocerei il button_click ad una variabile booleana per fermare un ciclo). Il problema è che OpenGL non ha una UI nativamente supportata e tutte le librerie che ho trovato in giro (compresa PUI che nel mio caso andava benissimo) sono solo x86 e quando vado a compilare, mi danno errori visto che il progetto è a 64bit. E quindi addio alle librerie gui includibili. Pertanto avevo pensato una cosa: ma posso fare apparire dal mio progetto console, oltre alla finestra opengl, una finestrella windows con un bottone "STOP" così da interrompere il tutto da lì? Visto che la mia non è un'applicazione winform, questa cosa è possibile farla senza dover cambiare tutto il progetto? Come si fa? Altrimenti non so più dove sbattere la testa... ![]() ![]() Grazie anticipatamente a tutti.
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non so dirti nello specifico di VC++, ma se segui il metodo "classico" per creare una finestra non dovresti avere problemi. Ti conviene inserire il codice in una funzione separata e richiamarla con CreateThread, così puoi gestire i messaggi del sistema senza intaccare la tua elaborazione.
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Crea un progetto winform e copia il sample che viene generato in automatico all'interno del tuo progetto, rinomina la funzione winmain, elimina i parametri (non ti serviranno) e richiamala in un nuovo thread.
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Grazie...vedrò di fare così allora...ti faccio sapere.
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
QT rilascia il codice sorgente, che quindi puoi ricompilare a 64 bits sotto VS2010.
Ovviamente qt e' richiamabile da console project, ed hai una GUI portabile su sistemi diversi. In alternativa, potresti farti un progetto GUI a parte (con qualsiasi bitness), il quale comunica con la parte console-based mediante TCP/IP socket (o qualsiasi altro modo standard preferisci)
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Ragazzi,
considerando che a me il bottone servirebbe in pratica solo per interrompere tutto il ciclo di elaborazione (passando da false a true una variabile booleana controllata da vari cicli while) su internet trovo che si possa fare anche direttamente da console, associando il cambio variabile ad un evento da tastiera. Questa cosa come si fa? Perchè in tal caso, eviterei proprio di introdurre ulteriori librerie ad appesantire il programma e farei questa cosa... Qualcuno sa aiutarmi?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non puoi semplicemente usare Ctrl+C come si fa da decenni?
![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Eh, ma come associare a Ctrl+C il fatto di cambiare una variabile booleana?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non ce ne è bisogno, la combinazione Ctrl+C sia su Windows che su Unix fa terminare il programma senza che quest'ultimo debba implementare nulla.
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Ok, però a me serve che quando questa cosa accade, i thread che ho lanciato terminano a cascata in funzione di una variabile booleana, e mi diano l'output dei loro "lavori" non che si chiuda completamente il programma.
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
In questo caso devi implementare un handler e registrarlo al sistema operativo, vedi qui:
http://www.tutorialspoint.com/cplusp...l_handling.htm http://www.cplusplus.com/forum/beginner/1501/#msg5410 |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12841
|
Quote:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx |
|
![]() |
![]() |
![]() |
#14 | ||
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
Quote:
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
||
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Ragazzi, aggiungo un post giusto per far in modo che vi venga notificato:
Ho introdotto queste modifiche nel mio codice: Codice:
#include <signal.h> bool forever = false; //questa è la funzione di handler per la combinazione void sighandler(int sig) { cout<<endl<<"Segnale n. "<<sig<<" rilevato. Terminazione programma."<<endl; //cambia il valore della variabile booleana forever = true; } ... qui ci sono le altre funzioni void, dei thread ... int main (..) { --altro codice--- signal(SIGABRT, &sighandler); signal(SIGTERM, &sighandler); signal(SIGINT, &sighandler); while (!forever) { ..... } WaitForSingleObject(handle0,INFINITE); WaitForSingleObject(handle1,INFINITE); WaitForSingleObject(handle2,INFINITE); WaitForSingleObject(handle3,INFINITE); WaitForSingleObject(handle4,INFINITE); ....output del programma... return 0; } Codice:
while (!forever) { ..... } c'è in tutti i thread, che infatti vengono avviati tutti. Il problema è che premendo "CTRL+C" il segnale viene rilevato (infatti l'output viene fuori) ma i thread non terminano. E nemmeno la parte del main vincolata a quella booleana. Sapete darmi una mano per ottenere questo risultato? Che quando quella variabile "globale" diviene true, funzioni come stop?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Devi dichiarare la variabile forever con la parola chiave "volatile" per impedire al compilatore di fare alcune ottimizzazioni che non vanno proprio d'accordo con il multithreading.
Ultima modifica di Daniels118 : 12-02-2014 alle 13:19. |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
questa cosa non la sapevo. E come si fa?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Così:
![]() UAHAHAH scusa ma non ho potuto resistere ![]() Si scrive così: volatile bool forever = false; |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
![]() come posso fare?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. Ultima modifica di DomusP45 : 12-02-2014 alle 17:30. |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
E' un po' difficile capire dove sia il problema senza vedere l'intero programma, comunque puoi fare una semplice prova, inserendo delle istruzioni di stampa:
Codice:
cout<<"Inizio loop\n"; while (!forever) { ..... cout<<(forever ? "true\n" : "false\n"); } cout<<"Fine loop\n"; |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:30.