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_SEARCH_BTN, self.scheduleSearch)
|
||||||
self.search.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, self.clearSearch)
|
self.search.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, self.clearSearch)
|
||||||
self.search.Bind(wx.EVT_TEXT, self.scheduleSearch)
|
self.search.Bind(wx.EVT_TEXT, self.scheduleSearch)
|
||||||
self.Bind(wx.EVT_TIMER, self.startSearch)
|
|
||||||
|
|
||||||
#Helper vars for search: INIT EM ALREADY
|
#Helper vars for search: INIT EM ALREADY
|
||||||
self.searching = False
|
self.searching = False
|
||||||
@@ -224,10 +223,6 @@ class MarketBrowser(wx.Panel):
|
|||||||
self.selectionMade(event)
|
self.selectionMade(event)
|
||||||
|
|
||||||
def scheduleSearch(self, 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)
|
search = self.search.GetLineText(0)
|
||||||
if len(search) < 3:
|
if len(search) < 3:
|
||||||
self.clearSearch(event, False)
|
self.clearSearch(event, False)
|
||||||
@@ -238,10 +233,9 @@ class MarketBrowser(wx.Panel):
|
|||||||
for name in ("normal", "faction", "complex", "officer"):
|
for name in ("normal", "faction", "complex", "officer"):
|
||||||
getattr(self, name).SetValue(True)
|
getattr(self, name).SetValue(True)
|
||||||
cMarket.activateMetaGroup(name)
|
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):
|
def clearSearch(self, event, clear=True):
|
||||||
self.itemImageList.RemoveAll()
|
self.itemImageList.RemoveAll()
|
||||||
@@ -261,7 +255,7 @@ class MarketBrowser(wx.Panel):
|
|||||||
|
|
||||||
self.searching = False
|
self.searching = False
|
||||||
|
|
||||||
def filteredSearchAdd(self):
|
def filteredSearchAdd(self, searchResults):
|
||||||
self.itemView.DeleteAllItems()
|
self.itemView.DeleteAllItems()
|
||||||
self.itemImageList.RemoveAll()
|
self.itemImageList.RemoveAll()
|
||||||
|
|
||||||
@@ -269,7 +263,7 @@ class MarketBrowser(wx.Panel):
|
|||||||
idGroupMap = {}
|
idGroupMap = {}
|
||||||
usedMetas = set()
|
usedMetas = set()
|
||||||
cMarket = service.Market.getInstance()
|
cMarket = service.Market.getInstance()
|
||||||
for id, name, group, metaGroupID, iconFile in self.searchResults:
|
for id, name, group, metaGroupID, iconFile in searchResults:
|
||||||
usedMetas.add(metaGroupID)
|
usedMetas.add(metaGroupID)
|
||||||
if cMarket.isMetaIdActive(metaGroupID):
|
if cMarket.isMetaIdActive(metaGroupID):
|
||||||
iconId = self.addItemViewImage(iconFile)
|
iconId = self.addItemViewImage(iconFile)
|
||||||
|
|||||||
@@ -66,6 +66,41 @@ class PriceWorkerThread(threading.Thread):
|
|||||||
self.cv.release()
|
self.cv.release()
|
||||||
return scheduled
|
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():
|
class Market():
|
||||||
instance = None
|
instance = None
|
||||||
FORCED_SHIPS = ("Freki", "Mimir", "Utu", "Adrestia", "Ibis", "Impairor", "Velator", "Reaper")
|
FORCED_SHIPS = ("Freki", "Mimir", "Utu", "Adrestia", "Ibis", "Impairor", "Velator", "Reaper")
|
||||||
@@ -86,9 +121,14 @@ class Market():
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.activeMetas = set()
|
self.activeMetas = set()
|
||||||
self.priceCache = {}
|
self.priceCache = {}
|
||||||
self.workerThread = PriceWorkerThread()
|
|
||||||
self.workerThread.daemon = True
|
self.priceWorkerThread = PriceWorkerThread()
|
||||||
self.workerThread.start()
|
self.priceWorkerThread.daemon = True
|
||||||
|
self.priceWorkerThread.start()
|
||||||
|
|
||||||
|
self.searchWorkerThread = SearchWorkerThread()
|
||||||
|
self.searchWorkerThread.daemon = True
|
||||||
|
self.searchWorkerThread.start()
|
||||||
|
|
||||||
def getChildren(self, id):
|
def getChildren(self, id):
|
||||||
"""
|
"""
|
||||||
@@ -133,18 +173,8 @@ class Market():
|
|||||||
|
|
||||||
return ships
|
return ships
|
||||||
|
|
||||||
def searchItems(self, name):
|
def searchItems(self, name, callback):
|
||||||
filter = (eos.types.Category.name.in_(self.SEARCH_CATEGORIES), eos.types.Item.published == True)
|
self.searchWorkerThread.scheduleSearch(name, callback)
|
||||||
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 searchFits(self, name):
|
def searchFits(self, name):
|
||||||
results = eos.db.searchFits(name)
|
results = eos.db.searchFits(name)
|
||||||
@@ -229,7 +259,7 @@ class Market():
|
|||||||
self.priceCache[typeID] = price
|
self.priceCache[typeID] = price
|
||||||
|
|
||||||
all.append(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)
|
fetch.add(price)
|
||||||
|
|
||||||
def dbAdd():
|
def dbAdd():
|
||||||
@@ -242,4 +272,4 @@ class Market():
|
|||||||
wx.CallAfter(callback, all)
|
wx.CallAfter(callback, all)
|
||||||
wx.CallAfter(dbAdd)
|
wx.CallAfter(dbAdd)
|
||||||
|
|
||||||
self.workerThread.trigger(fetch, cb)
|
self.priceWorkerThread.trigger(fetch, cb)
|
||||||
|
|||||||
Reference in New Issue
Block a user