У меня проблема с моим сервером.
Сервер падает, когда я хочу выполнить задачу в ThreadPool.
Вот часть функции, где используется пул потоков:
void CSConnection::onReadable(const AutoPtr<ReadableNotification>& pNf)
{
try
{
int n = _socket.receiveBytes(_pBuffer, BUFFER_SIZE);
if (n > 0)
{
//app.logger().information("Packet s " + nb.format(nBytes) + ", group : " + nb.format(_pBuffer[4]) + ", type : " + nb.format(_pBuffer[6]));
unsigned short packetID;
packetID = (_pBuffer[4] * 666) + _pBuffer[6];
switch(packetID)
{
case 666:
{
QuitHandler* qh = new QuitHandler();
qh->_con = this;
WorkerThreadPool::getInstance().tp->start(*qh);
Когда выполняется случай 666, сервер падает.
(Только в этом случае используйте пул потоков для тестов)
Есть класс WorkerThreadPool:
using Poco::ThreadPool;
class WorkerThreadPool
{
private:
WorkerThreadPool()
{
tp = new ThreadPool();
}
~WorkerThreadPool()
{
tp->joinAll();
delete tp;
}
public:
ThreadPool * tp;
static WorkerThreadPool& getInstance()
{
static WorkerThreadPool instance;
return instance;
}
};
Есть класс QuitHandler:
using Poco::Runnable;class QuitHandler : public Runnable
{
public:
QuitHandler(){}
CSConnection * _con;
void run();
virtual ~QuitHandler();
protected:
private:
char * _packet;
};
И запустить определение:
void QuitHandler::run()
{
Application &app = Application::instance();
app.logger().information("quith");
unsigned short len = 9;
char * reply = new char[len]();
///build packet header
//set len (it's short)
reply[0] = len & 0xff;
reply[1] = (len >> 8) & 0xff;
reply[4] = 3; //group
reply[6] = 100; //type
///body
//empty
_con->sendBlocking(reply, len);
delete [] reply;
}
Сбой приложения перед журналом «app.logger (). Information (» quith «);».
Благодарю.
Задача ещё не решена.
Других решений пока нет …