在 C++ CLI 中将参数传递给线程
Pass parameters to thread in C++ CLI
我搜索了每个主题以正确创建带有参数 (wstring) 的新线程,但没有任何效果。我该如何解决我的问题?
这个项目是我为我的 .Net UI 应用程序创建的,所以之前我使用 std::thread 和 std::mutex 但 "amazing" .NET 在 VSC++ Forms 中不支持它。
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
}
从您的代码片段来看,要指出正确的方向并不容易。你需要一个线程对象。
using namespace System::Threading;
线程对象:
Thread ^m_Thread;
现在需要的行是:
m_Thread = gcnew Thread(gcnew ParameterizedThreadStart(this,
&FileIndex::Diving));
m_Thread->Start(ittr->drive + L"*");
正如 Hans Passant 在他的评论中所建议的那样。 Start 方法不会像我认为 DriverInfo
那样接受本机 c++ 值。您必须将其转换为真正的 C++/CLI 对象。
Hans Passant 再次指出正确的方向:
ref class mywrapwstring
{
public:
mywrapwstring(std::wstring str) : str(new std::wstring(str)) {}
!mywrapwstring() : { delete std::string(str); }
std::wstring *str;
};
和 "magic" 调用:
m_Thread->Start(gcnew mywrapwstring(ittr->drive + L"*") );
线程方法更像:
void FileIndex::Diving(mywrapwstring ^ data)
{
// do smth.
// any recursion
data->str; // here is your string
}
我搜索了每个主题以正确创建带有参数 (wstring) 的新线程,但没有任何效果。我该如何解决我的问题? 这个项目是我为我的 .Net UI 应用程序创建的,所以之前我使用 std::thread 和 std::mutex 但 "amazing" .NET 在 VSC++ Forms 中不支持它。
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
}
从您的代码片段来看,要指出正确的方向并不容易。你需要一个线程对象。
using namespace System::Threading;
线程对象:
Thread ^m_Thread;
现在需要的行是:
m_Thread = gcnew Thread(gcnew ParameterizedThreadStart(this,
&FileIndex::Diving));
m_Thread->Start(ittr->drive + L"*");
正如 Hans Passant 在他的评论中所建议的那样。 Start 方法不会像我认为 DriverInfo
那样接受本机 c++ 值。您必须将其转换为真正的 C++/CLI 对象。
Hans Passant 再次指出正确的方向:
ref class mywrapwstring
{
public:
mywrapwstring(std::wstring str) : str(new std::wstring(str)) {}
!mywrapwstring() : { delete std::string(str); }
std::wstring *str;
};
和 "magic" 调用:
m_Thread->Start(gcnew mywrapwstring(ittr->drive + L"*") );
线程方法更像:
void FileIndex::Diving(mywrapwstring ^ data)
{
// do smth.
// any recursion
data->str; // here is your string
}