Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2019, 14:18   #1
Rose16
Пользователь
 
Регистрация: 09.12.2016
Сообщений: 14
По умолчанию Синхронизация работы потоков

Привет! Помогите пожалуйста с задачей.
В приложение по примеру добавить редактор TextBox и две кнопки.
При щелчке на первую кнопку шарик с номером, указанным в TextBox
останавливается, а при щелчке на вторую продолжает движение
Код:
 using System;
using System.Collections.Generic;
using System.ComponentModel;using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace Balls
{
public partial class Form1 : Form
{
class Ball
{
int x, y; // координаты
int dx, dy; //приращение координат-определяет скорость
int w, h; //ширина высота шарика
public bool live; // признак жизни
public delegate void DlTp();// Объявление типа (делегат) и
//создание пока что пустой ссылки для организации в последующем
// с помощью ее вызова функции Invalidate()для главного потока
public DlTp dl;
public Thread thr; //Создание ссылки на потоковый объект
// потоковая функция
void FnThr()
{
while (live)
{ //здесь отражемся от границ области
if (x < 0 || x > 200) dx = -dx;
if (y < 0 || y > 200) dy = -dy;
//здесь пересчитываем координаты
x += dx;
y += dy;Thread.Sleep(100);//спим
dl(); //вызываем с помощью делегата Invalidate()
}
w = h = 0; //схлопываем шарик
dl(); //вызываем с помощью делегата Invalidate()
}
//функция рисования шарика
public void DrawBall(Graphics dc)
{
dc.DrawEllipse(Pens.Magenta, x, y, w, h);
}
//конструктор класса
public Ball(int xn, int yn, int wn, int hn, int dxn, int dyn)
{
x = xn; y = yn; w = wn; h = hn; dx = dxn; dy = dyn;//инициализируем
thr = new Thread(new ThreadStart(FnThr)); //создаем потоковый объект
live = true; //устанавливаем признак жизни
thr.Start(); //запускаем поток
}
}
Ball[] bl = new Ball[10];//массив пустых ссылок типа Ball
public Form1()
{
InitializeComponent();
for (int j = 0; j < bl.Length; j++)
{
//создаем потоковые объекты
bl[j] = new Ball(j, j * 10, 10, 10, j + 1, j + 1);
//подписываемся на событие
bl[j].dl += new Ball.DlTp(Invalidate);}
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
for (int j = 0; j < bl.Length; j++)
{
bl[j].DrawBall(e.Graphics);//рисуем
}
}
private void button1_Click(object sender, EventArgs e)
{
for (int j = 0; j < bl.Length; j++)
{
bl[j].live = false;// Уничтожаем потоки
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
for (int j = 0; j < bl.Length; j++)
{
bl[j].live = false;//уничтожаем потоки
}
}
}
}
Rose16 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация потоков Gdasar Windows Forms 1 01.12.2016 13:23
Синхронизация потоков _ZixeL_ Общие вопросы Delphi 14 10.09.2015 22:23
Синхронизация потоков и VCL zumm Общие вопросы Delphi 3 14.08.2013 00:46
синхронизация потоков m_kostik Win Api 0 26.03.2010 23:56