【问题标题】:How do I access a form's control from another thread?如何从另一个线程访问表单的控件?
【发布时间】: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


【解决方案1】:

我不知道您使用的是什么表单库,但您的问题的一般经验法则是“不要”。

除非你有一个特殊的 GUI 库,否则 Windows UI 是线程相关的。所有对 UI 元素的访问都应通过 ui 的关联线程完成。应该通过将更新请求编组到关联的上下文来从未关联的执行上下文中操作 UI 状态。不应该直接做。

【讨论】:

  • 好吧,我的表单类中已经有一个委托函数以确保它是安全的,我只是不知道如何建立从新线程到表单的连接.. 请参阅上面的更新.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2011-06-16
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多