mirror of
https://github.com/zhenyan121/SporeBG-Conid.git
synced 2026-04-10 06:14:08 +08:00
io_context runs in a separate thread
This commit is contained in:
@@ -149,4 +149,4 @@ foreach(ASSET_FILE ${ASSET_FILES})
|
|||||||
COMMENT "Copying changed asset: ${REL_PATH}"
|
COMMENT "Copying changed asset: ${REL_PATH}"
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
@@ -1,9 +1,17 @@
|
|||||||
#include "NetworkManager.h"
|
#include "NetworkManager.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
NetworkManager::NetworkManager()
|
||||||
|
: m_workguard(asio::make_work_guard(m_ioContext))
|
||||||
|
{
|
||||||
|
std::cout << "NetworkManager constructor called\n";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
NetworkManager::~NetworkManager() {
|
NetworkManager::~NetworkManager() {
|
||||||
|
m_ioContext.stop();
|
||||||
|
if (m_ioThread.joinable()) {
|
||||||
|
m_ioThread.join();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkManager::init(NetType type) {
|
void NetworkManager::init(NetType type) {
|
||||||
@@ -12,9 +20,13 @@ void NetworkManager::init(NetType type) {
|
|||||||
m_gameServer = std::make_shared<GameServer>(m_ioContext);
|
m_gameServer = std::make_shared<GameServer>(m_ioContext);
|
||||||
//std::cout << "try to start server\n";
|
//std::cout << "try to start server\n";
|
||||||
startServer();
|
startServer();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_client = std::make_shared<Client>(m_ioContext);
|
m_client = std::make_shared<Client>(m_ioContext);
|
||||||
|
startClient();
|
||||||
|
std::cout << "client started\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -50,7 +62,7 @@ void NetworkManager::startServer() {
|
|||||||
m_gameServer->startServer(52025);
|
m_gameServer->startServer(52025);
|
||||||
|
|
||||||
std::cout << "start server success\n";
|
std::cout << "start server success\n";
|
||||||
m_ioContext.run();
|
//m_ioContext.run();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +81,23 @@ void NetworkManager::startClient() {
|
|||||||
}
|
}
|
||||||
if (m_netType == NetType::CLIENT) {
|
if (m_netType == NetType::CLIENT) {
|
||||||
m_client->connect("127.0.0.1", 52025, false);
|
m_client->connect("127.0.0.1", 52025, false);
|
||||||
m_ioContext.run();
|
//m_ioContext.run();
|
||||||
}
|
}
|
||||||
|
std::cout << "start client success\n";
|
||||||
|
startIOContextLoop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetworkManager::startIOContextLoop() {
|
||||||
|
|
||||||
|
m_ioThread = std::thread([this]() {
|
||||||
|
try {
|
||||||
|
size_t handlers_run = m_ioContext.run(); // 记录处理了多少个handler
|
||||||
|
std::cout << "io_context.run() exit, handlers run: "
|
||||||
|
<< handlers_run << " " << std::endl;
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
std::cerr << "io_context.run() exception: " << e.what() << std::endl;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
std::cout << "IO context loop started on thread: "
|
||||||
|
<< m_ioThread.joinable() << std::endl;
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
class NetworkManager {
|
class NetworkManager {
|
||||||
public:
|
public:
|
||||||
NetworkManager() = default;
|
NetworkManager();
|
||||||
|
|
||||||
|
|
||||||
~NetworkManager();
|
~NetworkManager();
|
||||||
@@ -16,17 +16,22 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// 一定要在最前面
|
||||||
|
asio::io_context m_ioContext;
|
||||||
//asio::ip::tcp::acceptor m_acceptor;
|
//asio::ip::tcp::acceptor m_acceptor;
|
||||||
|
|
||||||
std::shared_ptr<GameServer> m_gameServer = nullptr;
|
std::shared_ptr<GameServer> m_gameServer = nullptr;
|
||||||
std::shared_ptr<Client> m_client = nullptr;
|
std::shared_ptr<Client> m_client = nullptr;
|
||||||
NetType m_netType;
|
NetType m_netType;
|
||||||
|
// work_guard 防止 io_context 在没有任务时退出
|
||||||
|
asio::executor_work_guard<
|
||||||
|
asio::io_context::executor_type> m_workguard;
|
||||||
std::thread m_ioThread;
|
std::thread m_ioThread;
|
||||||
|
|
||||||
asio::io_context m_ioContext;
|
|
||||||
void startServer();
|
void startServer();
|
||||||
|
|
||||||
void startClient();
|
void startClient();
|
||||||
|
|
||||||
|
void startIOContextLoop();
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user