Hi Rob,
Thanks for the explanation.  Now that you mentioned it I recall reading somewhere OEM versus NEM.  Guess I forgot about that.  Thats what I get for using old code without deeper reading.
Thanks again.

On 7/31/07, Robert May <robertemay@users.sourceforge.net> wrote:
On 31/07/07, Brian Fredette <bfredette@gmail.com> wrote:
> I found the threads example posted in this group and began playing around.
> I've modified the code to add a splash screen using Win32::GUI:SplashScreen,
> a timer taken from Tutorial_Part4_timer.pl, a statusbar, and a notifyicon.
> For some reason the timer never gets fired.  I've tried removing the
> splashscreen and threads but it still won't fire.  The tutorial works ...
> why doesn't this:

If you've already gone to the trouble of removing the SplashScreen
code and the threads code and seen that the problem still exists, why
not post that short code, rather than making us wade through lots of
unnecessary stuff?

[snip very long code]

I can reduce your problem to this:

#!/perl -w
use strict;
use warnings;

use Win32::GUI();

my $win = new Win32::GUI::Window(
   -name     => 'winMain',
   -size     => [700, 500],
   -onResize => \&resizeWin,
$win->AddTimer('T1', 1000);


sub resizeWin {
   print "Resize Event seen\n";

sub T1_Timer {
print "Timer went off!\n";

and it stems from the fact that you are mixing the 'Old Event Model'
(OEM) with the 'New Event Model' (NEM).

The Old Event Model is the one that calls subs by a name composed of
the name of the object and the name of the event ( e.g. in your example

The New Event Model is the one that calls a sub that you specify using
a -onXXX option to the constructor (e.g. in your example -onResize =>

For (I think) performance reasons, when you specify a NEM event
handler using an -onXXX option in the constructor, then the OEM method
of working is switched off - hence in your example the T1_Timer() sub
is never called (btw in your example the _Maximize, _Minimize, _Resize
and _Terminate handlers are never called either)

There are 3 ways to fix this.

(1) Only use OEM event handlers: remove the -onResize option, and
rename resizeWin() as winMain_Resize() (you'll need to remove the
winMain_Resize you already have defined)

(2) Use only NEM event handlers: add an -onTimer =>
\&some_timer_hander line to the main window constructor, and rename
the T1_Timer() sub some_timer_handler()

(3) Leave it all as it is, and add an -eventmodel => 'both' line to
the main window constructor.   This is not the preferred solution, as
it is very easy to get confused and have 2 handlers for the same event
- for example if you did this to your code, you would have 2 handlers
for the Resize event (resizeWin() and winMain_Resize()) - as it
happens, the NEM handler would get called first, and because it
doesn't return 0, the OEM handler would get called afterwards.   If
the NEM handler returned 0, the OEM handler wouldn't get called ...
see how this gets confusing ...