2011-11-23 100 views
0

我有一個包含五個線程的數組。每個線程都包含相同的表單,每個表單都放在不同位置的屏幕上(仍在使用該方法:P)。C#線程 - 一個線程數組,其中每個線程包含一個帶有圖像的表單

我試圖讓每個表單在其他表單完成放置之前加載其內容(圖像)。目前這適用於第一種形式,但其他則爲空白或消失:P

最初將放置每個表單,但在顯示所有表單內容之前該方法需要完成。

任何幫助,將不勝感激,謝謝:)

public partial class TrollFrm : Form 
{ 
    int number = 0; 

    public TrollFrm() 
    { 
     InitializeComponent(); 

     startThreads(); 

    } 

    private void TrollFrm_Load(object sender, EventArgs e) 
    { 

    } 

    private void TrollFrm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     e.Cancel = true; 
    } 

    public void startThreads() 
    { 
     Thread[] ThreadArray = new Thread[5]; 

     for (int i = 0; i < 5; i++) 
     { 
      ThreadArray[i] = new Thread(new ThreadStart(createForm)); 

      ThreadArray[i].Start(); 
     } 
    } 

    public void createForm() 
    { 
     Form frm = new TrollChildFrm(); 

     Random randomX = new Random(); 

     Random randomY = new Random(); 

     number++; 

     int xValue; 

     int yValue; 

     if (number % 2 == 0) //number is even. 
     { 
      xValue = (Convert.ToInt32(randomX.Next(1, 1920))) + 200; 

      yValue = (Convert.ToInt32(randomY.Next(1, 1080))) - 200; 
     } 

     else //number is not even. 
     { 
      xValue = (Convert.ToInt32(randomX.Next(1, 1920))) - 200; 

      yValue = (Convert.ToInt32(randomY.Next(1, 1080))) + 200; 
     } 

     frm.Show(); 

     frm.Location = new Point(xValue, yValue); 

     Thread.Sleep(1000); 
    } 
+1

><((((º>這裏是你的魚... – DarkSquirrel42

回答

0

您的表單顯示不正確,因爲它們沒有在帶消息循環的線程上運行。一般規則是所有UI元素訪問都必須在主UI線程上進行。

既然您打電話給Thread.Sleep(1000)我打算假設您想在每個表單的初始顯示之間等待1秒鐘。在這種情況下,我會使用System.Windows.Forms.Timer誰的Tick事件將直接調用createForm。啓用計時器,讓5 Tick事件通過,然後禁用計時器。我認爲根本不需要創建任何線程。

0

你的形式不顯示的原因是因爲你的主UI線程上的一個方法內運行。相反,你可以創建一個方法,生成一個新的表單並在另一個線程上以特定的時間間隔啓動它(確保表單處理在主UI線程上完成)。所以,你可以這樣做:

(Pseudo Code) 
private const int TIME_THRESHOLD = 100; 

int mElapsedTime = 0; 
Timer mTimer = new Timer(); 

.ctor 
{ 
    mTimer.Elapsed += mTimer_Elapsed; 
} 

private void mTimer_Elapsed(...) 
{ 
    mElapsedTime++; 

    if (mElapsedTime >= TIME_THRESHOLD) 
    { 
     mElapsedTime = 0; 

     SpawnForm(); 
    } 
} 

private void SpawnForm() 
{ 
    // Make sure your running on the UI thread 
    if (this.InvokeRequired) 
    { 
     this.BeginInvoke(new Action(SpawnForm)); 
     return; 
    } 

    // ... spawn the form ... 
} 

這正是我所提出的一個例子 - 它不會看起來完全像這樣的代碼,但是這應該給你的執行步驟的想法。

0

我會建議以這種方式

來電節

for (int i = 0; i < 5; i++) 
    { 
     ThreadArray[i] = new Thread(new ThreadStart(createForm)); 
     ThreadArray[i].Start(); 
    } 
    Thread.Sleep(1000); 

而且在執行的線程的工作方法使用了Thread.Sleep(1000)。

while(!something) 
    { 
     Thread.Sleep(1000) 
    }