在另一个线程C ++中启动一个方法

时间:2011-10-17 14:38:28

标签: multithreading winapi visual-c++ c++-cli beginthread

我无法找到如何在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时我尝试的代码是

然而,有了这个,我一直很难让正确的参数,像

这样的错误

出现。

有没有任何简单的方法可以让任何人都能推荐?我花了几天时间玩这个但似乎无处可去:(

非常感谢任何帮助。

干杯。

2 个答案:

答案 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