Add a worker thread for search and use it to run search requests
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user