我无法找到如何在C ++中使用单独的线程运行方法(使用Visual C ++ 2008),我已经尝试了很多方法来实现这一点,但到目前为止它们都没有成功。
我是C ++的新手,但是在Java中是一位经验丰富的程序员,但我们已经完成了修复旧C ++应用程序中的一些错误的任务。该程序使用一个名为“Mpeg”的对象来控制分组和解包Mpeg文件。正确设置Mpeg对象后,需要调用mpeg.Depacketise,然后运行DepacketiseInputFile()方法。
我试图通过使用_beginthread和System :: Threading :: Thread对象使用
使DepacketiseInputFile()在一个单独的线程中运行Thread^ th = gcnew Thread(gcnew ThreadStart(DepacketiseInputFile));
但是这会返回错误
使用& Mpeg :: Depacketise给出错误
使用_beginthread时我尝试的代码是
然而,有了这个,我一直很难让正确的参数,像
这样的错误出现。
有没有任何简单的方法可以让任何人都能推荐?我花了几天时间玩这个但似乎无处可去:(
非常感谢任何帮助。
干杯。
答案 0 :(得分:1)
更改
_beginthread(DepacketiseInputFile(), (unsigned)0, (void *)NULL);
到
_beginthread(DepacketiseInputFile, (unsigned)0, (void *)NULL);
你想传递要运行的函数的地址(DepacketiseInputFile
)而不是它的返回值(这是你从DepacketiseInputFile()
得到的)。
我假设DepacketiseInputFile
被声明为void DepacketiseInputFile(void*)
,并且不是某个类的非静态成员函数。否则,即使删除括号,类型也不会匹配。
答案 1 :(得分:1)
Mpeg是什么类型的?什么样的方法是DepacketiseInputFile?
如果它是一个普通的非托管C ++类,那么使用_beginthread,但你必须使DepacketiseInputFile成为静态的。它不能成员函数。
另外,不要使用DepacketiseInputFile()调用DepacketiseInputFile,并使用
传递它 &Mpeg::DepacketiseInputFile
你应该使用void *来传递它来传递一个指向Mpeg对象的指针(然后再将其强制转换)。
如果你想使用ThreadStart,那么Mpeg需要是一个托管类。
编辑:如果你想制作DepacketiseInputFile,但它需要访问该对象,那么你可以使用void *参数传入一个指针。
所以在.h:
void DepacketiseInputFileMember();
static void DepacketiseInputFile(void *thisObj);
你的代码进入DepacketiseInputFileMember(),并像这样编写DepacketiseInputFile:
void Mpeg::DepacketiseInputFile(void *thisObj)
{
Mpeg* mpeg = reinterpret_cast<Mpeg*>(thisObj);
mpeg->DepacketiseInputFileMember();
}
当您调用_beginthread时,请使用此
_beginnthread(&Mpeg::DepacketiseInputFile, (unsigned)0, anMpegObjectPointer);
其中anMpegObjectPointer
是指向Mpeg类型对象的指针。您必须确保对象的生命周期比线程中所需的生命周期长。
原谅我的语法,我在textarea中写这个,而不是Visual Studio