C#线程-线程数组,其中每个线程包含一个带有图像的窗体

C#线程-线程数组,其中每个线程包含一个带有图像的窗体,c#,arrays,multithreading,forms,C#,Arrays,Multithreading,Forms,我有一个由五个线程组成的数组。每个线程都包含相同的表单,每个表单都放在屏幕上不同的位置(仍在使用该方法:P) 我试图让每个表单在其他表单完成放置之前加载其内容(图像)。目前,这适用于第一种形式,但其他形式是空白或消失:P 最初会放置每个表单,但该方法需要在显示所有表单内容之前完成 任何帮助都将不胜感激,谢谢:) 公共部分类:FRM:Form { 整数=0; 公营机构 { 初始化组件(); startThreads(); } 私有void TrollFrm_加载(对象发送方,事件参数e) { }

我有一个由五个线程组成的数组。每个线程都包含相同的表单,每个表单都放在屏幕上不同的位置(仍在使用该方法:P)

我试图让每个表单在其他表单完成放置之前加载其内容(图像)。目前,这适用于第一种形式,但其他形式是空白或消失:P

最初会放置每个表单,但该方法需要在显示所有表单内容之前完成

任何帮助都将不胜感激,谢谢:)

公共部分类:FRM:Form
{
整数=0;
公营机构
{
初始化组件();
startThreads();
}
私有void TrollFrm_加载(对象发送方,事件参数e)
{
}
私有void TrollFrm_FormClosing(对象发送方,FormClosingEventArgs e)
{
e、 取消=真;
}
public void startThreads()
{
线程[]线程数组=新线程[5];
对于(int i=0;i<5;i++)
{
ThreadArray[i]=新线程(新线程开始(createForm));
ThreadArray[i].Start();
}
}
public void createForm()
{
形式frm=新的frm();
Random randomX=新的Random();
Random randomY=新的Random();
数字++;
int-xValue;
int值;
如果(数字%2==0)//数字是偶数。
{
xValue=(转换为32(randomX.Next(11920))+200;
yValue=(Convert.ToInt32(randomY.Next(11080))-200;
}
否则//数字不是偶数。
{
xValue=(Convert.ToInt32(randomX.Next(11920))-200;
yValue=(Convert.ToInt32(randomY.Next(11080))+200;
}
frm.Show();
frm.位置=新点(X值,Y值);
睡眠(1000);
}

表单未显示的原因是,您在主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 ...
}

这只是我所建议的一个示例—代码中的内容与此不完全相同,但这应该可以让您了解执行步骤。

您的表单没有正确显示,因为它们没有在带有消息循环的线程上运行。一般规则是,所有UI元素访问都必须在主UI线程上进行。


因为您调用了
Thread.Sleep(1000)
我将假设您希望在每个表单的初始显示之间等待1秒。在这种情况下,我将使用
系统.Windows.Forms.Timer
谁的
Tick
事件将直接调用
createForm
。启用计时器,让5个
Tick
事件通过,然后禁用计时器。我认为没有必要o创建任何线程。

我建议以这种方式使用Thread.Sleep(1000)

呼叫部分

    for (int i = 0; i < 5; i++)
    {
        ThreadArray[i] = new Thread(new ThreadStart(createForm));
        ThreadArray[i].Start();
    }
    Thread.Sleep(1000);
>这是你的鱼。。。
    for (int i = 0; i < 5; i++)
    {
        ThreadArray[i] = new Thread(new ThreadStart(createForm));
        ThreadArray[i].Start();
    }
    Thread.Sleep(1000);
    while(!something)
    {
         Thread.Sleep(1000)
    }