Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114

    [C#] Chiudere finestra di dialogo GTK#

    Ciao, ho un problema del quale non riesco a trovare la soluzione.

    Ho creato un programma C#/GTK# perfettamente funzionante, ma quando ho notato che aveva dei tempi di elaborazione piuttosto lunghi ho deciso di aggiungere una finestra di dialogo (derivata dalla classe Dialog) che avvertisse che il programma è in esecuzione. Tale finestra di dialogo ovviamente non può disporre dei normali bottoni e deve essere chiusa automaticamente dal sistema una volta terminata l'elaborazione dell'output.
    Il mio problema è proprio qui: come posso fare a far chiudere tale finestra senza che l'evento giunga dalla pressione di un bottone?

    Tra i tanti tentativi fatti ho anche provato ad assegnare alla finestra un Response e quindi chiudere la stessa (come di seguito), ma senza risultati:

    codice:
    _process.Respond(ResponseType.DeleteEvent);
    _process.DeleteEvent += delegate(object o, DeleteEventArgs e) {
    	Application.Quit();
    };
    Inoltre al momento la finestra dalla quale lancio l'elaborazione si chiude solo dopo che è stata chiusa quella di dialogo (ovviamente manualmente attraverso la "x") e non più al termine dell'elaborazione.

    Qualcuno sa aiutarmi?

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114
    Il problema è di fatto il seguente: se dopo aver inizializzato la finestra di Dialog metto Run() funziona perfettamente ma poi non ho il controllo sulla sua chiusura; altrimenti senza Run() la finestra scompare al momento giusto ma non mi mostra nulla...

    ho anche provato a far fare la finestra di Dialog ad un Thread differente ma i risultati mi vengono mostrati solo dopo che la computazione è finita (cioè vedo solo creare la Dialog ma senza contenuti)

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Non ho chiara al 100% l'architettura della tua applicazione, ad ogni modo suggerirei di utilizzare un thread esterno a cui delegare l'elaborazione, così da permettere al thread primario dell'applicazione di "respirare" e aggiornare l'interfaccia grafica.

    Prima di avviare il thread di elaborazione, visualizza la finestra di dialogo in cui con un Timer, per fare un esempio, periodicamente controlli lo stato in cui si trova il thread.

    Quando il thread è terminato e la finestra se ne accorge durante il controllo periodico, chiudi semplicemente la finestra in quanto non serve più.

    Chiaramente, queste sono solo ipotesi per rendere l'idea, ma la loro implementazione e collocazione nel programma dipendono assenzialmente dall'architettura che hai scelto di realizzare (ad esempio, non so se la finestra di dialogo deve inserirsi tra l'avvio e la visualizzazione di un'altra finestra, oppure se viene mostrata sopra, oppure se viene visualizzata all'inizio o in alternativa ogni volta che l'elaborazione deve essere effettuata).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114
    Grazie... effettivamente per aggirare il problema ho proprio fatto così, però mi sembra strano non poter aprire una finestrella di dialogo durante l'esecuzione del programma, anche prima di avviare l'iterazione (quella che si apre non mostra nessun widget ma presenta solo titolo e dimensione).

    Fortunatamente il multithreading in C# è molto semplice e quindi mi è bastato creare un Thread ed un ThreadStart il quale richiama un delegato (così da poter passare al Thread dei parametri)

    codice:
    ThreadStart ts = delegate() { metodo(parametri); };
    Thread t = new Thread(ts);
    t.Start();
    Delegando l'elaborazione ad un thread differente ho la possibilità di "giocare" con i widget GUI a mio piacimento nel thread principale.

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da battax
    Grazie... effettivamente per aggirare il problema ho proprio fatto così, però mi sembra strano non poter aprire una finestrella di dialogo durante l'esecuzione del programma, anche prima di avviare l'iterazione (quella che si apre non mostra nessun widget ma presenta solo titolo e dimensione).
    La finestra puoi crearla e mostrarla tranquillamente, ma se l'elaborazione viene eseguita nel thread primario dell'applicazione, quello che gestisce i messaggi, fino a quando l'elaborazione sarà in corso l'applicazione non potrà gestire il ridisegno dell'interfaccia grafica, apparendo quindi "bloccata" e aggiornando la visualizzazione solo al termine del processo di elaborazione, quando potrà essere nuovamente in grado di gestire i messaggi in arrivo.

    L'effetto collaterale (finestra con titolo e dimensione) che ottieni è dovuto essenzialmente a questo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114
    So di andare un po' off-topic, ma visto che ora si parla di thread, è normale che la console mostri il seguente output al termine del thread?

    codice:
    2010-12-29 13:50:21.289 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6c2af0 of class __NSFastEnumerationEnumerator autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.292 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6c2f10 of class NSObject autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.293 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6c6120 of class NSConcreteMapTable autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.293 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x68de10 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.294 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6c6330 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.294 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6c6350 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.295 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6aaeb0 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.299 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6aaef0 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.299 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6c6870 of class NSConcreteMapTable autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.300 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6a3010 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.301 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x687090 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.301 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6c2a60 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.302 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x13c8000 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.302 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x13c7710 of class NSCFArray autoreleased with no pool in place - just leaking
    2010-12-29 13:50:21.303 mono[316:61ff] *** __NSAutoreleaseNoPool(): Object 0x6a66a0 of class NSObject autoreleased with no pool in place - just leaking
    anche se il programma funziona correttamente, come si può evitare questo output?

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da battax
    anche se il programma funziona correttamente, come si può evitare questo output?
    Purtroppo non sono esperto di Mono, quindi non posso essere molto specifico.
    Hai provato con una ricerca basata sul testo dei messaggi che ottieni?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114
    Originariamente inviato da alka
    Purtroppo non sono esperto di Mono, quindi non posso essere molto specifico.
    Hai provato con una ricerca basata sul testo dei messaggi che ottieni?
    Purtroppo nemmeno io, visto che questo è il mio primo programma sia in C# che in Mono (MonoDevelop). Ho (e avevo già) provato a cercare qualcosa ma oltre a capire che si tratta del rilascio della memoria del thread (cosa anche abbastanza ovvia), non so come si possa risolvere (sempre che sia un problema effettivo)...

    comunque grazie...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.