Put cache refilling on separate thread

Lookout for memory leaks
This commit is contained in:
BasioMeusPuga
2018-03-16 20:19:35 +05:30
parent 03b683e05d
commit e8e3b81871
2 changed files with 60 additions and 20 deletions

View File

@@ -19,7 +19,7 @@
import os import os
import pathlib import pathlib
from multiprocessing.dummy import Pool from multiprocessing.dummy import Pool
from PyQt5 import QtCore from PyQt5 import QtCore, QtGui
from lector import sorter from lector import sorter
from lector import database from lector import database
@@ -119,3 +119,47 @@ class BackGroundBookSearch(QtCore.QThread):
initiate_threads() initiate_threads()
print(len(self.valid_files), 'books found') print(len(self.valid_files), 'books found')
class BackGroundCacheRefill(QtCore.QThread):
def __init__(self, image_cache, remove_value, filetype, book, all_pages, parent=None):
super(BackGroundCacheRefill, self).__init__(parent)
self.image_cache = image_cache
self.remove_value = remove_value
self.filetype = filetype
self.book = book
self.all_pages = all_pages
def run(self):
def load_page(current_page):
image_pixmap = QtGui.QPixmap()
if self.filetype in ('cbz', 'cbr'):
page_data = self.book.read(current_page)
image_pixmap.loadFromData(page_data)
elif self.filetype == 'pdf':
page_data = self.book.page(current_page)
page_qimage = page_data.renderToImage(350, 350)
image_pixmap.convertFromImage(page_qimage)
return image_pixmap
remove_index = self.image_cache.index(self.remove_value)
if remove_index == 1:
first_path = self.image_cache[0][0]
self.image_cache.pop(3)
previous_page = self.all_pages[self.all_pages.index(first_path) - 1]
refill_pixmap = load_page(previous_page)
self.image_cache.insert(0, (previous_page, refill_pixmap))
else:
self.image_cache[0] = self.image_cache[1]
self.image_cache.pop(1)
try:
last_page = self.image_cache[2][0]
next_page = self.all_pages[self.all_pages.index(last_page) + 1]
refill_pixmap = load_page(next_page)
self.image_cache.append((next_page, refill_pixmap))
except (IndexError, TypeError):
self.image_cache.append(None)

View File

@@ -31,8 +31,9 @@ import popplerqt5
from rarfile import rarfile from rarfile import rarfile
from lector.models import BookmarkProxyModel from lector.models import BookmarkProxyModel
from lector.sorter import resize_image
from lector.delegates import BookmarkDelegate from lector.delegates import BookmarkDelegate
from lector.threaded import BackGroundCacheRefill
from lector.sorter import resize_image
class Tab(QtWidgets.QWidget): class Tab(QtWidgets.QWidget):
@@ -137,6 +138,8 @@ class Tab(QtWidgets.QWidget):
self.horzLayout.addWidget(self.contentView) self.horzLayout.addWidget(self.contentView)
self.horzLayout.addWidget(self.dockWidget) self.horzLayout.addWidget(self.dockWidget)
title = self.metadata['title'] title = self.metadata['title']
if self.are_we_doing_images_only:
title = os.path.basename(title)
self.parent.addTab(self, title) self.parent.addTab(self, title)
# Hide mouse cursor timer # Hide mouse cursor timer
@@ -480,6 +483,8 @@ class PliantQGraphicsView(QtWidgets.QGraphicsView):
self.image_pixmap = None self.image_pixmap = None
self.image_cache = [None for _ in range(4)] self.image_cache = [None for _ in range(4)]
self.thread = None
self.filepath = filepath self.filepath = filepath
self.filetype = os.path.splitext(self.filepath)[1][1:] self.filetype = os.path.splitext(self.filepath)[1][1:]
@@ -538,25 +543,16 @@ class PliantQGraphicsView(QtWidgets.QGraphicsView):
self.image_cache[i + 1] = None self.image_cache[i + 1] = None
def refill_cache(remove_value): def refill_cache(remove_value):
remove_index = self.image_cache.index(remove_value) # Do NOT put a parent in here or the mother of all
# memory leaks will result
self.thread = BackGroundCacheRefill(
self.image_cache, remove_value,
self.filetype, self.book, all_pages)
self.thread.finished.connect(overwrite_cache)
self.thread.start()
if remove_index == 1: def overwrite_cache():
first_path = self.image_cache[0][0] self.image_cache = self.thread.image_cache
self.image_cache.pop(3)
previous_page = all_pages[all_pages.index(first_path) - 1]
refill_pixmap = load_page(previous_page)
self.image_cache.insert(0, (previous_page, refill_pixmap))
else:
self.image_cache[0] = self.image_cache[1]
self.image_cache.pop(1)
try:
last_page = self.image_cache[2][0]
next_page = all_pages[all_pages.index(last_page) + 1]
refill_pixmap = load_page(next_page)
self.image_cache.append((next_page, refill_pixmap))
except (IndexError, TypeError):
self.image_cache.append(None)
def check_cache(current_page): def check_cache(current_page):
for i in self.image_cache: for i in self.image_cache: