Multithreading 参数化线程从多个参数开始

Multithreading 参数化线程从多个参数开始,multithreading,parameters,c++-cli,Multithreading,Parameters,C++ Cli,我有一个由主应用程序窗体调用的子窗体的代码,它将一些参数传递给它: public ref class MyForm2 : public System::Windows::Forms::Form { public: MyForm2(String^ string1, String^ string2, String^ string3, String^ string4) { InitializeComponent();

我有一个由主应用程序窗体调用的子窗体的代码,它将一些参数传递给它:

public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
        MyForm2(String^ string1, String^ string2, String^ string3, String^ string4)
        {
                InitializeComponent();
                DoSomething(string1, string2, string3, string4);
        }
        //...
        void DoSomething(String^ string1, String^ string2, String^ string3, String^ string4)
        {
                //A lot of stuff in here...
        }
};
但是,由于DoSomething()包含其他几个函数,它们执行长循环并更新我的GUI控件(标签和进度条),因此我想将其移动到一个单独的线程中,这样我的GUI就不会冻结。我正试图用ParameterizedThreadStart实现这一点,但似乎无法找到传递所有参数的方法。 有什么想法吗?提前谢谢

编辑-感谢evhen14!这是固定的工作代码。

public ref class ThreadParams
{
public:
    String^ mystring1;
    String^ mystring2;
    String^ mystring3;
    String^ mystring4;
    ThreadParams(String^ string1, String^ string2, String^ string3, String^ string4)
    {
        mystring1 = string1;
        mystring2 = string2;
        mystring3 = string3;
        mystring4= string4;
    }
};
public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
    MyForm2(String^ mystring1, String^ mystring2, String^ mystring3, String^ mystring4)
    {
        InitializeComponent();
        ThreadParams^ param = gcnew ThreadParams(mystring1, mystring2, mystring3, mystring4);
        Thread^ newThread = gcnew Thread(gcnew ParameterizedThreadStart(this, &MyForm2::DoSomething));
        newThread->Start(param);
    }
    //...
    void DoSomething(Object^ paramObj)
    {
        ThreadParams^ param = (ThreadParams^)paramObj;
        String^ mystring1 = param->string1;
        String^ mystring2 = param->string2;
        String^ mystring3 = param->string3;
        String^ mystring4 = param->string4;
        //A lot of stuff in here...
    }
};

您将需要创建一个包含参数的类,并将该类的实例传递给您的方法。因此,您需要重新编写方法以接受该新类作为参数

public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
        MyForm2(String^ string1, String^ string2, String^ string3, String^ string4)
        {
                InitializeComponent();
                ThreadParams^ param = gcnew ThreadParams();

                param->string1 = "blah";
                param->string2 = "blah";   //etc
                Thread^ newThread = gcnew Thread(gcnew ParameterizedThreadStart(MyForm2::DoSomething));
                thread->Start(param)

        }
        //...
        void DoSomething(Object^ paramObj)
        {
                ThreadParams param = (ThreadParams)paramObj; 
                //here use param.string1, param.string2, etc
                //A lot of stuff in here...
        }
};

public ref ThreadParams
{
  public:
    String^ string1;
    String^ string2;
    String^ string3;
    String^ string4;
}

PS:无法访问IDE,因此您可能需要修改一些语法,但想法应该很清楚

您需要创建一个类来保存您的参数,并将该类的实例传递给您的方法。因此,您需要重新编写方法以接受该新类作为参数

public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
        MyForm2(String^ string1, String^ string2, String^ string3, String^ string4)
        {
                InitializeComponent();
                ThreadParams^ param = gcnew ThreadParams();

                param->string1 = "blah";
                param->string2 = "blah";   //etc
                Thread^ newThread = gcnew Thread(gcnew ParameterizedThreadStart(MyForm2::DoSomething));
                thread->Start(param)

        }
        //...
        void DoSomething(Object^ paramObj)
        {
                ThreadParams param = (ThreadParams)paramObj; 
                //here use param.string1, param.string2, etc
                //A lot of stuff in here...
        }
};

public ref ThreadParams
{
  public:
    String^ string1;
    String^ string2;
    String^ string3;
    String^ string4;
}

PS:无法访问IDE,因此您可能需要修改一些语法,但想法应该很清楚

您需要创建一个类来保存您的参数,并将该类的实例传递给您的方法。因此,您需要重新编写方法以接受该新类作为参数

public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
        MyForm2(String^ string1, String^ string2, String^ string3, String^ string4)
        {
                InitializeComponent();
                ThreadParams^ param = gcnew ThreadParams();

                param->string1 = "blah";
                param->string2 = "blah";   //etc
                Thread^ newThread = gcnew Thread(gcnew ParameterizedThreadStart(MyForm2::DoSomething));
                thread->Start(param)

        }
        //...
        void DoSomething(Object^ paramObj)
        {
                ThreadParams param = (ThreadParams)paramObj; 
                //here use param.string1, param.string2, etc
                //A lot of stuff in here...
        }
};

public ref ThreadParams
{
  public:
    String^ string1;
    String^ string2;
    String^ string3;
    String^ string4;
}

PS:无法访问IDE,因此您可能需要修改一些语法,但想法应该很清楚

您需要创建一个类来保存您的参数,并将该类的实例传递给您的方法。因此,您需要重新编写方法以接受该新类作为参数

public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
        MyForm2(String^ string1, String^ string2, String^ string3, String^ string4)
        {
                InitializeComponent();
                ThreadParams^ param = gcnew ThreadParams();

                param->string1 = "blah";
                param->string2 = "blah";   //etc
                Thread^ newThread = gcnew Thread(gcnew ParameterizedThreadStart(MyForm2::DoSomething));
                thread->Start(param)

        }
        //...
        void DoSomething(Object^ paramObj)
        {
                ThreadParams param = (ThreadParams)paramObj; 
                //here use param.string1, param.string2, etc
                //A lot of stuff in here...
        }
};

