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

Benoit Minisini gambas at ...1...
Mon Dec 1 14:23:41 CET 2008


On lundi 1 décembre 2008, Demosthenes Koptsis wrote:
> On Sun, Nov 30, 2008 at 11:27 PM, Benoit Minisini
>
> <gambas at ...1...> wrote:
> > 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.
>
> I checked the var which holds the number of playing song by PRINT it
> and is correct.
>
> > Next, the event loop is only run if no code is run, or if you call the
> > WAIT instruction.
>
> That means, i cant get results from a running process with
> Process_Read when i run code in a do...loop?
>
> If this is true i cant run simultaneously processes and loop code!
>

The processes will run independantly of your code, but you can't run 
Process_Read and your own code at the same moment. You must return to the 
event loop, or use the WAIT instruction to let Process_Read be called.

-- 
Benoit Minisini




More information about the User mailing list