httplib, threading, wx app freezing after 4 hours

Nick Vatamaniuc vatamane at gmail.com
Sat Jul 22 18:08:33 EDT 2006


Mark,

httplib will block waiting for a server connection. I am not sure if
that is your problem but you could try a quick and dirty workaround of
recording a timestamp of the last data transfer and then have a timer
in a separate thread and if too much time passed, restart the retrieval
thread and issue a warning.  Also check the memory on your machine in
case some buffer fills the memory up and the machine gets stuck.
To understand what's really happening try to debug the program. Try
Winpdb debugger you can find it here:
http://www.digitalpeers.com/pythondebugger/
Nick Vatamaniuc

Mark rainess wrote:
> The program displays images from a motion jpeg webcam.
> (Motion jpeg is a bastardization of multi-part mime.)
> <http://wp.netscape.com/assist/net_sites/pushpull.html>
>
> It runs perfectly for about 4 hours, then freezes.
> I'm stuck. How do I debug this?
>
> (Using: Python 2.4.3, wxPython 2.6.3.2, Windows 2000 and XP)
>
> There are no tracebacks, the gui continues to run,
> isAlive() and activeCount() indicate that the thread is OK,
> "print I'm alive" stops. CPU % usage is 0
>
> I figure it is hanging in r.readline() or f.read()
>
> Can anyone suggest techniques to help me learn what is going on.
>
> I'm using httplib.HTTP instead of httplib.HTTPConnection because
> I don't find that HTTPConnection has readline().
>
>
> Mark Rainess
>
>
> =========================================================
> class mjpeg_get(threading.Thread):
>      def run(self):
>          while 1:
>              while 1:
>                  # print I'm connecting
>                  h = httplib.HTTP(self.url)
>                  h.putrequest('GET','VIDEO.CGI')
>                  h.putheader('Accept','text/html')
>                  h.endheaders()
>                  if errcode == 200:
>                      f = h.getfile()
>                      break
>                  # cleanup and try again
>
>              s = cStringIO()
>              while 1:
>                  # print I'm alive
>                  try:
>                      # do f.readline() to get headers
>                      # get count from 'Content-length:'
>                      s.reset()
>                      s.write(f.read(count))
>                      s.truncate()
>                      wx.CallAfter(self.window.onUpdateImg, s)
>                      continue
>                  except:
>                      # print error
>                      # cleanup and try again
>                      break
>
> class Frame(wx.Frame):
>      def OnIdle(self, event):
>          # for debugging display result of
>          # Thread.isAlive()
>          # threading.activeCount()
>          if self.gotImage is True:
>              # do display self.sImage
>              self.gotImage = False
>      def onUpdateImg(self, parm):
>          if self.gotImage is False:
>              self.sImage.reset()
>              self.sImage.write(parm.getvalue())
>              self.sImage.truncate()
>              self.sImage.reset()
>              self.gotImage = True
> =========================================================




More information about the Python-list mailing list