[Gambas-user] To fast do..loops for process management!

Benoit Minisini gambas at ...1...
Sun Nov 30 22:27:23 CET 2008


On jeudi 27 novembre 2008, Demosthenes Koptsis wrote:
> Hi dear list,
>
> I write a front-end for mpg123 mp3 console player in gambas2 but i
> came face to face with a bug and i need your help!
> i dont know if the bug is due to gambas or my writing code or mpg123
> player's.
>
> The story is like this....
>
> '### I have two public vars
>
> PUBLIC hProcess AS Process 'varProcess is a Process variable for SHELL
> command PUBLIC iNrPlayingSong AS Integer 'public var to hold the nr of
> playing song
>
> '### i execute a command to play mp3 songs
>
> .....
>     'format sting command
>     sCommand = "mpg123 -vC@ " & sPlaylistFile 'play in verbose mode
> (v), interactive (C), and load a playlist (@)
>     'execute command
>     hProcess = SHELL sCommand FOR INPUT OUTPUT
> .....
>
>
> '### previous track sub
> PUBLIC SUB btnPreviousTrack_Click()
>
>     IF NOT IsNull(hProcess) THEN
>       IF hProcess.State = 1 THEN PRINT #hProcess, "d"  'mpg123 recieve
> a keyboard "d" to go previous track
>     ENDIF
>
> END
>
>
> '### next track sub
> PUBLIC SUB btnNextTrack_Click()
>
>   IF NOT IsNull(hProcess) THEN
>     IF hProcess.State = 1 THEN PRINT #hProcess, "f"   'mpg123 recieve
> a keyboard "f" to go next track
>   ENDIF
>
> END
>
> '### NOTE, the previous SUBs are the same. They differ only to letters
> "f" and "d"
>
>
> '#### A wait sub for the system, see next!
> PUBLIC SUB WaitSystem()
>
>   'wait the system
>   FMain.Mouse = 3
>   WAIT 0.05
>   FMain.Mouse = 0
>
> END
>
>
>
> '########### So far with no bug, the code is working
>
>
>
> '### i write a sub if user click in playlist a list item = a mp3 track
>
> PUBLIC SUB lvwPlayList_DblClick()
>
>   DIM iCounter AS Integer = iNrPlayingSong 'var get current playing
> song and also act as counter. iNrPlayingSong get its value from SUB
> Process_Read()
>
>   IF NOT IsNull(lvwPlayList.Key) THEN
>
> '### This do..loop part working fine
> 	'if user click an item with key greater than number of playing song
>     IF (lvwPlayList.key + 1) > iCounter THEN 'go next track
>        DO
>           IF iCounter = (lvwPlayList.key + 1) THEN BREAK
>           'PRINT "Go next track"
>           btnNextTrack_Click()
>           INC iCounter
>        LOOP
>     ENDIF
>
> 	'if user click an item with key smaller than number of playing song
>     IF (lvwPlayList.key + 1) < iCounter THEN 'go previous track
>        DO
>           IF iCounter = (lvwPlayList.key + 1) THEN BREAK
>           'PRINT "Go previous track"
>           btnPreviousTrack_Click()
>
> 	  ' ### Now the strange bug
>           '!FIXEME!
> ###########################################################################
>######### WaitSystem() '***!!!!!***---> ### [ -- i need to force a wait
> system sub to working correctly --- ]
>           'Probably there is a bug.
> 	  'the hProcess does not recieve the btnPreviousTrack_Click() command
> as recieves btnNextTrack_Click()
>
>           'The same code in btnNextTrack_Click() works fine.
>           'Sorry for the annoying bug.
>           '!FIXEME!
> ###########################################################################
>#########
>
>           DEC iCounter
>
>        LOOP
>     ENDIF
>
>   ENDIF
>
> END
>
> '####################
>
> To test this bug make a long playlist with up to 200 mp3s.
>
> if you check the two subs btnNextTrack_Click() and
> btnPreviousTrack_Click() are the same.
> If you check the two DO..LOOPs parts are the same, they only change in
> btnNextTrack_Click() and btnPreviousTrack_Click().
> In first case the btnNextTrack_Click() works.
> In second case i need to force a wait to application to work the
> btnPreviousTrack_Click().
>
> I test to PRINT the vars which they be read from Sub Read_Process and
> they are ok. Vars iNrPlayingSong, iCounter are OK.
> My conclusion is that hProcess cannot recieve so quickly the previous
> command from gambas2.
> So the questions now!
> Is this a bug of mpg123 player or a bug of gambas in process management?
>
>
> I attach my project if you want to look its strange bug.
>
> --
>
> Γεια χαρα σε όλους!!!
>
> Regards,
>
> Demosthenes Koptsis

I don't really see any bug, but I can be wrong as your code is not very clear.

What I can tell you is that there is no guarantee that you will get the answer 
of a command sent to mpg123 immediately, so the song number stored in your 
public variable is not necessarily accurate.

Next, the event loop is only run if no code is run, or if you call the WAIT 
instruction. And the Process_Read function is called only by the event loop!

Regards,

-- 
Benoit Minisini




More information about the User mailing list