1

我很难找出如何在 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 时,我尝试的代码是

但是,有了这个,我一直无法正确地论证,出现错误,例如

突然出现。

有没有任何人可以推荐的简单方法来做到这一点?我花了几天时间玩这个,但似乎无处可去:(

任何帮助将不胜感激。

干杯。

4

2 回答 2

1

改变

_beginthread(DepacketiseInputFile(), (unsigned)0, (void *)NULL);

_beginthread(DepacketiseInputFile, (unsigned)0, (void *)NULL);

您想将函数的地址传递给运行 ( DepacketiseInputFile),而不是传递该函数的返回值(这是您从中得到的DepacketiseInputFile())。

我假设DepacketiseInputFile被声明为void DepacketiseInputFile(void*),并且不是某个类的非静态成员函数。否则,即使您删除了括号,类型也不会匹配。

于 2011-10-17T14:43:35.860 回答
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 类型对象的指针。您必须确保对象的生命周期长于线程所需的生命周期。

原谅我的语法,我是在文本区域而不是 Visual Studio 中编写的

于 2011-10-17T14:44:21.883 回答