一根线程, 需要一个全局函数名或是静态方法(其实就是个全局函数), 容易出错。另外过于底层的线程间通信必将掺和其中。
基于任务的线程对象的组成,可以从方面来看:线程对象的线程管理,线程对象的消息列队, 可参考ace的上层实现。
线程管理可以在线程对象内部, 也可在外部, 但是外部比较好。 例如:
class Task_Base
{
public:
int active(); // 创建一个线程
static int run(); //线程静态方法
virtual int svc() = 0; // run 中调用
private:
HANDLE thr_handle_;
//or
//Thread_Manager *thr_manager_;
};
class Task : public Task_Base
{
public:
virtual int svc() = 0; // run 中调用
};
消息列队 把过于底层的线程间通信进行封装, 把散乱的通信数据封装成数据包, 即认为。
class Message_Data
{
public:
.... //数据操作
private:
char *base_;
};
class Message_Queue
{
public:
int putq(Message_Data *); //
Message_Data * getq(); // data_ 为空时阻塞。
public:
HANDLE event_;
std::queue<Message_Data *> data_;
};
现在可以构造基于任务的线程
class Task_Base
{
public:
int active(); // 创建一个线程
static int run(); //线程静态方法
virtual int svc() = 0; // run 中调用
vitual int putq(Message_Data*);
vitual int getq(Message_Data *);
private:
Message_Queue message_;
HANDLE thr_handle_;
};
class Task : public Task_Base
{
public:
virtual int svc()
{
while (getq())
{
// 查询有没有任务, 有即处理, 没有阻塞。
}
}
};
int main(int argc, char *argv[])
{
Task *task = new Task;
Message_Data data;
task->putq(&data);
}