This commit is contained in:
anwinged 2012-04-18 09:15:37 +00:00
parent 5f7360267a
commit ebdd8275a6
5 changed files with 138 additions and 27 deletions

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import wx import wx
import wx.gizmos
import wx.propgrid as wxpg import wx.propgrid as wxpg
ID_TEST = wx.NewId() ID_TEST = wx.NewId()
@ -25,9 +26,12 @@ class MainFrame (wx.Frame):
bSizer4 = wx.BoxSizer(wx.VERTICAL) bSizer4 = wx.BoxSizer(wx.VERTICAL)
self.m_user_models = wx.TreeCtrl(self, self.m_user_models = wx.gizmos.TreeListCtrl(self,
style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT | wx.TR_EDIT_LABELS) style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT | wx.TR_EDIT_LABELS)
self.m_user_models.SetMinSize(wx.Size(-1,200)) self.m_user_models.SetMinSize(wx.Size(-1,200))
self.m_user_models.AddColumn("Model name")
self.m_user_models.AddColumn("Status")
self.m_user_models.AddColumn("Progress")
bSizer4.Add(self.m_user_models, 0, wx.ALL|wx.EXPAND, 1) bSizer4.Add(self.m_user_models, 0, wx.ALL|wx.EXPAND, 1)
@ -38,8 +42,8 @@ class MainFrame (wx.Frame):
bSizer3.Add(bSizer4, 1, wx.EXPAND, 5) bSizer3.Add(bSizer4, 1, wx.EXPAND, 5)
self.m_job_list = wx.ListCtrl(self, style = wx.LC_LIST) self.m_job_list = wx.ListBox(self)#, style = wx.LC_LIST)
self.m_job_list.SetMinSize(wx.Size(150,-1)) self.m_job_list.SetMinSize(wx.Size(200,-1))
bSizer3.Add(self.m_job_list, 0, wx.ALL|wx.EXPAND, 1) bSizer3.Add(self.m_job_list, 0, wx.ALL|wx.EXPAND, 1)

View File

