コード例 #1
0
        private LogWirter sublog = new LogWirter(); //子线程日志记录

        public void Main()
        {
            //初始化消息队列
            queue_future_excuteThread.Init();

            FutureTrade.InitRespFunc();

            //创建线程任务
            Thread FutureTradeControl = new Thread(new ThreadStart(ThreadProc));

            //启动主线程
            FutureTradeControl.Start();

            //日志初始化
            log.EventSourceName = "期货交易线程控制模块";
            log.EventLogType    = System.Diagnostics.EventLogEntryType.Information;
            log.EventLogID      = 62308;

            sublog.EventSourceName = "期货交易线程模块";
            sublog.EventLogType    = System.Diagnostics.EventLogEntryType.Information;
            sublog.EventLogID      = 62309;
        }
コード例 #2
0
        private void ThreadProc()
        {
            //初始化子线程
            int futureNum = CONFIG.FUTURE_TRADE_THREAD_NUM;

            DateTime lastmessage = DateTime.Now;

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

            log.LogEvent("期货交易控制子线程启动: 初始化交易线程数 :" + futureNum.ToString());

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

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

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

                if ((DateTime.Now - GlobalHeartBeat.GetGlobalTime()).TotalMinutes > 10)
                {
                    log.LogEvent("本模块供血不足,线程即将死亡");
                    break;
                }

                //获取下一笔交易
                List <TradeOrderStruct> next_trade = new List <TradeOrderStruct>();

                if (lastmessage.Second != DateTime.Now.Second)
                {
                    KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_FUTURE_TRADE_MONITOR", (object)true);
                    queue_system_status.GetQueue().Enqueue((object)message1);
                    lastmessage = DateTime.Now;
                }

                if (QUEUE_FUTURE_TRADE.GetQueueNumber() > 0)
                {
                    lock (QUEUE_FUTURE_TRADE.GetQueue().SyncRoot)
                    {
                        if (QUEUE_FUTURE_TRADE.GetQueue().Count > 0)
                        {
                            next_trade = (List <TradeOrderStruct>)QUEUE_FUTURE_TRADE.GetQueue().Dequeue();
                        }

                        if (next_trade.Count > 0)
                        {
                            log.LogEvent("期货交易所出队交易数量:" + next_trade.Count.ToString());
                        }
                    }
                }

                if (next_trade.Count == 0)
                {
                    continue;
                }

                //此时next_trade中包含了交易参数
                //判断空闲的线程
                //利用随机选择,保证线程的平均使用


                Random ran      = new Random();
                bool   _bSearch = true;
                int    _tNo     = 0;

                //默认测试用户下,直接使用0号测试线程
                if (next_trade[0].cUser != DebugMode.TestUser)
                {
                    while (_bSearch)
                    {
                        _tNo = ran.Next(0, futureNum);
                        if (queue_future_excuteThread.GetThreadIsAvailiable(_tNo))
                        {
                            _bSearch = false;
                        }
                    }
                }

                log.LogEvent("安排线程 : " + _tNo + " 执行交易 数量: " + next_trade.Count);

                //选择第 _tNo 个线程执行交易
                queue_future_excuteThread.GetQueue(_tNo).Enqueue((object)next_trade);
                queue_future_excuteThread.SetThreadBusy(_tNo);


                //************************************
                //将交易发送到相应执行线程后需要做的事情
                //************************************
            }
            Thread.CurrentThread.Abort();
        }
コード例 #3
0
ファイル: FutureMonitor.cs プロジェクト: botvs/MoneyFramework
        private void ThreadProc() {

            //初始化子线程
            int futureNum = CONFIG.FUTURE_TRADE_THREAD_NUM;

            DateTime lastmessage = DateTime.Now;

            List<Task> TradeThreads = new List<Task>();
            log.LogEvent("期货交易控制子线程启动: 初始化交易线程数 :" + futureNum.ToString());

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

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

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

                if ((DateTime.Now - GlobalHeartBeat.GetGlobalTime()).TotalMinutes > 10)
                {
                    log.LogEvent("本模块供血不足,线程即将死亡");
                    break;
                }

                //获取下一笔交易
                List<TradeOrderStruct> next_trade = new List<TradeOrderStruct>();

                if (lastmessage.Second != DateTime.Now.Second)
                {
                    KeyValuePair<string, object> message1 = new KeyValuePair<string, object>("THREAD_FUTURE_TRADE_MONITOR", (object)true);
                    queue_system_status.GetQueue().Enqueue((object)message1);
                    lastmessage = DateTime.Now;
                }

                if (QUEUE_FUTURE_TRADE.GetQueueNumber() > 0)
                {
                    lock (QUEUE_FUTURE_TRADE.GetQueue().SyncRoot)
                    {
                        if (QUEUE_FUTURE_TRADE.GetQueue().Count > 0)
                        {
                            next_trade = (List<TradeOrderStruct>)QUEUE_FUTURE_TRADE.GetQueue().Dequeue();
                        }

                        if (next_trade.Count > 0) { log.LogEvent("期货交易所出队交易数量:" + next_trade.Count.ToString()); }
                    }
                }

                if (next_trade.Count == 0) continue;

                //此时next_trade中包含了交易参数
                //判断空闲的线程
                //利用随机选择,保证线程的平均使用

                
                Random ran = new Random();
                bool _bSearch = true;
                int _tNo = 0;

                //默认测试用户下,直接使用0号测试线程
                if (next_trade[0].cUser != DebugMode.TestUser)
                {
                    while (_bSearch)
                    {
                        _tNo = ran.Next(0, futureNum);
                        if (queue_future_excuteThread.GetThreadIsAvailiable(_tNo)) { _bSearch = false; }
                    }
                }

                log.LogEvent("安排线程 : " + _tNo + " 执行交易 数量: " + next_trade.Count);

                //选择第 _tNo 个线程执行交易
                queue_future_excuteThread.GetQueue(_tNo).Enqueue((object)next_trade);
                queue_future_excuteThread.SetThreadBusy(_tNo);


                //************************************
                //将交易发送到相应执行线程后需要做的事情
                //************************************


            }
            Thread.CurrentThread.Abort();
        }