Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何使用;这";在一个线程中!_Multithreading_Visual Studio 2010_Visual C++_C++ Cli - Fatal编程技术网

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)的东西。编译器显示我不能在静态函数中使用
这个
。我试图使我的函数非静态(即remove
static
关键字),但当我这样做时,编译器再次显示两个错误:

错误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行,并告诉我们范围(函数声明的位置(类声明))非常感谢,悲伤的人……不需要悲伤的人!我做了你的一些通知,我已经把我想要的