многопоточность — потоки C ++ / Winforms: я получаю ошибку сборки с _beginthread

Я новичок в потоках и 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

0

Решение

Вы используете управляемый C ++ (C ++ / CLR). Это сильно отличается от нативного C ++ (для которого было написано руководство).

В управляемом C ++ соглашение о вызовах по умолчанию несовместимо с соглашением о вызовах указателя функции, _beginthread функция ожидает. К счастью, управляемый C ++ очень хорошо взаимодействует с собственным C ++, и изменение объявления вашей функции на следующее должно работать:

void __cdecl Test( void *arg )

Поскольку вы используете управляемый C ++, у вас есть все возможности .NET на вашей стороне, и вместо этого вы можете создавать управляемые потоки (например, с Task объект).

Также обратите внимание, что любой объект пользовательского интерфейса win32, созданный в основном потоке, должен только быть доступным на этой теме — так что будьте осторожны! 🙂

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector