From 8578b9bcd15f2f63d2179afe45c5d46cab3eccb2 Mon Sep 17 00:00:00 2001 From: cncfanatics Date: Tue, 21 Sep 2010 15:55:38 +0200 Subject: [PATCH] Add a worker thread for search and use it to run search requests --- gui/marketBrowser.py | 14 +++------- service/market.py | 64 ++++++++++++++++++++++++++++++++------------ 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 0fbe30737..9d5e92b93 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -53,7 +53,6 @@ class MarketBrowser(wx.Panel): self.search.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, self.scheduleSearch) self.search.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, self.clearSearch) self.search.Bind(wx.EVT_TEXT, self.scheduleSearch) - self.Bind(wx.EVT_TIMER, self.startSearch) #Helper vars for search: INIT EM ALREADY self.searching = False @@ -224,10 +223,6 @@ class MarketBrowser(wx.Panel): self.selectionMade(event) def scheduleSearch(self, event): - self.searchTimer.Stop() - self.searchTimer.Start(100, wx.TIMER_ONE_SHOT) - - def startSearch(self, event): search = self.search.GetLineText(0) if len(search) < 3: self.clearSearch(event, False) @@ -238,10 +233,9 @@ class MarketBrowser(wx.Panel): for name in ("normal", "faction", "complex", "officer"): getattr(self, name).SetValue(True) cMarket.activateMetaGroup(name) - self.searching = True - self.searchResults = cMarket.searchItems(search) - self.filteredSearchAdd() + self.searching = True + cMarket.searchItems(search, self.filteredSearchAdd) def clearSearch(self, event, clear=True): self.itemImageList.RemoveAll() @@ -261,7 +255,7 @@ class MarketBrowser(wx.Panel): self.searching = False - def filteredSearchAdd(self): + def filteredSearchAdd(self, searchResults): self.itemView.DeleteAllItems() self.itemImageList.RemoveAll() @@ -269,7 +263,7 @@ class MarketBrowser(wx.Panel): idGroupMap = {} usedMetas = set() cMarket = service.Market.getInstance() - for id, name, group, metaGroupID, iconFile in self.searchResults: + for id, name, group, metaGroupID, iconFile in searchResults: usedMetas.add(metaGroupID) if cMarket.isMetaIdActive(metaGroupID): iconId = self.addItemViewImage(iconFile) diff --git a/service/market.py b/service/market.py index e95479919..faee39f40 100644 --- a/service/market.py +++ b/service/market.py @@ -66,6 +66,41 @@ class PriceWorkerThread(threading.Thread): self.cv.release() return scheduled +class SearchWorkerThread(threading.Thread): + def run(self): + self.cv = threading.Condition() + self.searchRequest = None + self.processSearches() + + def processSearches(self): + cv = self.cv + + while True: + cv.acquire() + while self.searchRequest is None: + cv.wait() + + request, callback = self.searchRequest + self.searchRequest = None + cv.release() + filter = (eos.types.Category.name.in_(Market.SEARCH_CATEGORIES), eos.types.Item.published == True) + results = eos.db.searchItems(request, where=filter, + join=(eos.types.Item.group, eos.types.Group.category), + eager=("icon", "group.category")) + + items = [] + for item in results: + if item.category.name in Market.SEARCH_CATEGORIES: + items.append((item.ID, item.name, item.group.name, item.metaGroup.ID if item.metaGroup else 1, item.icon.iconFile if item.icon else "")) + + wx.CallAfter(callback, items) + + def scheduleSearch(self, text, callback): + self.cv.acquire() + self.searchRequest = (text, callback) + self.cv.notify() + self.cv.release() + class Market(): instance = None FORCED_SHIPS = ("Freki", "Mimir", "Utu", "Adrestia", "Ibis", "Impairor", "Velator", "Reaper") @@ -86,9 +121,14 @@ class Market(): def __init__(self): self.activeMetas = set() self.priceCache = {} - self.workerThread = PriceWorkerThread() - self.workerThread.daemon = True - self.workerThread.start() + + self.priceWorkerThread = PriceWorkerThread() + self.priceWorkerThread.daemon = True + self.priceWorkerThread.start() + + self.searchWorkerThread = SearchWorkerThread() + self.searchWorkerThread.daemon = True + self.searchWorkerThread.start() def getChildren(self, id): """ @@ -133,18 +173,8 @@ class Market(): return ships - def searchItems(self, name): - filter = (eos.types.Category.name.in_(self.SEARCH_CATEGORIES), eos.types.Item.published == True) - results = eos.db.searchItems(name, where=filter, - join=(eos.types.Item.group, eos.types.Group.category), - eager=("icon", "group.category")) - - items = [] - for item in results: - if item.category.name in self.SEARCH_CATEGORIES: - items.append((item.ID, item.name, item.group.name, item.metaGroup.ID if item.metaGroup else 1, item.icon.iconFile if item.icon else "")) - - return items + def searchItems(self, name, callback): + self.searchWorkerThread.scheduleSearch(name, callback) def searchFits(self, name): results = eos.db.searchFits(name) @@ -229,7 +259,7 @@ class Market(): self.priceCache[typeID] = price all.append(price) - if not price.isValid and not self.workerThread.isScheduled(price): + if not price.isValid and not self.priceWorkerThread.isScheduled(price): fetch.add(price) def dbAdd(): @@ -242,4 +272,4 @@ class Market(): wx.CallAfter(callback, all) wx.CallAfter(dbAdd) - self.workerThread.trigger(fetch, cb) + self.priceWorkerThread.trigger(fetch, cb)