一个线程运行的类需要继承NLMISC::IRunnable,看起来像这样:
class CTaskThread : public NLMISC::IRunnable
{
void run()
{
while(true)
{
NLMISC::nlSleep(0);
}
}
};
run()是必须重新实现的接口,是线程实际执行的内容。
启动这个线程也很简单:
IThread *thread = IThread::create (new CTaskThread);
thread->start ();
通常,一个线程的执行需要某些参数,或者与外部交换数据,比如经典的生产者->消费者模型。
参数的传入可以给这个类增加一个初始化函数:
bool CMysqlRunCallback::init( const std::string &hostName, const std::string &userName, const std::string &password, const std::string &defaultDatabase)
{
_runCallbackThread.connectDB(hostName,userName,password,defaultDatabase);
_thread = NLMISC::IThread::create (&_runCallbackThread);
_thread->start ();
return true;
}
而交换数据可使用 CBufFIFORing 或 CBufFIFO2 :
class RunCallbackThread : public NLMISC::IRunnable
{
public:
bool pushEvent( CQueryEvent* sql_event ) { return _SQLQueryPool.push_back(sql_event); }
CQueryEvent* getSQLReturn() { return _SQLReturnPool.pop_front(); }
private:
NLMISC::CBufFIFORing<CQueryEvent> _SQLQueryPool;
NLMISC::CBufFIFORing<CQueryEvent> _SQLReturnPool;
void run ();
};