Esempio n. 1
0
        private static void ThreadProc()
        {
            //初始化子线程
            int stockNum = CONFIG.STOCK_TRADE_THREAD_NUM;

            DateTime lastmessage = DateTime.Now;

            List <Task> TradeThreads = new List <Task>();

            log.LogEvent("股票交易控制子线程启动: 初始化交易线程数 :" + stockNum.ToString());

            //启动心跳和交易线程
            Task.Factory.StartNew(() => HeartBeatThreadProc((object)stockNum));
            for (int i = 0; i < stockNum; i++)
            {
                TradeParaPackage tpp = new TradeParaPackage();
                tpp._threadNo = (i);
                object para = (object)tpp;
                TradeThreads.Add(Task.Factory.StartNew(() => StockTradeSubThreadProc(para)));
            }

            //此时按照配置,共初始化CONFIG.STOCK_TRADE_THREAD_NUM 数量交易线程
            // 交易线程按照方法 StockTradeSubThreadProc 执行

            //Loop 完成对于子线程的监控
            //每一秒钟执行一次自检
            //自检包含任务:
            //  1. 对每个线程,判断当前交易执行时间,超过 CONFIG.STOCK_TRADE_OVERTIME 仍未收到返回将会按照 该参数备注执行
            //  2. 判断当前线程空闲状态,整理可用线程列表
            //  3. 若当前存在可用线程,同时消息队列(queue_prdTrade_SH_tradeMonitor,queue_prdTrade_SZ_tradeMonitor)
            //      也包含新的消息送达,则安排线程处理交易
            //  4. 记录每个交易线程目前处理的交易内容,并写入数据库
            while (true)
            {
                Thread.Sleep(1);
                String logword = String.Empty;

                //获取下一笔交易
                List <TradeOrderStruct> next_trade = new List <TradeOrderStruct>();
                if (QUEUE_SH_TRADE.GetQueueNumber() > 0)
                {
                    lock (QUEUE_SH_TRADE.GetQueue().SyncRoot)
                    {
                        if (QUEUE_SH_TRADE.GetQueue().Count > 0)
                        {
                            next_trade = (List <TradeOrderStruct>)QUEUE_SH_TRADE.GetQueue().Dequeue();
                        }
                        if (next_trade.Count > 0)
                        {
                            log.LogEvent("上海交易所出队交易数量:" + next_trade.Count.ToString());
                        }
                    }
                }
                else if (QUEUE_SZ_TRADE.GetQueueNumber() > 0)
                {
                    lock (QUEUE_SZ_TRADE.GetQueue().SyncRoot)
                    {
                        if (QUEUE_SZ_TRADE.GetQueue().Count > 0)
                        {
                            next_trade = (List <TradeOrderStruct>)QUEUE_SZ_TRADE.GetQueue().Dequeue();
                        }

                        log.LogEvent("深圳交易所出队交易数量:" + next_trade.Count.ToString());
                    }
                }


                if (next_trade.Count == 0)
                {
                    if ((DateTime.Now - GlobalHeartBeat.GetGlobalTime()).TotalMinutes > 10)
                    {
                        log.LogEvent("本模块供血不足,线程即将死亡");
                        KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_STOCK_TRADE_MONITOR", (object)false);
                        queue_system_status.GetQueue().Enqueue((object)message1);
                        break;
                    }

                    if (lastmessage.Second != DateTime.Now.Second)
                    {
                        KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_STOCK_TRADE_MONITOR", (object)true);
                        try
                        {
                            queue_system_status.GetQueue().Enqueue((object)message1);
                            lastmessage = DateTime.Now;
                        }
                        catch
                        {
                            //do nothing
                        }
                    }

                    continue;
                }
                else
                {
                    //此时内存中包含了即将被进行的交易

                    //按照15个一组分割交易
                    List <TradeOrderStruct> tradeGroup = new List <TradeOrderStruct>();
                    foreach (TradeOrderStruct trade in next_trade)
                    {
                        if (tradeGroup.Count < 15)
                        {
                            tradeGroup.Add(trade);

                            if (tradeGroup.Count == 15)
                            {
                                //判断空闲的线程
                                //利用随机选择,保证线程的平均使用
                                String para = JsonConvert.SerializeObject(tradeGroup);
                                ThreadPool.QueueUserWorkItem(new WaitCallback(ChooseThread), (object)para);
                                logword += " 发送交易: " + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString() + "\r\n";
                                tradeGroup.Clear();
                            }
                        }
                    }
                    if (tradeGroup.Count > 0)
                    {
                        //判断空闲的线程
                        //利用随机选择,保证线程的平均使用
                        String para = JsonConvert.SerializeObject(tradeGroup);
                        ThreadPool.QueueUserWorkItem(new WaitCallback(ChooseThread), (object)para);
                        logword += " 发送交易: " + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString() + "\r\n";
                        tradeGroup.Clear();
                    }

                    GlobalTestLog.LogInstance.LogEvent(logword);
                }
            }

            Thread.CurrentThread.Abort();
        }