@ -16,6 +16,10 @@ import task
import wx import wx
import wx.propgrid as wxpg import wx.propgrid as wxpg
import forms import forms
import time
import datetime
import os
import threading
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# Главная форма # Главная форма
@ -25,27 +29,71 @@ class MainFrame(forms.MainFrame):
def __init__(self): def __init__(self):
forms.MainFrame.__init__(self, None) forms.MainFrame.__init__(self, None)
s = server.LocalServer() self.server = s = server.LocalServer()
s.LoadTasksDescriptions() self.server.LoadTasksDescriptions()
ds = s.GetTasksDescriptions() ds = s.GetTasksDescriptions()
models = [] models = []
for d in ds: for d in ds:
models.extend(d.GetModelsDescriptions()) models.extend(d.GetModelsDescriptions())
model = models[0] model = models[0]
s.Start()
self.m_user_models.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.m_user_models.Bind(wx.EVT_TREE_SEL_CHANGED,
self.OnModelActivated) self.OnModelActivated)
self.m_params.Bind(wxpg.EVT_PG_CHANGING, self.m_params.Bind(wxpg.EVT_PG_CHANGING,
self.OnParamChanging) self.OnParamChanging)
self.m_params.Bind(wxpg.EVT_PG_CHANGED,
self.OnParamChanged)
self.Bind(wx.EVT_MENU, self.OnTest, id = forms.ID_TEST) self.Bind(wx.EVT_MENU, self.OnTest, id = forms.ID_TEST)
self.Bind(wx.EVT_MENU, self.OnDuplicate, id = forms.ID_DUPLICATE) self.Bind(wx.EVT_MENU, self.OnDuplicate, id = forms.ID_DUPLICATE)
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Bind(wx.EVT_IDLE, self.OnIdle)
self.m_params.AddPage('fp') self.m_params.AddPage('fp')
ov = threading.Thread(target = self.Overseer)
ov.daemon = 1
ov.start()
self.NewProject(model) self.NewProject(model)
def OnClose(self, event):
self.server.Stop()
self.Destroy()
# todo1 вменяемый цикл обхода!
def Overseer(self):
def SeeTheItem(item):
um = self.m_user_models
md = um.GetPyData(item)
print um.GetItemText(item)
job = md.job
if job:
t = os.path.basename(job.taskd.execpath)
p = job.percent * 100
print t, p
um.SetItemText(item, '{}: {:.2F}%'.format(t, p), 1)
child, cookie = um.GetFirstChild()
while child.IsOk():
SeeTheItem(child)
child, cookie = um.GetNextChild(child, cookie)
#try:
server = self.server
while True:
print 'cycle'
um = self.m_user_models
item = um.GetFirstVisibleItem()
SeeTheItem(item)
time.sleep(0.5)
#except:
# pass
def NewProject(self, project): def NewProject(self, project):
# 1. загрузить спецификации модели # 1. загрузить спецификации модели
# 2. создать одну модель по умолчанию # 2. создать одну модель по умолчанию
@ -54,10 +102,33 @@ class MainFrame(forms.MainFrame):
root = um.AddRoot('') root = um.AddRoot('')
data = task.DataDefinition(model) data = task.DataDefinition(model)
child = um.AppendItem(root, u'Обычная') child = um.AppendItem(root, 'Default')
um.SetPyData(child, data) um.SetPyData(child, data)
um.SetItemText(child, '234', 1)
def SelectUserModel(self, model_def): def SelectUserModel(self, model_def):
def SelectProperty(param_type):
"""
По указанному имени типа возвращает "свойство" для списка "свойств"
Смотри руководство пользователя для того, чтобы получить полную
информацию о всех типах данных, используемых в Opal.
"""
if param_type == 'bool':
return wxpg.BoolProperty
elif param_type == 'int':
return wxpg.IntProperty
elif param_type == 'float' or param_type == 'double':
return wxpg.FloatProperty
elif param_type == 'string':
return wxpg.StringProperty
elif param_type == 'list':
return wxpg.ArrayStringProperty
else:
# очень плохо, если это произошло
raise KeyError()
msg = model_def.PackParams() msg = model_def.PackParams()
pg = self.m_params pg = self.m_params
pg.ClearPage(0) pg.ClearPage(0)
@ -65,26 +136,43 @@ class MainFrame(forms.MainFrame):
for k, v in model_def.params.iteritems(): for k, v in model_def.params.iteritems():
p = model_def.DD[k] p = model_def.DD[k]
title = p.GetTitle() or k title = p.GetTitle() or k
pid = pg.Append(wxpg.StringProperty(title, value=str(v))) prop = SelectProperty(p.GetType())
pid = pg.Append(prop(title, value = v))
pg.SetPropertyClientData(pid, k) pg.SetPropertyClientData(pid, k)
pg.SetPropertyHelpString(pid, p.GetComment()) pg.SetPropertyHelpString(pid, p.GetComment())
pd = model_def.PackParams()
self.SetStatusText(pd, 0)
def OnModelActivated(self, event): def OnModelActivated(self, event):
item = event.GetItem() item = event.GetItem()
data = self.m_user_models.GetPyData(item) data = self.m_user_models.GetPyData(item)
if data:
self.SelectUserModel(data) self.SelectUserModel(data)
def OnParamChanging(self, event): def OnParamChanging(self, event):
value = event.GetValue() #value = event.GetValue()
print repr(value) #print repr(value)
#wx.MessageBox(value, 'changing') #wx.MessageBox(value, 'changing')
#event.Veto() #event.Veto()
pass
def OnParamChanged(self, event):
prop = event.GetProperty()
if not prop:
return
value = prop.GetValue()
param = prop.GetClientData()
um = self.m_user_models
id = um.GetSelection()
md = um.GetItemPyData(id)
md[param] = value
def OnTest(self, event): def OnTest(self, event):
um = self.m_user_models um = self.m_user_models
id = um.GetSelection() id = um.GetSelection()
md = um.GetItemPyData(id) md = um.GetItemPyData(id)
wx.MessageBox(md.PackParams()) #wx.MessageBox(md.PackParams())
md.Flush() md.Flush()
#wx.MessageBox('test') #wx.MessageBox('test')
@ -97,7 +185,18 @@ class MainFrame(forms.MainFrame):
child = um.AppendItem(parent, title + ' Copy') child = um.AppendItem(parent, title + ' Copy')
um.SetPyData(child, md.Copy()) um.SetPyData(child, md.Copy())
def OnIdle(self, event):
## server = self.server
## self.m_job_list.Freeze()
## self.m_job_list.Clear()
## with server.queue_lock:
## for j in server.jobs_queue:
## t = os.path.dirname(j.taskd.execpath)
## p = j.percent * 100.0
## self.m_job_list.Append('{}: {:.2}%'.format(t, p))
## self.m_job_list.Thaw()
pass
#time.sleep(1)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# Приложение # Приложение

