Thread.Sleep() - для какого потока вызывается? - C#
Формулировка задачи:
Почему по вызову Thread.Sleep зависает основной поток,а не второстепенный?
/* /* * Сделано в SharpDevelop. * Пользователь: User * Дата: 28.01.2017 * Время: 18:00 * * Для изменения этого шаблона используйте Сервис | Настройка | Кодирование | Правка стандартных заголовков. */ using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Threading; namespace Game_Test { /// <summary> /// Description of GameInterface. /// </summary> public partial class GameInterface : UserControl { Booxes box; public bool flag = false; public GameInterface() { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); box = new Booxes(MainForm.MainPath); // // TODO: Add constructor code after the InitializeComponent() call. // } void GameInterfacePaint(object sender, PaintEventArgs e) { if(!flag) { flag = true; DrawBooxes(e); } else { while(true) { DrawBooxes(e); Thread.Sleep(10000); } } } void DrawBooxes(PaintEventArgs e) { int x = 0; int y = 0; for (int i = 0;i<500;i++) { for (int j = 0;j<500;j++) { e.Graphics.DrawImage(box.Box_Image,new Point(x,y)); y+=21; } x+=21; y=0; } } } }
/* * Сделано в SharpDevelop. * Пользователь: User * Дата: 28.01.2017 * Время: 18:00 * * Для изменения этого шаблона используйте Сервис | Настройка | Кодирование | Правка стандартных заголовков. */ using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Threading; namespace Game_Test { /// <summary> /// Description of MainForm. /// </summary> /// class Inform { } public partial class MainForm : Form { public const string MainPath = @"C:\Users\User\Documents\SharpDevelop Projects\Game_Test\Game_Test\Ресурсы\коробка.png"; GameInterface gameinterface; Settings settings; Thread gameplay; bool flag = false; public MainForm() { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); gameinterface = new GameInterface(); settings = new Settings(); this.Controls.Add(gameinterface); this.AddOwnedForm(settings); gameinterface.Invalidate(); // // TODO: Add constructor code after the InitializeComponent() call. // } void Button1Click(object sender, EventArgs e) { if (!flag) { try { flag = true; gameplay = new Thread(gameinterface.Invalidate); gameplay.Start(); } catch(Exception ex) { MessageBox.Show(ex.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error); } } else { try { flag = !flag; gameplay.Abort(); /// } catch(Exception ex) { MessageBox.Show(ex.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error); } } } } }
Решение задачи: «Thread.Sleep() - для какого потока вызывается?»
textual
Листинг программы
class Game { public PointF Center { get; } public float Radius { get; } public float BallRadius { get; } public float RevolvingFrequency { get; } private double _timeElapsed; private PointF BallCenter { get { double angle = RevolvingFrequency * _timeElapsed / 1000; var ballCenter = new PointF((float)(Center.X + Radius * Math.Cos(angle)), (float)(Center.Y + Radius * Math.Sin(angle))); return ballCenter; } } public event Action<bool> GameOver; public void Click(float x, float y) { var ballCenter = BallCenter; if (Math.Pow(x - ballCenter.X, 2) + Math.Pow(y - ballCenter.Y, 2) <= Math.Pow(BallRadius, 2)) GameOver?.Invoke(true); else GameOver?.Invoke(false); } public void Update(TimeSpan dt) { _timeElapsed += dt.TotalMilliseconds; } public void Draw(Graphics g) { g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; var ballCenter = BallCenter; g.FillEllipse(Brushes.Red, ballCenter.X - BallRadius, ballCenter.Y - BallRadius, 2 * BallRadius, 2 * BallRadius); } public Game(PointF center, float radius, float frequency, float ballRadius) { Center = center; Radius = radius; RevolvingFrequency = frequency; BallRadius = ballRadius; } public void Restart() { _timeElapsed = 0; } } class MainForm: Form { public MainForm() { DoubleBuffered = true; Cursor = Cursors.NoMove2D; Size = new Size(400, 400); var game = new Game(new PointF(200, 200), 100, 3f, 20); var lastUpdate = DateTime.Now; var updater = new System.Windows.Forms.Timer(); game.GameOver += won => { updater.Enabled = false; if (won) { MessageBox.Show("You win!"); } else { MessageBox.Show("You loose!"); } game.Restart(); lastUpdate = DateTime.Now; updater.Enabled = true; }; Click += (s, a) => { var args = a as MouseEventArgs; game.Click(args.X, args.Y); }; updater.Interval = 1; updater.Tick += (s, a) => { var now = DateTime.Now; game.Update(now - lastUpdate); lastUpdate = now; Invalidate(); }; int count = 0; Paint += (s, a) => { game.Draw(a.Graphics); }; updater.Enabled = true; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д