public ref ThreadParams
{
  public:
    String^ string1;
    String^ string2;
    String^ string3;
    String^ string4;
}

PS:无法访问IDE,因此您可能需要修改一些语法,但想法应该很清楚

我不知道为什么我以前没有考虑过这一点,但另一种解决方案是在不创建新类来携带参数的情况下快速执行此操作,即创建空字符串^variables,在初始化Component()之后设置它们的值并稍后在DoSomething()中调用它们,而不在线程创建中传递任何参数:

public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
    MyForm2(String^ mystring1, String^ mystring2, String^ mystring3, String^ mystring4)
    {
        InitializeComponent();
        string1 = mystring1;
        string2 = mystring2;
        string3 = mystring3;
        string4 = mystring4;
        Thread^ newThread = gcnew Thread(gcnew ThreadStart(this, &MyForm2::DoSomething));
        newThread->Start();
    }
    //...
    void DoSomething()
    {
        String^ mystring1 = string1;
        String^ mystring2 = string2;
        String^ mystring3 = string3;
        String^ mystring4 = string4;
        //A lot of stuff in here...
    }
private:
    String^ string1;
    String^ string2;
    String^ string3;
    String^ string4;
};

我不知道为什么我以前没有考虑过这一点,但另一种在不创建新类来携带参数的情况下快速实现这一点的解决方案是创建空字符串^variables,在InitializeComponent()之后设置它们的值,稍后在DoSomething()中调用它们,而不在线程创建中传递任何参数:

public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
    MyForm2(String^ mystring1, String^ mystring2, String^ mystring3, String^ mystring4)
    {
        InitializeComponent();
        string1 = mystring1;
        string2 = mystring2;
        string3 = mystring3;
        string4 = mystring4;
        Thread^ newThread = gcnew Thread(gcnew ThreadStart(this, &MyForm2::DoSomething));
        newThread->Start();
    }
    //...
    void DoSomething()
    {
        String^ mystring1 = string1;
        String^ mystring2 = string2;
        String^ mystring3 = string3;
        String^ mystring4 = string4;
        //A lot of stuff in here...
    }
private:
    String^ string1;
    String^ string2;
    String^ string3;
    String^ string4;
};

我不知道为什么我以前没有考虑过这一点,但另一种在不创建新类来携带参数的情况下快速实现这一点的解决方案是创建空字符串^variables,在InitializeComponent()之后设置它们的值,稍后在DoSomething()中调用它们,而不在线程创建中传递任何参数:

public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
    MyForm2(String^ mystring1, String^ mystring2, String^ mystring3, String^ mystring4)
    {
        InitializeComponent();
        string1 = mystring1;
        string2 = mystring2;
        string3 = mystring3;
        string4 = mystring4;
        Thread^ newThread = gcnew Thread(gcnew ThreadStart(this, &MyForm2::DoSomething));
        newThread->Start();
    }
    //...
    void DoSomething()
    {
        String^ mystring1 = string1;
        String^ mystring2 = string2;
        String^ mystring3 = string3;
        String^ mystring4 = string4;
        //A lot of stuff in here...
    }
private:
    String^ string1;
    String^ string2;
    String^ string3;
    String^ string4;
};

我不知道为什么我以前没有考虑过这一点,但另一种在不创建新类来携带参数的情况下快速实现这一点的解决方案是创建空字符串^variables,在InitializeComponent()之后设置它们的值,稍后在DoSomething()中调用它们,而不在线程创建中传递任何参数:

public ref class MyForm2 : public System::Windows::Forms::Form
{
public:
    MyForm2(String^ mystring1, String^ mystring2, String^ mystring3, String^ mystring4)
    {
        InitializeComponent();
        string1 = mystring1;
        string2 = mystring2;
        string3 = mystring3;
        string4 = mystring4;
        Thread^ newThread = gcnew Thread(gcnew ThreadStart(this, &MyForm2::DoSomething));
        newThread->Start();
    }
    //...
    void DoSomething()
    {
        String^ mystring1 = string1;
        String^ mystring2 = string2;
        String^ mystring3 = string3;
        String^ mystring4 = string4;
        //A lot of stuff in here...
    }
private:
    String^ string1;
    String^ string2;
    String^ string3;
    String^ string4;
};

你能提供一个快速的代码片段吗?非常感谢!更新了解决方案。对不起,我没有带IDE。因此,您可能需要修复Syntax。非常感谢!这是完美的工作后,修复了几个错误。刚刚编辑了我的第一篇文章,提供了你的代码片段的固定版本。你能提供一个快速的代码片段吗?非常感谢!更新了解决方案。对不起,我没有带IDE。因此,您可能需要修复Syntax。非常感谢!这是完美的工作后,修复了几个错误。刚刚编辑了我的第一篇文章,提供了你的代码片段的固定版本。你能提供一个快速的代码片段吗?非常感谢!更新了解决方案。对不起,我没有带IDE。因此,您可能需要修复Syntax。非常感谢!这是完美的工作后,修复了几个错误。刚刚编辑了我的第一篇文章,提供了你的代码片段的固定版本。你能提供一个快速的代码片段吗?非常感谢!更新了解决方案。对不起,我没有带IDE。因此,您可能需要修复Syntax。非常感谢!这是完美的工作后,修复了几个错误。刚刚编辑了我的第一篇文章,以提供您的代码片段的固定版本。它需要一个对象。任何物体。包括一个你需要的字段,它需要一个对象。任何物体。包括一个你需要的字段,它需要一个对象。任何物体。包括一个你需要的字段,它需要一个对象。任何物体。包括一个你需要的字段。