Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re^5: Win32::GUI sending Windows messages between threads

by BrowserUk (Patriarch)
on Jan 17, 2013 at 20:07 UTC ( [id://1013876]=note: print w/replies, xml ) Need Help??


in reply to Re^4: Win32::GUI sending Windows messages between threads
in thread Win32::GUI sending Windows messages between threads [solved]

The problem is that you are tryiong to hook into a system/module defined API without understanding the rules and requirements of that API.

Each window can have multiple timers associated with it. This, when the timer triggers and it sends the WM_TIMER message, it *must* also send some additional information as a part of that message that identifies which timer routine should be invoked to handle it. This is easily demonstrated by the following modification of your code which sets up two independent timers for the main window::

#!perl use Data::Dump qw[ pp ]; use threads; use Win32::GUI qw( WM_CLOSE WM_TIMER ); #$CHILD = threads->create('child', ''); $WinMain = Win32::GUI::Window->new( -name => 'Main', -text => 'Task Test', -width => 300, -height => 200, -onTerminate => \&Main_Terminate, -onTimer => \&DoTimer, ); my $timer1 = $WinMain->AddTimer( 'Timer1', 10000 ); pp $timer1; my $timer2 = $WinMain->AddTimer( 'Timer2', 20000 ); pp $timer2; $WinMain->Show(); Win32::GUI::Dialog(); $CHILD->detach(); sub Main_Terminate { -1; } sub child { while( sleep 1 ) { Win32::GUI::PostMessage( $WinMain, WM_TIMER, 1, 'Timer1' ); } } sub DoTimer { pp \@_; print "Timer fired\n"; return 1; }

Which when run produces the following output:

C:\test>\perl32\bin\perl 1013733.pl bless({ "-handle" => 3213678, "-id" => 1, "-interval" => 10000, "-name +" => "Timer1" }, "Win32::GUI::Timer") bless({ "-handle" => 3213678, "-id" => 2, "-interval" => 20000, "-name +" => "Timer2" }, "Win32::GUI::Timer") [ bless({ # tied Win32::GUI::Window "-accel" => 0, "-handle" => 3213678, "-name" => "Main", "-timers" => { 1 => "Timer1", 2 => "Timer2" }, "-type" => 0, Timer1 => bless({ "-handle" => 3213678, "-id" => 1, "-interval" + => 10000, "-name" => "Timer1" }, "Win32::GUI::Timer"), Timer2 => bless({ "-handle" => 3213678, "-id" => 2, "-interval" + => 20000, "-name" => "Timer2" }, "Win32::GUI::Timer"), }, "Win32::GUI::Window"), "Timer1", ] Timer fired [ bless({ # tied Win32::GUI::Window "-accel" => 0, "-handle" => 3213678, "-name" => "Main", "-timers" => { 1 => "Timer1", 2 => "Timer2" }, "-type" => 0, Timer1 => bless({ "-handle" => 3213678, "-id" => 1, "-interval" + => 10000, "-name" => "Timer1" }, "Win32::GUI::Timer"), Timer2 => bless({ "-handle" => 3213678, "-id" => 2, "-interval" + => 20000, "-name" => "Timer2" }, "Win32::GUI::Timer"), }, "Win32::GUI::Window"), "Timer2", ] Timer fired [ bless({ # tied Win32::GUI::Window "-accel" => 0, "-handle" => 3213678, "-name" => "Main", "-timers" => { 1 => "Timer1", 2 => "Timer2" }, "-type" => 0, Timer1 => bless({ "-handle" => 3213678, "-id" => 1, "-interval" + => 10000, "-name" => "Timer1" }, "Win32::GUI::Timer"), Timer2 => bless({ "-handle" => 3213678, "-id" => 2, "-interval" + => 20000, "-name" => "Timer2" }, "Win32::GUI::Timer"), }, "Win32::GUI::Window"), "Timer1", ] Timer fired

That suggests the possibility that the (Win32::GUI defined) window procedure arranges for the system defined timer to include a numerical 'timer id' as a part of the WM_TIMER message. It then looks up that id in the -timers hash associated with the target window to obtain the name of the blessed timer object, and then uses that to obtain the information passed onto the -onTimer callback routine.

I've tried passing various combinations of id and name on the SendMessage WM_TIMER caller, but have yet to find the correct combination to allow me to trigger tha callback. I suspect that if you dug around in the Win32::GUI sources -- the only reliable documentation I have found for that module -- you might be able to discover the correct magic to allow you to manually trigger the callback, but sending a bare WM_TIMER will not do it. And is not intended to do so.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1013876]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (2)
As of 2024-04-20 03:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found