fix issues with media server not going away

- use a non-daemonized python thread
- shut the server down on exit, including from profile manager
- use a timeout on requests, or the connection that webengine holds open
will block the thread and prevent it from exiting when anki closes
This commit is contained in:
Damien Elmes 2017-08-08 12:55:30 +10:00
parent cfb50fa03c
commit bee6931dc9
2 changed files with 14 additions and 4 deletions

View file

@ -111,7 +111,7 @@ class AnkiQt(QMainWindow):
f.setupUi(d) f.setupUi(d)
f.login.clicked.connect(self.onOpenProfile) f.login.clicked.connect(self.onOpenProfile)
f.profiles.itemDoubleClicked.connect(self.onOpenProfile) f.profiles.itemDoubleClicked.connect(self.onOpenProfile)
f.quit.clicked.connect(lambda: sys.exit(0)) f.quit.clicked.connect(self.cleanupAndExit)
f.add.clicked.connect(self.onAddProfile) f.add.clicked.connect(self.onAddProfile)
f.rename.clicked.connect(self.onRenameProfile) f.rename.clicked.connect(self.onRenameProfile)
f.delete_2.clicked.connect(self.onRemProfile) f.delete_2.clicked.connect(self.onRemProfile)
@ -249,8 +249,12 @@ To import into a password protected profile, please open the profile before atte
if browser: if browser:
self.showProfileManager() self.showProfileManager()
else: else:
self.cleanupAndExit()
def cleanupAndExit(self):
self.errorHandler.unload() self.errorHandler.unload()
sys.exit(0) self.mediaServer.shutdown()
self.app.exit(0)
# Collection load/unload # Collection load/unload
########################################################################## ##########################################################################

View file

@ -8,6 +8,7 @@ import http.server
import socketserver import socketserver
import errno import errno
from anki.utils import devMode from anki.utils import devMode
import threading
# locate web folder in source/binary distribution # locate web folder in source/binary distribution
def _getExportFolder(): def _getExportFolder():
@ -29,7 +30,7 @@ _exportFolder = _getExportFolder()
class ThreadedHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer): class ThreadedHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
pass pass
class MediaServer(QThread): class MediaServer(threading.Thread):
def run(self): def run(self):
self.port = 10000 self.port = 10000
@ -46,8 +47,13 @@ class MediaServer(QThread):
break break
self.server.serve_forever() self.server.serve_forever()
def shutdown(self):
self.server.shutdown()
class RequestHandler(http.server.SimpleHTTPRequestHandler): class RequestHandler(http.server.SimpleHTTPRequestHandler):
timeout = 1
def do_GET(self): def do_GET(self):
f = self.send_head() f = self.send_head()
if f: if f: