Add a worker thread for search and use it to run search requests

This commit is contained in:
cncfanatics
2010-09-21 15:55:38 +02:00
parent 87c6c42013
commit 8578b9bcd1
2 changed files with 51 additions and 27 deletions

View File

@@ -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)

View File

@@ -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)