2011-11-23 102 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) 
    }