2015-04-05 6 views
0

Когда вы создаете новый поток, используя ThreadStart(), как передать несколько аргументов функции?C++/CLR Передача нескольких аргументов в потоках

Вот пример:

using namespace System; 
using namespace System::Threading; 

public ref class Animal 
{ 
public: 
    void Hungry(Object^ food, int quantity); 
}; 

void Animal::Hungry(Object^ food, int quantity) 
{ 
    Console::WriteLine("The animal eats " + quantity.ToString() + food); 
} 

void main() 
{ 
    Animal^ test = gcnew Animal; 
    Thread^ threads = gcnew Thread(gcnew ParameterizedThreadStart(test, &Animal::Hungry)); 

    threads->Start("Grass", 1); //need to pass 2nd argument! 
} 

Он отлично работает с только один аргумент (если я удалю количество ИНТ и просто Object^пищи), поскольку ParameterizedThreadStart занимает лишь Object^

+0

Вы передаете аргумент Нить :: Start() метод. Вызываемая функция должна принимать один аргумент Object ^. Верните его в String^с помощью safe_cast. –

+0

@HansPassant Хорошо, я смог заставить его работать, как вы сказали, но как передать несколько аргументов? Также мне пришлось изменить ThreadStart() на ParameterizedThreadStart() – Joesph

+0

Я обновил вопрос – Joesph

ответ

1

Как и в любой другой ситуация, в которой вы должны поместить несколько значений в один объект, вы либо:

  • создать класс-оболочку или структуры (чистый путь)
  • или использовать некоторые предопределенные один, как Tuple (The ленивым путь)

Вот ленивый способ:

void Animal::Hungry(Object^ param) 
{ 
    auto args = safe_cast<Tuple<String^, int>^>(param); 
    Console::WriteLine("The animal eats {1} {0}", args->Item1, args->Item2); 
} 

void main() 
{ 
    Animal^ test = gcnew Animal; 
    Thread^ threads = gcnew Thread(gcnew ParameterizedThreadStart(test, &Animal::Hungry)); 
    threads->Start(Tuple::Create("Grass", 1)); 
} 
+0

Большое спасибо. Этот ответ сработал хорошо. Я хочу, чтобы C++ CLR лучше поддерживала поток, но я рад, что вы пришли на помощь. – Joesph

+0

Это фактически не имеет ничего общего с потоками. .NET Framework имеет неплохую поддержку потоков (Threads, TPL, PLINQ и т. Д.). Печально то, что C++/CLI не поддерживает управляемые lambdas. –

+0

Я вижу. Было очень больно передавать аргументы в многопоточности. Рад, что в C++ 11 стало проще. – Joesph

Смежные вопросы