void run () {
			while (!queue.empty()) {
				std::shared_ptr<Runnable*> runnable = queue.wait_and_pop();
				Runnable *executable =*runnable.get();
				std::thread t1(&Runnable::operator(),executable);
				threads.push_back(std::move(t1));
			}
		}
예제 #2
0
//main thread
void RealTimeDataProcessor::AppendRealTimeData(TickWrapper& info){
	//(in)front-------------back(out)
	// if m_strategy == nullptr, that means RealTimeDataProcessor is in data-recording mode
	if (m_strategy){
#ifdef UseKDataToInvoke
		bool triggered = m_strategy->tryInvoke(m_DataSeq, m_KDataVec, m_TickSet60, info);
#else
		bool triggered = m_strategy->tryInvoke(m_DataSeq, info);
#endif
		if (triggered){
			Order ord;
			//for now, only permit order_queue has one item.
			if (order_queue.empty() && m_strategy->generateOrder(ord)){
				order_queue.push(ord);
			}
		}
			
	}
	m_DataSeq.push_front(info);

	//construct 1-minutes k-line intermediate data
	if (m_TickSet60.empty()){
		m_TickSet60.push_back(info);
	}
	else{
		if (CommonUtils::InSameMinute(info.Time(), m_TickSet60.front().Time())){
			m_TickSet60.push_back(info);
		}
		else{ // the comming tick data is in next minutes
			KData k1m(m_TickSet60, 60);
			m_KDataVec.push_back(k1m);

			m_TickSet60.clear();
		}
	}
#ifdef SHOW_PROGRESS
	spdlog::get("console")->info() << "> Data queue size :" << m_DataSeq.size();
#endif
}