2013-11-29 2 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() содержит ряд других функций делают длинные циклы, а также обновление моим Элементы управления графическим интерфейсом (метки и индикатор выполнения), я хочу переместить его в отдельный поток, чтобы мой графический интерфейс не зависал. Я пытаюсь сделать это с помощью параметра ParameterizedThreadStart, но, похоже, я не могу найти способ передать все мои параметры. Любые идеи? Заранее спасибо!

EDIT - Благодаря 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; 
}; 
Смежные вопросы