Multithreading 如何使用;这";在一个线程中!
我试图使用一个单独的线程调用我的静态函数,我的函数中有类似于Multithreading 如何使用;这";在一个线程中!,multithreading,visual-studio-2010,visual-c++,c++-cli,Multithreading,Visual Studio 2010,Visual C++,C++ Cli,我试图使用一个单独的线程调用我的静态函数,我的函数中有类似于this->listBox1->Items->Add(s)的东西。编译器显示我不能在静态函数中使用这个。我试图使我的函数非静态(即removestatic关键字),但当我这样做时,编译器再次显示两个错误: 错误2错误C3350:“System::Threading::ThreadStart”:委托构造函数需要2个参数c:\users\ahmed\documents\visual studio 2010\projects\testscan
this->listBox1->Items->Add(s)的东西代码>。编译器显示我不能在静态函数中使用这个
。我试图使我的函数非静态(即removestatic
关键字),但当我这样做时,编译器再次显示两个错误:
错误2错误C3350:“System::Threading::ThreadStart”:委托构造函数需要2个参数c:\users\ahmed\documents\visual studio 2010\projects\testscan\testscan\Form1.h 116
错误1错误C2276:“&”:对绑定成员函数表达式c:\users\ahmed\documents\visual studio 2010\projects\testscan\testscan\Form1.h 116执行非法操作
编辑:
职能:
void ScanMyDir(String^ SourceDir)
{
array <String^> ^fileEntries = Directory::GetFiles(SourceDir);
for each (String^ fileName in fileEntries)
this->Form1->listBox1->Items->Add(fileName);
array<String^> ^SubDirEntries = Directory::GetDirectories(SourceDir);
for each (String^ subdir in SubDirEntries)
if ((File::GetAttributes(subdir) & FileAttributes::ReparsePoint)!= FileAttributes::ReparsePoint)
ScanMyDir(subdir);
}
修改表单加载:
void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
System::Windows::Forms::Control::CheckForIllegalCrossThreadCalls = false;
}
新错误:(:
错误5错误C3352:“void testScan::Form1::ScanMyDir(System::String^)”:指定的函数与委托类型“void(System::Object^)”不匹配c:\users\ahmed\documents\visual studio 2010\projects\testScan\testScan\Form1.h 117
错误1错误C2273:“函数样式转换”:作为“->”运算符c:\users\ahmed\documents\visual studio 2010\projects\testscan\testscan\Form1.h 105的右侧非法
错误2错误C2227:“->listBox1”的左侧必须指向类/struct/union/generic type c:\users\ahmed\documents\visual studio 2010\projects\testscan\testscan\Form1.h 105
错误3错误C2227:“->Items”的左侧必须指向类/struct/union/generic类型:\users\ahmed\documents\visualstudio 2010\projects\testscan\testscan\Form1.h 105
错误4错误C2227:“->Add”的左侧必须指向类/struct/union/generic type c:\users\ahmed\documents\visualstudio 2010\projects\testscan\testscan\Form1.h 105
免责声明:我没有使用托管C++,只有C++和香草C++。因此这个答案可能是错误的。
代码>线程启动> /COD>委托可以采取一个参数。将类的实例传递给它并将其转换为静态线程方法中的类。它不是<代码> < < />代码>,但几乎是相同的。
< P>免责声明:我没有使用托管C++,只有C++和香草C++。因此这个答案可能不正确。
ThreadStart
委托可以接受一个参数。将类的实例传递给它,并在静态线程方法中将其强制转换为类。这与不同,但几乎是一样的。好的,基本原则:
Static表示该方法不是对象的成员。它是类类型的成员,与该类的所有对象相同。因此,没有this,因为没有关联的对象
读取编译器错误。读取函数定义以传递正确的参数
当你开始工作时,你可能会有一个错误,因为你试图从另一个线程使用GUI函数。这将导致运行时错误(有时)
检查此项:好的,基本原则:
Static表示该方法不是对象的成员。它是类类型的成员,与该类的所有对象相同。因此,没有this,因为没有关联的对象
读取编译器错误。读取函数定义以传递正确的参数
当你开始工作时,你可能会有一个错误,因为你试图从另一个线程使用GUI函数。这将导致运行时错误(有时)
检查此项:无需将函数设置为静态。给定的错误是由于使用的语法错误造成的。
假设您的表单类型为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所说,将表单作为对象
参数传递给ScanMyDir()
,然后在函数中重新将其设置为表单
static void ScanMydir(Object ^ param)
{
FormType ^ ft = static_cast<FormType^>(param);
//..
ft->listBox1->Items->Add(fileName);
//..
}
但至少要将ScanMyDir()
函数设置为私有,并防止外部访问
现在,您可能会遇到另一个错误,即“您不能用不同的线程接触GUI”,然后在窗体加载函数上编写
void FormType_Load(Object ^sender, EventArgs ^ e)
{
System::Windows::Forms::Control::CheckForIllegalCrossThreadCalls = false;
//....
}
但这可能很危险,这取决于您的实现,您必须保证listbox1->items
的线程安全
还要听听@Yochai Timmer guy所说的话。他说的是好事。无需将函数设置为静态。给定的错误是由于您使用的语法错误造成的。
假设您的表单类型为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所说,将表单作为对象
参数传递给ScanMyDir()
,然后在函数中重新将其设置为表单
static void ScanMydir(Object ^ param)
{
FormType ^ ft = static_cast<FormType^>(param);
//..
ft->listBox1->Items->Add(fileName);
//..
}
但至少要将ScanMyDir()
函数设置为私有,并防止外部访问
现在,您可能会遇到另一个错误,即“您不能用不同的线程接触GUI”,然后在窗体加载函数上编写
void FormType_Load(Object ^sender, EventArgs ^ e)
{
System::Windows::Forms::Control::CheckForIllegalCrossThreadCalls = false;
//....
}
但这可能很危险,这取决于您的实现,您必须保证listbox1->items
的线程安全
还请听一下@Yochai Timmer guy所说的话。他说的很好。这不是您当前的问题,但看起来您正试图从非GUI线程写入GUI对象,这通常被认为是不允许的。您应该向我们展示函数声明,第116行,并告诉我们函数声明的范围(函数声明的位置)(类声明))实际上不是您当前的问题,但看起来您正试图从非GUI线程写入GUI对象,这通常被认为是不允许的。您应该向我们展示函数声明,第116行,并告诉我们范围(函数声明的位置(类声明))非常感谢,悲伤的人……不需要悲伤的人!我做了你的一些通知,我已经把我想要的