in reply to How to pass scrolled object to another thread

I would like to know if i can pass the object of scrolled widget or as a matter any hash reference to another thread in perl 5.10?

No. TK isn't thread-safe. Any attempt to call methods on an object handle from thread other than the one in which it was created will fail. Sometimes the failure will be a hard failure--trap or segfault. Sometimes it will be less immediately demonstrative, but it will cause problems. Often of a mysterious and difficult to track nature.

Rather than have this event thread update the gui directly, the correct way to do this is to pass a message from the event thread to teh gui thread and make all updates to the gui from the gui thread.


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.
  • Comment on Re: How to pass scrolled object to another thread

Replies are listed 'Best First'.
Re^2: How to pass scrolled object to another thread
by himanshujain_60 (Initiate) on Mar 19, 2011 at 06:25 UTC
    Hi,

    The Idea is the logging/status window should get update irrespective of any thing, These events happening at server are not triggered by my application and hence the update has to be asynchronous.
    How can I update the GUI then?

    Thanks,
    Jai!
      How can I update the GUI then?

      Here's one way:

      #! perl -slw use strict; use threads; use Thread::Queue; use Tk::Listbox; my $Q = new Thread::Queue; ## start a thread monitoring events async { ## Simulate asynchronous events with random sleeps while( sleep 1+rand 3 ) { ## When an event happens, Q it to the GUI thread. $Q->enqueue( "Event " . time ); } }->detach; my $mw = MainWindow->new; my $lb = $mw->Listbox()->pack; # 10 times per second my $repeat = $mw->repeat( 100 => sub { ##check to see if there are any events in the queue while( $Q->pending ) { ## if there are, grab them my $event = $Q->dequeue; ## adde them to the end of the listbox $lb->insert( 'end', $event ); ## and make sure the latest is visible. $lb->see( 'end' ); } }); $mw->MainLoop;

      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.
        Thanks a ton for your help. This solution worked.
        Jai