日期:2014-05-19  浏览次数:21038 次

一个关于实时计费的算法问题!!!!有过经验的请指点一下!!

<换个标题我再问!!!>
小弟正在做一个系统,其中包含一个类如下:
class   学生
{
          string   学号;
          string     费用;
       
          public   void   计费(学号,费用)
          {
                  费用减去某值;
                  Thread.sleep(一定时间间隔);      
          }
}

程序在一定的条件下要创建一个学生的实例,传递学号和他的费用,要求按某时间间隔前去一定的费用,这个容易实现,new   Thread(new   ThreadStart(计费));就可以了吧,可是,如果我在另外一种情况下,需要再此传人这个学生的学号,根据该学号中止对这位同学的计费过程,我要如何抓到这个线程呢?

我是这样想的,定义包含一个静态ArrayList(或者数组)的类,每当我发生计费情况时,我先把学号加进这个列表中(Add),发生取消计费情况时,从列表中删除该学号,然后Studentx.计费()方法中,我加上一条对这个ArrayList的扫描,如果还在,那我计费继续,如果该学号被删除,就跳出while{}.


我自己觉得这个算法有问题,就是我有三中语句在访问这个ArrayList:Add()   remove()计费()
如果需要计费的学生很多,需要很多线程,同时又有很多add()和remove(),即使加了共享锁和互斥锁,我还是担心系统会有问题,同时我决定这个算法也不高效,不知道各位平时是怎么解决这种监控问题的???拜请指教!!!!!!!



------解决方案--------------------
这不是上网卡计费一样的吗?
这可以用事件消息吧.给每一个学生对象定义一个处理消息的事件方法,系统每隔一段时间给所有当前学生对象发送消息.
public void OnTime()
{
//计费(学号,费用)
}

主程序中
public delegate void OnTimeEvent();

OnTimeEvent onTimeEvent += student.OnTime();

当然对于事件引发的问题还的另外修改代码
------解决方案--------------------
为啥非要用多线程呢?记录开始和结束的事件不就好了?需要的时候调用一个方法进行计费。效率会高一点吧。
另外,楼主的问题我也想问啊,就是捕捉线程的问题。
------解决方案--------------------
lz设计有问题,计费应该是一个单独线程定期对列表里所有学生进行计费,而不是每个学生开一个线程。
------解决方案--------------------
不是同时就不能一个线程处理了?
晕啊
------解决方案--------------------
支持一下,肯定不需要用多线程。

需要监视的学生放到一个LIST里面,定时扣钱就是了。