Я новичок в потоках и Winforms / C ++. Я хотел бы запустить функцию в новом потоке, когда я нажимаю кнопку. Я следил за этим как руководство для темы. Когда я собираю пример кода, приведенного на этом сайте, в отдельном проекте VC ++, сборка удалась.
Однако, если я сделаю следующее в C ++ / Winforms, сборка не будет завершена, Я получаю ошибку сборки.
Что мне здесь не хватает?
Помогите!
Код:
void Test( void *arg );
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)
{
_beginthread(Test, 0, (void*)12);
}
void Test( void *arg )
{
// Do something
}
ОШИБКА сборки:
Error 1 error C2664: '_beginthread' : cannot convert parameter 1 from 'void (__clrcall *)(void *)' to 'void (__cdecl *)(void *)' c:\users\documents\visual studio 2010\projects\statsv2.0\statsv2.0\Form1.h 659 1 StatsV2.0
Вы используете управляемый C ++ (C ++ / CLR). Это сильно отличается от нативного C ++ (для которого было написано руководство).
В управляемом C ++ соглашение о вызовах по умолчанию несовместимо с соглашением о вызовах указателя функции, _beginthread
функция ожидает. К счастью, управляемый C ++ очень хорошо взаимодействует с собственным C ++, и изменение объявления вашей функции на следующее должно работать:
void __cdecl Test( void *arg )
Поскольку вы используете управляемый C ++, у вас есть все возможности .NET на вашей стороне, и вместо этого вы можете создавать управляемые потоки (например, с Task
объект).
Также обратите внимание, что любой объект пользовательского интерфейса win32, созданный в основном потоке, должен только быть доступным на этой теме — так что будьте осторожны! 🙂
Других решений пока нет …