【发布时间】:2014-09-09 13:25:54
【问题描述】:
我正在使用 C++/CLI 编写一种下载器。它应该在进度条中显示下载状态。为了使下载不阻塞表单,我需要在后台线程中运行它,但是为了访问进度条,我需要在我的下载函数中指向它的指针。因此,我需要以表单(或进度条,无所谓)作为参数来启动线程。为此,我写了一个小线程包装类:
typedef System::Collections::Generic::List<System::Object^> ArgList;
ref class GCThread {
private:
void (*entryPoint)(System::Object^);
ArgList^ arguments;
public:
GCThread(void (*entryPoint)(System::Object^)) { this->entryPoint = entryPoint; arguments = gcnew ArgList(); };
void addArgument(System::Object^ obj) { arguments->Add(obj); };
void start();
};
void GCThread::start() {
System::Threading::ParameterizedThreadStart^ ts = gcnew System::Threading::ParameterizedThreadStart(&entryPoint);
System::Threading::Thread^ t = gcnew System::Threading::Thread(ts);
t->Start((System::Object^) arguments);
}
当尝试像这样调用函数时
GCThread^ thread = gcnew GCThread(downloadFiles);
thread->addArgument(btnLogin);
thread->addArgument(pgrDownload);
thread->start();
downloadFiles 是一个全局方法,定义为
void __clrcall downloadFiles(System::Object^);
我得到一个 System::InvalidProgramException: The Common Language Runtime has found an invalid program 在创建参数化线程启动对象时。我究竟做错了什么?为什么不能为 gc 类型创建全局变量?我知道拥有全局变量完全违背垃圾收集器的目的,但至少有机会自己决定会很好。
顺便说一句,我使用的是 VC++ 2008。 感谢您的宝贵时间!
【问题讨论】:
标签: multithreading winforms visual-c++ c++-cli