【发布时间】:2015-10-05 22:30:29
【问题描述】:
使用 VC++ 2010。
我想从另一个线程中的类访问表单的控件.. 并且无法找出最好的(或任何)方法来做到这一点。如何传递我的表单实例的引用?我使用 createthread() 而不是托管版本,希望让我的应用与 XP 兼容。
我尝试通过 lpParameter 在结构中传递引用和其他值,但我似乎无法弄清楚如何正确声明引用。
ref class SZClass {
private:
FMain ^bound_form;
int server_port;
public:
void BindForm(FMain ^bf);
void Initialize(int sp)
}
struct param_data {
public:
FMain ^form_tobind;
int port_num;
}
给我错误:
error C2143: syntax error : missing ';' before '^'
FMain 是我的表单类的名称,我已经设置了一个委托方法以使其多线程安全:
public:
FMain(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
void FMain::PrintConsole(std::string mzg) {
String ^Smzg = marshal_as<String^>(mzg);
if (this->textBox1->InvokeRequired) {
SetTextDelegate^ d = gcnew SetTextDelegate(this, &FMain::PrintConsole);
this->Invoke(d, gcnew array<Object^> { Smzg });
} else {
textBox1->Text += Smzg;
textBox1->SelectionStart = textBox1->TextLength;
}
}
如何声明对我的表单的引用? 或者有没有更简单或更好的方法来做到这一点?
【问题讨论】:
-
这只是典型的 Smzg 问题,标题之间存在循环依赖关系。 FMain 类需要了解 SZClass,SZClass 需要了解 FMain。您必须在 .h 和 .cpp 文件之间使用前向声明以及拆分声明和定义来进行 C++ 舞蹈。顺便说一句,您需要有人检查您的代码,询问团队成员或朋友。
-
我有一个 .h 和 .cpp 用于班级,这还不够吗?我必须为我的表单类做同样的事情吗?我会在哪些中包括哪些?
-
当我列出三件事而你做了两件事时,这还不够。谷歌“c++前向声明”,先打好。当您不熟悉 C++ 语言时,请用 C# 编写此代码。
-
我 15 年前在 Borland 学习了 c++,最近又在 vc++ 上学习了它,我没有使用 c# 的经验,也不想尝试......我只是想澄清一下
-
我现在正试图将我的 fmain.h 分离为 fmain.h 和 fmain.cpp.. 但我现在遇到了设计器错误,我试图找出这些错误。
标签: multithreading forms visual-c++ variable-declaration