http://www.perlmonks.org?node_id=963799


in reply to Re^5: Perl/Tk code structure
in thread Perl/Tk code structure

I've been working on this project on and off based on BrowserUk's excellent advice since this thread was made, and now it's pretty much done.
One issue I have is that when the GUI window is closed, the other thread keeps running. I've hidden the console window, so the only way to close it is via the task manager. Is there a way to automatically end the other process when the GUI window is closed or crashes?

Replies are listed 'Best First'.
Re^7: Perl/Tk code structure
by BrowserUk (Patriarch) on Apr 06, 2012 at 19:54 UTC

    The simplest mechanism is to just add exit after the MainLoop(). When you exit the gui, MailLoop() returns and the program terminates with cleanup:

    sub gui { require Tk; my $mw = Tk::MainWindow->new; ... Tk::MainLoop(); exit( 0 ); ### Add this }

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

    The start of some sanity?

      That is indeed simple. Thank you!
Re^7: Perl/Tk code structure
by zentara (Archbishop) on Apr 06, 2012 at 10:50 UTC
    You might try something like this untested code. Also see controlling threads with Tk: while loop vs. signals
    # catch window close button to clean up threads $mw->protocol('WM_DELETE_WINDOW' => sub { &clean_exit }); sub clean_exit{ my @running_threads = threads->list; if (scalar(@running_threads) < 1){print "\nFinished\n";exit} else{ # $die = 1; # a shared var I usually use # to tell threads to return foreach my $thr (@running_threads){ $thr->join; } exit; } }

    I'm not really a human, but I play one on earth.
    Old Perl Programmer Haiku ................... flash japh