Нет необходимости делать вашу функцию статичной. Данные ошибки связаны с неправильным синтаксисом, который вы используете.
Принимая ваш тип формы как FormType,
void ScanMyDir()
{
//....
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
Thread ^thr1 =gcnew Thread(gcnew ThreadStart(this,&FormType::ScanMyDir));
thr1->Start();
}
Если вы настаиваете на том, чтобы сделать его статическим, как сказал @jgauffin, передайте форму в качестве параметра Object
в ScanMyDir()
и затем переделайте ее в форму в функции.
static void ScanMydir(Object ^ param)
{
FormType ^ ft = static_cast<FormType^>(param);
//..
ft->listBox1->Items->Add(fileName);
//..
}
В этом случае вы должны использовать ParametrizedThreadStart()
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
Thread ^thr1 =gcnew Thread(gcnew ParametrizedThreadStart(&FormType::ScanMyDir));
// it is static no need for "this"
thr1->Start(this);
}
Но, по крайней мере, сделайте функцию ScanMyDir()
частной и запретите доступ извне.
Теперь, вероятно, у вас будет другая ошибка: «Вы не можете касаться GUI разными потоками», затем в функцию загрузки форм напишите
void FormType_Load(Object ^sender, EventArgs ^ e)
{
System::Windows::Forms::Control::CheckForIllegalCrossThreadCalls = false;
//....
}
Но это может быть опасно в зависимости от вашей реализации, вы должны гарантировать безопасность потоков listbox1->items
.
Также послушайте, что сказал парень @Yochai Timmer. Он говорит хорошие вещи.