2013-08-16 122 views
-1

所以情况就是这样 - 当控制台应用程序启动时,它会创建3个线程永远停留在那里,并执行他们应该做的任何事情。则任何该等线程将能够显示一个Windows窗体作为一个单独的线程,因此不会等待它使用此代码返回任何东西:C#从一个线程访问不同线程的变量

public void RunThread() 
{ 
    Thread thread = new Thread(new ThreadStart(RunForm)); 
    thread.Name = "StatusForm"; 
    thread.Start(); 
} 

public void RunForm() 
{ 
    Application.Run(new StatusForm()); 
} 

此窗口的形式将试图得到一些变数所有3个线程,我这样做,使用:

int var1 = Manager1.InventoryEntriesOne 
int var2 = Manager2.InventoryEntriesTwo 
int var3 = Manager3.InventoryEntriesThree 

的InventoryEntries在第一线中声明如下(同去的其他2个线程):

public static volatile InventoryEntries 

现在对于一些重ason发生了什么是Windows窗体只显示使用RunThread()函数调出窗口的线程的变量。例如,如果线程1启动窗口,则只显示该线程的变量,对于线程2和3,它将全为0.它需要能够读取来自所有3个线程的变量,哪个线程无关紧要推出了这个窗口。

谢谢。

-----------------编辑-------------------

让我向您展示代码中发生的事情的简要示例。这是一个例子Manager1的,假设2名其他经理基本上都在做同样的事情...

using System.Windows.Forms; 
using System.Threading; 

namespace Manager 
{ 
    public class Manager1 : Manager 
    { 
     public static volatile int InventoryEntriesOne = 123; 


     public override bool OnSomeEvent() 
     { 
      InventoryEntriesOne = 555; 
     } 

     public override bool OnSomeOtherEvent() 
     { 
      RunThread(); 
     } 

     public void RunThread() 
     { 
      Thread thread = new Thread(new ThreadStart(RunForm)); 
      thread.Name = "StatusForm"; 
      thread.Start(); 
     } 
     public void RunForm() 
     { 
      Application.Run(new StatusForm()); 
     } 
    } 
} 

因此,大家可以看到,该管理器打开Windows窗体,现在发生的事情以这样的形式是这样的:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Manager 
{ 
    public partial class StatusForm : Form 
    { 
     Timer refreshTimer = new Timer(); 

     public StatusForm() 
     { 
      InitializeComponent(); 

      PlotData(); 

      refreshTimer.Interval = 5000; //5 seconds in milliseconds 
      refreshTimer.Tick += new EventHandler(refreshTimer_Tick); 
      refreshTimer.Start(); 
     } 

     void refreshTimer_Tick(object sender, EventArgs e) 
     { 
      PlotData(); 
     } 

     public void PlotData() 
     { 
      label1.Text = Manager1.InventoryEntriesOne.ToString(); 

      label2.Text = Manager2.InventoryEntriesTwo.ToString(); 

      label3.Text = Manager3.InventoryEntriesThree.ToString(); 
     } 
    } 
} 

我希望你们能明白现在的问题。

+1

定义InventoryEntries供参考:线程没有父子关系.... – I4V

+0

对不起,我新的编程,我只是不知道怎么说,否则,你知道我的意思,父母和孩子在“父母”线程创建“孩子”线程,如果这甚至很重要。我尝试了很多解决方案,但我一直都失败。任何帮助将不胜感激。 – FrozenHaxor

+1

您需要显示表单如何访问管理变量的定义。 – tinman

回答

0

上的Program.cs

1

尝试不同的组织解决方案:

  1. 只有1个UI线程,管理所有形式/窗口和互动与用户。
  2. 上面有UI线程(根据需要创建并将工作委托给后台线程)。
  3. 如果线程初创真的可观的性能问题(我不买这先验但它可能发生),那么有一个经理形式缓存的引用到它是私有的后台线程的每个实例。
  4. 当后台线程完成工作,并且需要更新其分配的经理表单时,让他们使用Invoke()
+0

这不完全是我想要做的。主线程是一个控制台应用程序。其他管理人员是否能够显示表格并不重要。至少Manager1必须能够做到这一点,因为表格将显示所有管理者的状态,所以表格没有以任何方式分配,该表格对所有管理者都是通用的。我需要能够通过窗体本身从管理器中提取变量,从我看到的Invoke()函数反过来看。此外,我到那里的唯一UI线程是状态表单本身。其余的是在主控台应用程序。 – FrozenHaxor

+0

“主线程是控制台应用程序”为什么?什么样的业务需求需要这种解决方案架构?至于其他方面,多个条款的句子往往不适合需求说明,因为它们难以完全按照作者/演讲者的意图解析;试着写一个句子来解释你需要什么。 –

+0

嘿,没有什么业务相关的。这个应用程序太老了,太多限制了控制台系统,因为我只需要一个窗体来显示就没有任何意义了。 – FrozenHaxor