Re: iThread + Tk

[email protected] (Aashish Chaudhary)
Newsgroups perl.ithreads
Message-ID <[email protected]>
Hi all, 

Now I was able to make the same error in the small Perl + Perl/Tk code. 

if I dont do detach here 
   my $thr = threads->new(\&run)->detach;
then this program will eat memory and as I used it here I got this error 
  Free to wrong pool 1c7a920 not 224f08 at  .../Tk/Widget.pm line 98
during global destruction.

What I am doing wrong and what does this error means ?? 

Any help is appreciated. 

Thanks, 
aashish




    #!/usr/bin/perl -w
        
    #// warning: this app kills the cpu somewhat dead, needs a more
    #// sensitive sleep in mainloop handle with care on slow machines,
threads-> yield
    #// makes it a bit lighter but still, use caution
    
    use strict;
    use Tk;
    use threads;
    use threads::shared;
    use POSIX;
    
    #// For debugging 
    $|=1;
    
    #// Constructing a new window
    my $mw = new MainWindow('title'=>"Tiitel");    
    my $clockdisplay = $mw->Label;
    $clockdisplay->pack('-side'=>'top');
    
    #// For changing the clock value ;-)
    my $clockstr : shared ;
    $clockstr = 0; 
    
    #// indicates when to stop
    my $running : shared = 1;
    
    #// starting the other thread which should change our title       
    clocker();
    predixLoop();
    
    #// This loops the tk events and refreshes the window inner things
like buttons etc.
    #// it blocks until the window is closed    
    #// program ending ;0
    #$running = 0;        
    #// SUBS    
    #// the main thread loop tries to handle event, DoOneEvent(2) means that 
    #// any action should be takin (from tcl.h) TCL_DONT_WAIT 
    #// or smth like that , exits the same way as Tk::MainLoop
    
    sub predixLoop {        
            my $oldclockval = "0";
            while(Tk::MainWindow->Count) {
                    Tk->DoOneEvent(2);              
                    # nice                     
                    if ($clockstr != $oldclockval) {
                            $oldclockval = $clockstr;
                            $clockdisplay->configure('-text'=>$oldclockval);
                    }                    
                    threads->yield();
            }
    }
    
    # the child thread running loop
    # updates the clock after every 1 sec
    sub clocker {
            print "clocker starting \n";    
            if($running)
            {
                    print " I am running: \n";
                    $running = 0;                                            
                    my $thr = threads->new(\&run)->detach;
                    print  " After the thread is created: \n";
            }
            print "child out \n";
    }
    
    sub run
    {
        my $count = 0;
        while($count ne 10){            
            print " The count is: ".($count)."\n";
            $clockstr = time();
            $count = $count + 1;
            sleep(1);
            threads->yield();            
        }        
        print " This thread will exit: \n";
        lock $running;
        $running = 1;        
    }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.