package main; use threads; use threads::shared; use warnings; # Create shared variables my $DB_finished_flag : shared = 0; my $DB_request_flag : shared = 0; # Create database worker thread my $DB_Thread = threads->create( \&worker_DB ); $DB_Thread->detach(); # Tk Codeausschnitt sub createMainWindow() { ... # [makeDBthr] Button my $makeDBthr_bttn = $button_frm1->Button( -text => "makeDBthr", -state => 'active', -command => sub { # only start once return if $DB_request_flag; \&process_DB_request(); } ... $mw->MainLoop(); } sub process_DB_request { $DB_request_flag = 1; &check_status_1(); } sub check_status_1 { $mw->after( 500, sub { if ( $DB_finished_flag == 1 ) { $DB_finished_flag = 0; $DB_request_flag = 0; print "DB_request finished\n"; } else { &check_status_2; print "DB_request processing\n"; } } ); } sub check_status_2 { $mw->after( 500, sub { &check_status_1; } ); } sub worker_DB() { while (1) { sleep 0.5; if ( $DB_request_flag == 1 ) { print "begin worker_DB\n"; db_access::openDB( Globals::getDB_PATH() ); $DB_finished_flag = 1; } else { #print "waiting for DB_request\n"; } } } package db_access; sub openDB() { $DriverType = "Microsoft Access Driver (*.mdb)"; $DSN = "Win32 ODBC --MAOmaoMAOmaoMAO--"; $Dir = shift; # Parameter print("\ndb_access::open ".Globals::getDB_PATH()."\n"); Win32::ODBC::ConfigDSN(ODBC_ADD_DSN, $DriverType,("DSN=$DSN", "Description=MAO Win32 ODBC Test DSN for Perl", "DBQ=$Dir", "DEFAULTDIR=$Dir", "UID=", "PWD=")) or die "ConfigDSN(): Could not add temporary DSN" . Win32::ODBC::Error(); $db=new Win32::ODBC($DSN) or die "couldn't ODBC $DSN because ", Win32::ODBC::Error(), "\n"; return $db; }