在C ++ CLI中将参数传递给线程

时间:2015-04-17 20:42:43

标签: .net multithreading visual-c++ c++-cli

我搜索了每个主题以正确创建带参数(wstring)的新线程,但没有任何效果。我怎样才能解决我的问题? 我创建的这个项目是我的.Net UI应用程序,所以早些时候我使用std :: thread和std :: mutex但是#34;惊人的" VSC ++ Forms中的.NET并不支持它。

namespace indx
{
ref class FileIndex
{
public:
    FileIndex();
    FileIndex(FileIndex ^);
    virtual ~FileIndex();

    // func
    void getDrives();
    void Diving(const wstring &);
    void Processing();
};

void FileIndex::Diving(Object^ data)
{
    // do smth.
    // any recursion 
}

void FileIndex::Processing()
{
    vector<DriveInfo>::iterator ittr = LDrivers->begin();
    for(counter = 0; ittr != LDrivers->end(); ittr++)
    {
        if(ittr->type == L"Fixed" || ittr->type == L"Removable")
        {
            // need new thread(&FileIndex::Diving, this, (ittr->drive + L"*"));
            // argument - ittr->drive + L"*";
        }
    }
    // join
}

1 个答案:

答案 0 :(得分:2)

从您的代码片段开始,指向正确的方向并不容易。你需要一个线程对象。

using namespace System::Threading;

线程对象:

Thread ^m_Thread;

现在需要的一行:

m_Thread = gcnew Thread(gcnew ParameterizedThreadStart(this,
                    &FileIndex::Diving));
m_Thread->Start(ittr->drive + L"*");

正如汉斯帕斯特在评论中所说的那样。 Start方法不会像我认为DriverInfo那样接受本机c ++值。您必须将其转换为真正的C ++ / CLI对象。 汉斯帕斯特再次指出了正确的方向:

ref class mywrapwstring
{
 public:
  mywrapwstring(std::wstring str) :  str(new std::wstring(str)) {}
  !mywrapwstring() :  { delete std::string(str); }
  std::wstring *str;
};

和#34;魔法&#34;拨打:

m_Thread->Start(gcnew mywrapwstring(ittr->drive + L"*") ); 

和线程方法更像是:

void FileIndex::Diving(mywrapwstring ^ data)
{
 // do smth.
 // any recursion 
 data->str; // here is your string
}