0

对不起,我的英语;我有线程问题:我有一个 WinForm,里面有两个按钮(播放和暂停)我希望当你按下 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,以及启动标签时的两个按钮(播放和暂停)怎么办写为 0,如果点击 Play,它会启动一个线程,该线程调用一个函数,该函数具有从 1-1000 变化的函数,睡眠时间为 1 秒,以在标签上显示为文本,并暂停,按下时将暂停此计数渐进式,那么该剧将给出,但不使用计时器...

希望不要问太多,用那个例子我可以适应我想要的。

感谢您的时间!

4

1 回答 1

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 线程通过激活/停用事件来控制这一点:当您单击按钮时,事件状态被切换。

于 2013-06-16T22:18:20.970 回答