View File

@ -18,6 +18,7 @@ import time
import datetime import datetime
import threading import threading
import subprocess import subprocess
import logging
import task import task
@ -42,11 +43,10 @@ class LocalServer:
""" """
def __init__(self): def __init__(self):
self.max_workers = 2 self.max_workers = 2
self.task_descrs = [] self.task_descrs = []
self.jobs_queue = [] self.jobs_queue = []
self.log = None self.log = None
self.running = False
self.queue_lock = threading.Lock() self.queue_lock = threading.Lock()
# init actions # init actions
@ -54,11 +54,8 @@ class LocalServer:
self.log = open('log.txt', 'w') self.log = open('log.txt', 'w')
self.WriteToLog('local server initialized') self.WriteToLog('local server initialized')
for i in xrange(2):
worker = Worker(self.jobs_queue, self.queue_lock)
worker.start()
def Close(self): def Close(self):
self.Stop()
self.WriteToLog('local server closed\n') self.WriteToLog('local server closed\n')
def __del__(self): def __del__(self):
@ -71,10 +68,13 @@ class LocalServer:
print msg print msg
def Start(self): def Start(self):
pass self.running = True
for i in xrange(self.max_workers):
worker = Worker(self.jobs_queue, self.queue_lock, self.running)
worker.start()
def Stop(self): def Stop(self):
pass self.running = False
def TestTaskData(self, data): def TestTaskData(self, data):
pass pass
@ -133,10 +133,11 @@ class LocalServer:
class Worker(threading.Thread): class Worker(threading.Thread):
number = 0 number = 0
def __init__(self, queue, lock): def __init__(self, queue, lock, runflag):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.queue = queue self.queue = queue
self.lock = lock self.lock = lock
self.runflag = runflag
self.daemon = True self.daemon = True
WriteToLog('worker started') WriteToLog('worker started')
self.id = Worker.number self.id = Worker.number
@ -154,13 +155,15 @@ class Worker(threading.Thread):
# и, если нашли, приступаем к выполнению # и, если нашли, приступаем к выполнению
if job: if job:
WriteToLog("{} started!".format(self.id)) WriteToLog("{} started!".format(self.id))
job.Start() job.Start(self.runflag)
WriteToLog("{} finished!".format(self.id)) WriteToLog("{} finished!".format(self.id))
else: else:
time.sleep(1) time.sleep(1)
def run(self): def run(self):
while True: while True:
if not self.runflag:
return
self.Cycle() self.Cycle()
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
@ -170,6 +173,7 @@ JOB_BUSY = 1
JOB_RUNNING = 2 JOB_RUNNING = 2
JOB_STOPPED = 3 JOB_STOPPED = 3
JOB_COMPLETED = 4 JOB_COMPLETED = 4
JOB_DROPPED = 5
class Job: class Job:
def __init__(self, taskd, datadump): def __init__(self, taskd, datadump):
@ -204,7 +208,7 @@ class Job:
self.comment = data.get('comment', '') self.comment = data.get('comment', '')
def Start(self): def Start(self, runflag):
try: try:
self.state = JOB_RUNNING self.state = JOB_RUNNING
execpath = self.taskd.execpath execpath = self.taskd.execpath
@ -223,6 +227,10 @@ class Job:
msg = ostream.readline() msg = ostream.readline()
#msg = msg.strip() #msg = msg.strip()
self.ProcessMsg(msg) self.ProcessMsg(msg)
if not runflag:
self.Stop()
# todo вписать исключения, которые относятся к JSON & dict
except Exception, e: except Exception, e:
#WriteToLog('Income msg failed: ' + str(e)) #WriteToLog('Income msg failed: ' + str(e))
pass pass

View File

@ -15,7 +15,7 @@
"params": { "params": {
"r": { "r": {
"type": "double", "type": "float",
"default": 6.28, "default": 6.28,
"title": "Right edge", "title": "Right edge",
"comment": "Right edge" "comment": "Right edge"

View File

@ -81,7 +81,7 @@ def main():
res.append([l, y]) res.append([l, y])
write(answer(round(l / r, 2))) write(answer(round(l / r, 2)))
l += h l += h
time.sleep(0.5) time.sleep(0.2)
write(result(res)) write(result(res))