threading troubles
sreekant
skodela at lithium.com
Tue Jul 11 19:47:09 EDT 2006
Piet van Oostrum wrote:
>>>>>> sreekant <skodela at lithium.com> (S) wrote:
>
>> S> I decided in the end to use fork and all is well.
>
> But how are you doing the callback then? From your code it looks like the
> callback is called after the external command finishes. The callback would
> then be called in the child process, not in the parent process, I think. Or
> do you have a solution for that?
I am not calling the callback now.
It is a pygtk interface to octavia music description language I wrote. I
have a button "Play" which reads the text in the gtk.TextView , converts
it to midi and calls fluidsynth with the resulting midi file.
I want the ui to be accessible during the midi play because, the midi
play can some times be a long piece of music.
I also have a log window which is another textview. I was loading the
result of
res=os.popen3(my_command)
report=res[1].read()+'\n'+res[2].read()
logwindow gets the report added to it.
However now I just put a message saying "playing midi"
I don't know any way out at the moment.
################
What I need is when I click on the play button, the fileplay(widget)
function that gets called should be able to start a new thread or a fork
which executes the commands and updates the ui.logwindow which is a
textview with the output of os.popen3.
During the execution the ui should be usable.
Please see the scala program in this package
http://sourceforge.net/projects/octavia . Checkout fileplay() function
in the most latest version 0.22 .
I don't want to attach the whole program to this message and annoy everyone.
Below is the function causing probs.
Ta
sree
###############################
def fileplay(x):
global conf,bdir,bgplay
lbuf.delete(lbuf.get_start_iter(),lbuf.get_end_iter())
dat=buf.get_text(buf.get_start_iter(),buf.get_end_iter())
if not len(dat)>0:
return
#see if the temporary dir to save temp gmc and midi exists
#if not create it
tempf=bdir+os.sep+'temp'+os.sep
try:
if not os.path.exists(tempf):
os.mkdir(tempf)
except:
addlog(traceback.format_exc())
return
#save octavia in to a count+1 text file
if os.path.exists(tempf):
try:
fbase=tempf+getcnt()
fmidi=fbase+'.midi'
f=open(fbase,'w')
f.write(dat)
f.close()
except:
addlog(traceback.format_exc())
#run octavia
addlog("Compiling to midi")
if conf.has_key('octavia'):
text2midi=conf['octavia']
else:
addlog("Config doesn't exist. Trying default octavia")
text2midi='octavia'
try:
res=os.popen3(text2midi+' '+fbase+' '+fmidi)
addlog(res[1].read()+res[2].read())
except:
addlog(traceback.format_exc())
return
# if midi exists, we succeded. play midi
if os.path.exists(fmidi):
addlog("Trying to play midi")
if conf.has_key('midiplayer'):
midiplay=conf['midiplayer']
else:
addlog("Config doesn't exist. Trying default timidity")
midiplay='timidity'
# start playing in a fork
pid=os.fork()
if pid:
pass
else:
os.popen3(midiplay+' '+fmidi)
sys.exit(0)
More information about the Python-list
mailing list