C#线程 - 一个线程数组,其中每个线程包含一个带有图像的表单
问题描述:
我有一个包含五个线程的数组。每个线程都包含相同的表单,每个表单都放在不同位置的屏幕上(仍在使用该方法: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);
}
答
您的表单显示不正确,因为它们没有在带消息循环的线程上运行。一般规则是所有UI元素访问都必须在主UI线程上进行。
既然您打电话给Thread.Sleep(1000)
我打算假设您想在每个表单的初始显示之间等待1秒钟。在这种情况下,我会使用System.Windows.Forms.Timer
谁的Tick
事件将直接调用createForm
。启用计时器,让5 Tick
事件通过,然后禁用计时器。我认为根本不需要创建任何线程。
答
你的形式不显示的原因是因为你的主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 ...
}
这正是我所提出的一个例子 - 它不会看起来完全像这样的代码,但是这应该给你的执行步骤的想法。
答
我会建议以这种方式
来电节
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)
}
>这里是你的鱼... – DarkSquirrel42