【问题标题】:Access form in thread from main program从主程序的线程中访问表单
【发布时间】:2012-11-15 03:41:01
【问题描述】:

我编写了一个 C# DLL COM 库,它可以通过 VBScript 访问。所有库的东西都写在主程序中,没有任何形式。

后来我添加了一个只显示状态的表单(如“49% 完成”)。这工作得很好,但是当 DLL 必须计算很多东西时,表单会“挂起”。我希望表单始终可以访问和移动。

所以我决定为表单创建一个自己的线程。创建线程和表单很容易,但是从主程序访问此表单时我遇到了很大的问题。例如,我只想设置标题。

我这样称呼表格:


namespace PART1.PART2
{
    public class CLASSNAME
    {
        private Thread fStatus;
        private frm_Status fStatusForm;

        public void runShowStatus()
        {
            if (fStatus == null)
            {
                fStatus = new Thread(new ThreadStart(threadForm));
                fStatus.Start();
            }
        }

        private void threadForm()
        {
            fStatusForm = new frm_Status();
            Application.Run(fStatusForm);
        }
    }
}

表单本身是标准表单。目前没有特殊代码。

有类似的帖子,但有两个主要区别:

  • 表单在线程中 - 表单不在主程序中,并且表单不是主表单。
  • 主程序尝试访问表单 - 表单不尝试访问主程序。

【问题讨论】:

  • 你变得越来越糟,VBScript 根本不支持线程。使用 BackgroundWorker 执行昂贵的计算,它的 ReportProgress 方法来更新 UI。
  • 感谢您的回复。我对BackgroundWorker一无所知。也许你能给我举个例子? VBScript 不访问表单或任何其他线程。它甚至不知道还有另一个线程。 (这是有意的)
  • 谷歌点击量半百万,从顶部开始。
  • 我用一个非常简单的方法解决了这个问题。甚至没有必要对我的线程或调用者进行任何更改。我刚刚添加了一个名为“状态”的新类。全局创建了一个实例。现在我可以从主线程和子线程访问这个类的成员了。

标签: c# multithreading com


【解决方案1】:

您可以像这样将volatile 变量添加到主类CLASSNAME

private static volatile int progress = 0;

现在您可以从主线程中更改其值,并从表单线程中读取该值。

【讨论】:

  • 如何从另一个类(表单类)访问这个变量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多