[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