2015-10-05 135 views
0

使用VC++ 2010.如何从另一个线程访问窗体控件​​?

我想从另一个线程中的类访问窗体的控件..并不能找出最好的(或任何)方法来做到这一点。我如何传递我的表单实例的引用?我使用createthread()而不是托管版本,希望使我的应用程序与XP兼容。

我试过通过lPaParameter在结构中传递引用和其他值,但我似乎无法弄清楚如何正确地声明引用。

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; 
     } 
    } 

我如何声明对我的表单的引用? 或者有没有更容易或更好的方法来做到这一点?

+1

这只是典型的Smzg问题,在标题之间有循环依赖关系。 FMain类需要了解SZClass和SZClass需要了解有关FMain的知识。你必须在向前声明和拆分声明和定义.h和.cpp文件之间进行C++舞蹈。你需要有人来检查你的代码btw,问一个团队成员或朋友。 –

+0

我有一个.h和.cpp类,是不够的?我必须为我的表格课程做同样的事吗?并在哪些我会包括哪些? – Willdorf

+2

当我列出三件事情,并且你做了两件事情是不够的。谷歌“C++前向声明”,首先命中是好的。当你不熟悉C++语言时,用C#编写它。 –

回答

0

我不知道你正在使用什么形式的图书馆,但你的问题的一般经验法则是,“不要”。

除非您有一个特殊的GUI库,否则Windows UI是线程关联的。所有对UI元素的访问都应该通过ui的关联线程完成。应该通过将更新请求封送到关联的上下文来处理来自未定义的执行上下文的UI状态。它不应该直接完成。

+0

好吧,我已经在我的表单类中有一个委托函数来确保它是安全的,我只是无法弄清楚如何建立从新线程到窗体的连接..见上面更新。 – Willdorf

相关问题