#!perl -w
use strict;
use warnings;

use Win32::GUI ;

use threads;
use Thread::Queue;

use constant {
    WM_MYTHREADMSG => 0x0400 + 1, #WM_USER + 1
};

#Thread Queues
my $TQ = new Thread::Queue;

#Thread Globals
my $ts_winHandle : shared;
my $ts_worker_run : shared;
$ts_worker_run = 0;

#Spawn Worker
my $worker = threads->create(\&Worker);

## Main Thread / Window

my $win = new Win32::GUI::Window(
        -name   => 'win',
        -size   => [200,80],
        -pos    => [100,100],
        -caption=> 'Multi-Thread Eg. 3',
);
$ts_winHandle = $win->{-handle};

$win->AddButton(
        -name   => 'btn',
        -size   => [40,40],
        -pos    => [0,0],
        -text   => 'Run',
);

$win->Hook(WM_MYTHREADMSG, \&ThreadMsg);

$win->Show();

Win32::GUI::Dialog();

## Routines.

# Worker Thread
sub Worker{
    my $ctr = 0;
    while( $ts_worker_run != -1 ){
        if( $ts_worker_run == 1  && defined( $ts_winHandle ) ){
            $TQ->enqueue($ctr);
            Win32::GUI::SendMessage( $ts_winHandle, WM_MYTHREADMSG, 0, 0 );
            $ctr++;
        }
    }
    select( undef, undef, undef, 0.01); # dont let the worker eat ALL the CPU...
}

# Window
sub win_Terminate{
    $ts_worker_run = -1;
    return -1;
};

sub btn_Click{
    $ts_worker_run = $ts_worker_run?0:1;
    return 1;
}

#- TheadMsg Handler
sub ThreadMsg{
    my ($object, $wParam, $lParam, $type, $msgcode) = @_;
    if( $msgcode == WM_MYTHREADMSG ){
        $win->btn->Text($TQ->dequeue());
    }
    return 1;
}