我最近开始尝试使用boost :: thread,我想实现一个数据记录器,它在一个单独的线程中定期打印一些类方法的返回值(1 / sec)。
Data类有两个私有变量dataRx和dataTx以及两个公开这些值的getter。
Data.h:
class Data
{
public:
Data();
virtual unsigned long GetDataTx();
virtual unsigned long GetDataRx();
private:
unsigned long fDataTx;
unsigned long fDataRx;
};
Data.cpp:
#include "Data.h"
Data::Data() : fDataTx(5), fDataRx(10)
{
}
unsigned long Data::GetDataTx()
{
return fDataTx;
}
unsigned long Data::GetDataRx()
{
return fDataRx;
}
主要功能:
#include <iostream>
#include <unistd.h>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include "Data.h"
using namespace std;
void Log(void *objPtr1, void *objPtr2)
{
while(1) {
cout << objPtr1->GetDataTx() << " " << objPtr2->GetDataTx() << endl;
sleep(1);
}
}
int main(int argc, char** argv)
{
Data obj1;
Data obj2;
boost::thread logThread(Log, &obj1, &obj2);
}
但是我收到了这个错误:
main.cpp: In function ‘void Log(void*, void*)’:
main.cpp:14:20: error: ‘void*’ is not a pointer-to-object type
cout << objPtr1->GetDataTx() << " " << objPtr2->GetDataTx() << endl;
^
main.cpp:14:51: error: ‘void*’ is not a pointer-to-object type
cout << objPtr1->GetDataTx() << " " << objPtr2->GetDataTx() << endl;
^
显然,这不是将指针传递给线程的正确方法。有什么建议吗?
答案 0 :(得分:1)
将指针传递给线程是正确的方法。一个问题:为什么你的日志函数会收到void
个指针,而不是Data
个指针?如果你应该使用void
指针,你应该在函数中将它们转换为Data*
。
void Log(void *objPtr1, void *objPtr2)
{
Data* ptr1 = static_cast<Data*>(objPtr1), ptr2 = static_cast<Data*>(objPtr2);
while(1) {
cout << objPtr1->GetDataTx() << " " << objPtr2->GetDataTx() << endl;
sleep(1);
}
}