[Gambas-devel] 1.9.20 Timer Bug

Benoit Minisini gambas at ...1...
Tue Sep 13 11:51:09 CEST 2005


On Wednesday 07 September 2005 09:04, Daniel Campos wrote:
> I Benoit:
>
> I've found some strange things with the new native timer implementation:
>
> 1) I'm not sure if this first one is a bug, but if you write just a
> console program like this:
>
>
> PRIVATE hTimer AS Timer
>
> PUBLIC SUB hTimer_Timer()
>
>   PRINT "HELLO"
>
> END
>
> PUBLIC SUB Main()
>
>    hTimer=NEW Timer AS "hTimer"
>    hTimer.Delay=100
>    hTimer.Enabled=TRUE
>
> END
>
> The program just exits from the Main() function and stops. I think It
> should be alive, like if a descriptor were beeing watched, in order to
> allow console programs with timers to not finish in a loop while they're
> alive...
>
> ===========================================================================
>============
>
> 2) I think this second one is a bug, but I'm not sure if it depends on
> gb.net or the gbx2 interpreter. This little program works, with gb.net,
> as expected (it never finishes):
>
> PRIVATE hProc AS ServerSocket
>
> PUBLIC SUB Main()
>
>   hProc = NEW ServerSocket
>   hProc.Port = 30000
>   hProc.Listen()
>
> END
>
> ...But, if I add a Timer, it stops inmediatly!
>
> PRIVATE hProc AS ServerSocket
> PRIVATE hTimer AS Timer
>
> PUBLIC SUB hTimer_Timer()
>
>   PRINT "TIME"
>
> END
>
> PUBLIC SUB Main()
>
>   hTimer = NEW Timer AS "hTimer"
>   hTimer.Delay = 100
>   hTimer.Enabled = TRUE
>
>   hProc = NEW ServerSocket
>   hProc.Port = 30000
>   hProc.Listen()
>
> END
>
> Should I implement some special in the gb.net component? I suppose I
> have not to reimplement the timer hook, as I have not main loop in
> that component... However, If I use a Process with the "FOR READ" flag
> instead of a ServerSocket, the code seems to work normally while there's
> data to be read from the descriptor.
>
>
> ===========================================================================
>===========
>
> 3) More strange things :-) If I try to write a loop at the end of the
> main function so the program does not finish, the processor takes 100%
> use:
>
> PRIVATE hProc AS ServerSocket
> PRIVATE hTimer AS Timer
>
> PUBLIC SUB hTimer_Timer()
>
>   PRINT "TIME"
>
> END
>
> PUBLIC SUB Main()
>
>   hTimer = NEW Timer AS "hTimer"
>   hTimer.Delay = 100
>   hTimer.Enabled = TRUE
>
>   hProc = NEW ServerSocket
>   hProc.Port = 30000
>   hProc.Listen()
>
>   DO WHILE TRUE
>     WAIT 0.01
>   LOOP
>
> END
>
> ...It can be fixed if I use WAIT 0.1 instead of 0.01, but in that case
> the program is idle a lot of time sleeping... I'm not sure if this is
> a bug or the normal effect of looping in short intervals.
>
> ===========================================================================
>
> Anyway, there are two main problems there:
>
> 1) A program with a timer should wait until the Timer is disabled.
> 2) A program with a descriptor beeing watched (ServerSocket) works, but
> if I add a timer it just finishes...
>
>
>   I made a temporally hack in the gbx_process.c file, so it waits when
> there's a timer, and the program with the ServerSocket does not need
> the loop, but I suppose there's more work to do it in the right way:
>
> static bool do_loop(bool canBlock, struct timeval *wait)
> {
>
>         ....
>
>         if (EVENT_check_post())
> 		return FALSE;
>
> 	/* Hack */
> 	if (_timers)
> 	{
> 		if (ARRAY_count(_timers))
> 		{
> 			ret=TRUE;
> 		}
> 	}
>         /* End of hack :-) */
>
> 	return ret == 0;
> }
>
>
>
> Regards,
>
> D. Campos
>

Hi, Daniel.

Actually, the halt test of this do_loop() function was completely broken! I 
rewrote it correctly, and every bad bevahiour you noticed disappeared :-)

Now the event loop stops only if there is no active watched file descriptors, 
AND no active timers.

Regards,

-- 
Benoit Minisini
mailto:gambas at ...1...




More information about the Devel mailing list