Ok, here is how to do that , the threading communication setup
#!/usr/bin/perl --
use strict;
use warnings;
use threads;
use Thread::Queue;
my $qin = Thread::Queue->new();
my $qout = Thread::Queue->new();
my $guithread = threads->create(
sub {
require MyApp::GUI; ## MyApp/GUI.pm
MyApp::GUI::WorkQ(@_); ## uses timer to check on queue
},
$qin, $qout,
);
my $dbithread = threads->create(
sub {
require MyApp::DBFetch; ## MyApp/DBFetch.pm
MyApp::DBFetch::WorkQ(@_);
},
$qin, $qout,
);
$guithread->join; ## wait for gui to finish
__END__
Then the background worker thread waits for instructions (jobs to do from $qin), and sends messages back (on $qout)
sub MyApp::DBFetch::WorkQ {
my( $qin, $qout ) = @_;
my %stash;
while( defined( my $argRef = $qin->dequeue ) ) {
my $action = delete $argRef->{action};
if( $action eq 'connect' ){
$stash{dbi} = DBI->...;
$qout->enqueue( { status => 'you are connected' } );
}
}
}
Then the gui thread ... uses buttons to send jobs to worker thread, and sets up a timer to check for return messages from the worker thread
sub MyApp::GUI::WorkQ {
my( $qin, $qout ) = @_;
....
Glib::Timeout->add( 50, sub { CheckQ( $qout, $statuswindow} } );
Gtk2->main;
}
sub OnConnectButton {
my( $qin, $passwindow ) = @_;
my $password = $passwindow->get_text;
...
$qin->enqueue( { action => 'connect', password => $password, ... }
+ );
}
sub CheckQ {
my( $qout, $statuswindow ) = @_;
if( defined( my $ref = $qout->popnow ) ) {
my $msg = $ref->{status};
$statuswindow->set_text( $msg );
}
return 1; ## don't cancel timeout, repeat it
}
Does that make sense? There are other ways to do threading, but its more complicated :) see What is the usage of "use Gtk2 -init -threads-init"? and https://metacpan.org/source/XAOC/Gtk2-1.2494/examples/thread_usage.pl and don't ask me about it :)
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.