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 :)