2013-11-29 26 views
0

。我有一个主要的应用形式称为子窗体这个代码,通过一些参数吧:ParameterizedThreadStart多参数

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... 
    } 
}; 
+2

它需要一个对象。任何对象。包括一个有你需要的尽可能多的领域。 –

回答

3

您需要创建一个类,将保留您的参数,并传递类的实例,以你的方法。其结果是,你将需要重新写你的方法来接受新的类作为参数

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,所以你可能需要修正一些语法,但这个想法应该要清楚

+0

你能提供一个快速的代码片段吗?这将非常感谢! – Fabius

+0

更新了解决方案。对不起,没有IDE和我在一起。因此,您可能需要修复语法 – evhen14

+0

非常感谢!修复了一些错误后,这是完美的工作。刚刚编辑我的第一篇文章,提供您的代码片段的固定版本。 – Fabius

0

我不知道为什么我之前没有考虑过这个问题,但另一种解决方案是在创建一个空的String ^变量的同时,在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; 
};