1

嘿,我正在尝试在 c++/cli 中对我的程序进行多线程处理,但是在创建我使用的代码的线程时遇到了问题:

private: Void startThread() {
    MoveProj.Velocity = Variables.Velocity;
    MoveProj.ProjectilePos = Projectile1.ProjectilePos;
    Thread^ MotionThread1 = gcnew Thread(gcnew ParameterizedThreadStart(MoveProj, MotionThread::MoveProjectile));
    Thread^ MainThread = gcnew Thread(gcnew ThreadStart());
}

但我得到了错误

Error   44  error C3350: 'System::Threading::ParameterizedThreadStart' : a delegate constructor expects 2 argument(s)   c:\users\gaz\documents\visual studio 2012\projects\projectilemotion\projectilemotion\Simulation.h   344
Error   89  error C3350: 'System::Threading::ParameterizedThreadStart' : a delegate constructor expects 2 argument(s)   c:\users\gaz\documents\visual studio 2012\projects\projectilemotion\projectilemotion\Simulation.h   344
Error   45  error C3350: 'System::Threading::ThreadStart' : a delegate constructor expects 2 argument(s)    c:\users\gaz\documents\visual studio 2012\projects\projectilemotion\projectilemotion\Simulation.h   345
Error   90  error C3350: 'System::Threading::ThreadStart' : a delegate constructor expects 2 argument(s)    c:\users\gaz\documents\visual studio 2012\projects\projectilemotion\projectilemotion\Simulation.h   345
Error   43  error C3867: 'MotionThread::MoveProjectile': function call missing argument list; use '&MotionThread::MoveProjectile' to create a pointer to member c:\users\gaz\documents\visual studio 2012\projects\projectilemotion\projectilemotion\Simulation.h   344
Error   88  error C3867: 'MotionThread::MoveProjectile': function call missing argument list; use '&MotionThread::MoveProjectile' to create a pointer to member c:\users\gaz\documents\visual studio 2012\projects\projectilemotion\projectilemotion\Simulation.h   344

对此的任何帮助都会有很大帮助,因为它对我的大学(我认为是美国的英国大四)计算项目和我的导师希望它在相对较快的时间内完成。

4

1 回答 1

3

错误消息告诉您该怎么做:

函数调用缺少参数列表;
    使用 '&MotionThread::MoveProjectile' 创建指向成员的指针
         ^

因此,这是正确的语法:

Thread^ MotionThread1 = gcnew Thread(
    gcnew ParameterizedThreadStart(MoveProj, &MotionThread::MoveProjectile));
                                             ^

对于另一个,您当前正在尝试创建一个委托,但没有告诉它委托应该指向什么方法。尝试这样的事情:

Thread^ MainThread = gcnew Thread(gcnew ThreadStart(this, &MyClass::MainMethod));
                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^

编辑

我没有通读你的完整代码。如果您希望人们花时间帮助您,那么您需要花一些时间并花精力将其提炼成所需的东西。

但是,我会评论您遇到的错误。

错误 C2440:“正在初始化”:
    无法从“MotionThread”转换为“MotionThread ^”

您在某处有一个引用类型的变量,但您使用它时没有^. 这是有效的 C++/CLI,但没有一个托管 API 可以轻松使用它。将成员切换为 a^并使用gcnew

错误 C3352:“浮动 Allformvariables::CalcCurrentVelocity(System::Object ^)”:
    指定的函数与委托类型“void (void)”不匹配

正如错误消息所说:您正在尝试构造一个不带任何参数并返回 void 的委托,而您传递的方法与该委托不匹配。修复方法或切换到不同的委托类型。

错误 C3754:委托构造函数:成员函数“MotionThread::MoveProjectile”
    不能在“MotionThread”类型的实例上调用

当您添加我上面提到的缺失时,我感觉这个会消失^

于 2013-04-11T18:05:10.427 回答