当前位置: 首页>>代码示例>>C++>>正文


C++ Server::AsyncRunStep方法代码示例

本文整理汇总了C++中Server::AsyncRunStep方法的典型用法代码示例。如果您正苦于以下问题:C++ Server::AsyncRunStep方法的具体用法?C++ Server::AsyncRunStep怎么用?C++ Server::AsyncRunStep使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Server的用法示例。


在下文中一共展示了Server::AsyncRunStep方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: timer

void *ServerThread::run()
{
	DSTACK(FUNCTION_NAME);
	BEGIN_DEBUG_EXCEPTION_HANDLER

	f32 dedicated_server_step = g_settings->getFloat("dedicated_server_step");
	m_server->AsyncRunStep(0.1, true);

	auto time = porting::getTimeMs();
	while (!stopRequested()) {
		try {
			m_server->getEnv().getMap().getBlockCacheFlush();
			u32 time_now = porting::getTimeMs();
			{
			TimeTaker timer("Server AsyncRunStep()");
			m_server->AsyncRunStep((time_now - time)/1000.0f);
			}
			time = time_now;

			TimeTaker timer("Server Receive()");
			// Loop used only when 100% cpu load or on old slow hardware.
			// usually only one packet recieved here
			u32 end_ms = porting::getTimeMs();
			int sleep = (1000 * dedicated_server_step) - (end_ms - time_now);
			auto sleep_min = m_server->overload ? 1000 : 50;
			if (sleep < sleep_min)
				sleep = sleep_min;
			end_ms += sleep; //u32(1000 * dedicated_server_step/2);
			for (u16 i = 0; i < 1000; ++i) {
				if (!m_server->Receive(sleep)) {
					//errorstream<<"Server: Recieve nothing="  << i << " per="<<porting::getTimeMs()-(end_ms-sleep)<<" sleep="<<sleep<<std::endl;
					break;
				}
				if (i > 50 && porting::getTimeMs() > end_ms) {
					//verbosestream<<"Server: Recieve queue overloaded: processed="  << i << " per="<<porting::getTimeMs()-(end_ms-sleep)<<" sleep="<<sleep << " eventssize=" << m_server->m_con.events_size()<<std::endl;
					break;
				}
			}
			auto events = m_server->m_con.events_size();
			if (events) {
				g_profiler->add("Server: Queue", events);
			}
			if (events > 500) {
				if (!m_server->overload)
					errorstream<<"Server: Enabling overload mode queue=" << events << "\n";
				if (m_server->overload < events)
					m_server->overload = events;
			} else {
				if (m_server->overload)
					errorstream<<"Server: Disabling overload mode queue=" << events << "\n";
				m_server->overload = 0;
			}
		} catch (con::NoIncomingDataException &e) {
			//std::this_thread::sleep_for(std::chrono::milliseconds(10));
		} catch (con::PeerNotFoundException &e) {
			infostream<<"Server: PeerNotFoundException"<<std::endl;
		} catch (ClientNotFoundException &e) {
		} catch (con::ConnectionBindFailed &e) {
			m_server->setAsyncFatalError(e.what());
#if !EXEPTION_DEBUG
		} catch (LuaError &e) {
			m_server->setAsyncFatalError("Lua: " + std::string(e.what()));
		} catch (std::exception &e) {
			errorstream << m_name << ": exception: "<<e.what()<<std::endl;
		} catch (...) {
			errorstream << m_name << ": Ooops..."<<std::endl;
#endif
		}
	}

	END_DEBUG_EXCEPTION_HANDLER

	return NULL;
}
开发者ID:ChunHungLiu,项目名称:freeminer,代码行数:74,代码来源:fm_server.cpp


注:本文中的Server::AsyncRunStep方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。