2013-08-16 211 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