原谅我的英语;线程有问题: 我有一个WinForm,里面有两个按钮(Play& Pause) 我希望当你按下PLAY按钮时,如果它创建了线程,思考并启动,并且PAUSE按钮暂停线程。 然后,如果线程暂停,按PLAY按钮将从其停止的位置恢复线程。 像电子游戏...... 在Java中,我成功地做了一些事情,
Runnable h = new MiHilo();
Thread t = new Thread(h);
public void PLAYActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PLAYActionPerformed
if (t.isAlive())
{
t.resume();
}
else
{
h = new MiHilo();
t = new Thread(h);
t.start();
}
}
private void PAUSEActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PAUSEActionPerformed
if (!t.isAlive())
{
JOptionPane.showMessageDialog(null, " ¿En qué está pensando?\nEs imposible pausar algo que no ha empezado.",
"David", JOptionPane.ERROR_MESSAGE);
}
else
{
t.suspend();
}
}
class MiHilo implements Runnable
{
public void run()
{
// Code here...
}
}
我如何在C#中做到这一点? 如果我想要,如果没有太多麻烦告诉我如何做一些基本的事情,暂停和恢复,一些简单的事情,如带有标签的单个WinForm,以及启动时的两个按钮(Play& Pause) label写为0,如果按下Play,它会启动一个调用函数的线程,该函数的变化范围为1-1000,睡眠为1秒,在标签上显示为文本,暂停,按下时会暂停此计数渐进式,然后戏剧会给,但不使用计时器......
希望不要问太多,用这个例子我可以根据自己的需要调整它。
感谢您的时间!
答案 0 :(得分:1)
你永远不应该使用暂停/恢复,无论是Java还是C#,因为只有你的线程知道什么时候可以安全地停止或暂停。
而是使用同步原语,例如事件来控制线程的执行。
以下是使用 WinForms 的一些示例(因此您只需要添加对 System.Windows.Forms 的引用):
using System.Threading;
using System.Windows.Forms;
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Label label = new Label { Dock = DockStyle.Top };
Button button = new Button { Text = "||", Dock = DockStyle.Bottom };
Form form = new Form();
form.Controls.Add(label);
form.Controls.Add(button);
bool @continue = true;
bool isRunning = true;
ManualResetEvent run = new ManualResetEvent(true);
int i = 0;
form.Load += (s, a) =>
{
ThreadPool.QueueUserWorkItem(o =>
{
while (@continue)
{
run.WaitOne();
label.Invoke((Action)(() => { label.Text = i++.ToString(); }));
Thread.Sleep(1000);
}
});
};
button.Click += (s, a) =>
{
isRunning = !isRunning;
if (isRunning)
run.Set();
else
run.Reset();
button.Text = isRunning ? "||" : ">>";
};
form.Disposed += (s, a) => @continue = false;
Application.Run(form);
}
}
}
因此,计算的线程(请注意,如果您想计算秒数,这根本不准确)每次检查它是否必须继续或等待使用“ WaitOne ”。
UI线程通过激活/停用事件来控制它:当您单击按钮时,切换事件状态。