diff --git a/src/calibre/gui2/dialogs/config.py b/src/calibre/gui2/dialogs/config.py
index c4e673c8b8..e328ce641d 100644
--- a/src/calibre/gui2/dialogs/config.py
+++ b/src/calibre/gui2/dialogs/config.py
@@ -6,7 +6,7 @@ from PyQt4.QtGui import QDialog, QMessageBox, QListWidgetItem, QIcon, \
QDesktopServices, QVBoxLayout, QLabel, QPlainTextEdit
from PyQt4.QtCore import SIGNAL, QTimer, Qt, QSize, QVariant, QUrl
-from calibre import islinux
+from calibre.constants import islinux, iswindows
from calibre.gui2.dialogs.config_ui import Ui_Dialog
from calibre.gui2 import qstring_to_unicode, choose_dir, error_dialog, config, \
warning_dialog, ALL_COLUMNS
@@ -116,6 +116,10 @@ class ConfigDialog(QDialog, Ui_Dialog):
self.systray_icon.setChecked(config['systray_icon'])
self.sync_news.setChecked(config['upload_news_to_device'])
self.delete_news.setChecked(config['delete_news_from_library_on_upload'])
+ p = {'normal':0, 'high':1, 'low':2}[prefs['worker_process_priority']]
+ self.priority.setCurrentIndex(p)
+ self.priority.setVisible(iswindows)
+ self.priority_label.setVisible(iswindows)
def up_column(self):
idx = self.columns.currentRow()
@@ -212,6 +216,8 @@ class ConfigDialog(QDialog, Ui_Dialog):
config['confirm_delete'] = bool(self.confirm_delete.isChecked())
pattern = self.filename_pattern.commit()
prefs['filename_pattern'] = pattern
+ p = {0:'normal', 1:'high', 2:'low'}[self.priority.currentIndex()]
+ prefs['worker_process_priority'] = p
prefs['read_file_metadata'] = bool(self.pdf_metadata.isChecked())
config['save_to_disk_single_format'] = BOOK_EXTENSIONS[self.single_format.currentIndex()]
config['cover_flow_queue_length'] = self.cover_browse.value()
diff --git a/src/calibre/gui2/dialogs/config.ui b/src/calibre/gui2/dialogs/config.ui
index 776855fa7c..55c52a5fd3 100644
--- a/src/calibre/gui2/dialogs/config.ui
+++ b/src/calibre/gui2/dialogs/config.ui
@@ -231,6 +231,35 @@
+ -
+
+
-
+
+ Normal
+
+
+ -
+
+ High
+
+
+ -
+
+ Low
+
+
+
+
+ -
+
+
+ Job &priority:
+
+
+ priority
+
+
+
-
diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py
index 0b84568a9f..fbc9ba3d9b 100644
--- a/src/calibre/parallel.py
+++ b/src/calibre/parallel.py
@@ -32,6 +32,7 @@ from math import ceil
from calibre.ptempfile import PersistentTemporaryFile
from calibre import iswindows, detect_ncpus, isosx
+from calibre.utils.config import prefs
DEBUG = False
@@ -223,6 +224,8 @@ class WorkerMother(object):
return child
def spawn_free_spirit_windows(self, arg, type='free_spirit'):
+ priority = {'high':win32process.HIGH_PRIORITY_CLASS, 'normal':win32process.NORMAL_PRIORITY_CLASS,
+ 'low':win32process.IDLE_PRIORITY_CLASS}[prefs['worker_process_priority']]
fd, name = tempfile.mkstemp('.log', 'calibre_'+type+'_')
handle = msvcrt.get_osfhandle(fd)
si = win32process.STARTUPINFO()
@@ -236,7 +239,7 @@ class WorkerMother(object):
None, # processAttributes
None, # threadAttributes
1, # bInheritHandles
- win32process.CREATE_NO_WINDOW, # Dont want ugly console popping up
+ win32process.CREATE_NO_WINDOW|priority, # Dont want ugly console popping up
self.get_env(), # New environment
None, # Current directory
si
diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py
index 1327fd415c..59db9f38e1 100644
--- a/src/calibre/utils/config.py
+++ b/src/calibre/utils/config.py
@@ -536,6 +536,8 @@ def _prefs():
help=_('The default output format for ebook conversions.'))
c.add_opt('read_file_metadata', default=True,
help=_('Read metadata from files'))
+ c.add_opt('worker_process_priority', default='normal',
+ help=_('The priority of worker processes'))
c.add_opt('migrated', default=False, help='For Internal use. Don\'t modify.')
return c