- •Графикамен жұмыс істеу. Graphics класы.
- •GraphicsPath класы.
- •Практикалық мысал стандартты емес басқару элементтері
- •Реестр бөлімі
- •Реестр кілттері
- •Дескриптор немесе нұсқағыш жазылған құрылым
- •Графикалық беттегі объектілерді салу әдісінің класы
- •Кластың кейбір әдістері мен қасиеттері
- •Бөлшек координаталар арқылы көрінетін тіктөртбұрыш құрылымы
- •Басқару элементтеріне арналған практикалық мысал.
- •Үй тапсырмасы
- •Мьютекс, критикалық бөлім және синхрондаудың басқа бөліктері.
- •Практикалық мысал критикалық бөлім.
- •Мьютекске арналған практикалық мысал
Үй тапсырмасы
"Питон" ойынын тарату керек. Формада жылан жүгіріп жүр, негізгі міндеті белгілі бір уақыт аралығында берілген алмаларды жеуі керек. Алмалар саны қолданушы арқылы беріледі. Жылан ойын алаңынан шыға алмайды, тосқауылдардан өте алмайды және өз құйрығын баспайды.
Мьютекс, критикалық бөлім және синхрондаудың басқа бөліктері.
Синхрондау кластары System.Threading аймағында орналасқан. Mutex класының мұрагерлерін қарастырамыз:
Object
MarshalByRefObject
WaitHandle
Mutex
Мьютекс түріндегі объектілерді құру үшін мына конструкторларды қолдануға болады:
public Mutex();
public Mutex(bool);
public Mutex(bool, string, bool);
public Mutex(bool, string);
Мысалы: bool параметрі – true болады, егер шақырылған ағын мьютексті алса, кері жағдайда false болады; string параметрі – мьютекс аты, егер оны көрсетпесек мьютекс атсыз қолданылады; out bool параметрі true болады, егер шақырушы ағын мьютексті басқарса, кері жағдайда false болады.
Төмендегі функция:
public void ReleaseMutex();
мьютексті дыбыстық жағдайға келтіреді.
WaitHandle класының WaitOne әдісін қарастырамыз:
public virtual bool WaitOne();
public virtual bool WaitOne(int, bool);
public virtual bool WaitOne(TimeSpan, bool);
WaitOne кейбір объектілердің дыбыстық жағдайға өтуін күтеді. Нұсқалары уақыт бойынша ерекшеленеді. WaitHandle класының WaitAll функциясы барлық объектілердің дыбыстық жағдайға өтуін күтеді, WaitAny кем дегенде бір объектінің дыбыстық жағдайға өтуін күтеді.
C# ерекше бөлім 2 әдіспен анықталады: 1) lock кілттік сөзі қолданылады. Мысалы:
lock(this){
тело
}
2) System.Threading.Monitor класы қолданылады ( lock – осы кластың қысқартылған түрі). Мысалы:
Monitor.Enter(this);
тело
Monitor.Exit(this);
Практикалық мысал критикалық бөлім.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
// Ағын кластары орналасқан аймақ
using System.Threading;
namespace CriticalSection
{
///
/// Summary description for Form1.
///
public class CriticalSection : System.Windows.Forms.Form
{
// Деректер массиві
private int[] DataArray;
// Бүтін түр айнымалысы кажет жағдайды анықтайды
int Action = 0;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox Count;
private System.Windows.Forms.ListBox DataListBox;
private System.Windows.Forms.Label Summa;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Label MaxInfo;
private System.Windows.Forms.Label SummaInfo;
private System.Windows.Forms.Label MaxResult;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ListBox listBox1;
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;
public CriticalSection()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.DataListBox = new System.Windows.Forms.ListBox();
this.label1 = new System.Windows.Forms.Label();
this.Count = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
this.Summa = new System.Windows.Forms.Label();
this.SummaInfo = new System.Windows.Forms.Label();
this.button2 = new System.Windows.Forms.Button();
this.MaxInfo = new System.Windows.Forms.Label();
this.MaxResult = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.listBox1 = new System.Windows.Forms.ListBox();
this.SuspendLayout();
//
// DataListBox
//
this.DataListBox.Location = new System.Drawing.Point(8, 40);
this.DataListBox.Name = "DataListBox";
this.DataListBox.Size = new System.Drawing.Size(192, 199);
this.DataListBox.TabIndex = 0;
//
// label1
//
this.label1.Location = new System.Drawing.Point(8, 8);
this.label1.Name = "label1";
this.label1.TabIndex = 7;
this.label1.Text = "Данные";
//
// Count
//
this.Count.Location = new System.Drawing.Point(16, 272);
this.Count.Name = "Count";
this.Count.Size = new System.Drawing.Size(104, 20);
this.Count.TabIndex = 0;
this.Count.Text = "10";
//
// button1
//
this.button1.Location = new System.Drawing.Point(136, 272);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(136, 23);
this.button1.TabIndex = 3;
this.button1.Text = "Генерировать массив";
this.button1.Click += new System.EventHandler(this.OnGenerateClick);
//
// Summa
//
this.Summa.Location = new System.Drawing.Point(224, 8);
this.Summa.Name = "Summa";
this.Summa.TabIndex = 4;
this.Summa.Text = "Сумма элементов";
//
// SummaInfo
//
this.SummaInfo.Location = new System.Drawing.Point(224, 40);
this.SummaInfo.Name = "SummaInfo";
this.SummaInfo.TabIndex = 5;
//
// button2
//
this.button2.Location = new System.Drawing.Point(224, 120);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(256, 48);
this.button2.TabIndex = 6;
this.button2.Text = "Запустить потоки";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// MaxInfo
//
this.MaxInfo.Location = new System.Drawing.Point(392, 8);
this.MaxInfo.Name = "MaxInfo";
this.MaxInfo.Size = new System.Drawing.Size(100, 24);
this.MaxInfo.TabIndex = 7;
this.MaxInfo.Text = "Максимальное значение";
//
// MaxResult
//
this.MaxResult.Location = new System.Drawing.Point(392, 40);
this.MaxResult.Name = "MaxResult";
this.MaxResult.TabIndex = 8;
//
// label2
//
this.label2.Location = new System.Drawing.Point(8, 8);
this.label2.Name = "label2";
this.label2.TabIndex = 7;
this.label2.Text = "Данные";
//
// listBox1
//
this.listBox1.Location = new System.Drawing.Point(8, 40);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(192, 199);
this.listBox1.TabIndex = 0;
//
// CriticalSection
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(504, 309);
this.Controls.Add(this.MaxResult);
this.Controls.Add(this.MaxInfo);
this.Controls.Add(this.button2);
this.Controls.Add(this.SummaInfo);
this.Controls.Add(this.Summa);
this.Controls.Add(this.button1);
this.Controls.Add(this.Count);
this.Controls.Add(this.label1);
this.Controls.Add(this.DataListBox);
this.Controls.Add(this.label2);
this.Controls.Add(this.listBox1);
this.Name = "CriticalSection";
this.Text = "Критическая секция";
this.ResumeLayout(false);
}
#endregion
///
/// The main entry point for the application.
///
static void Main()
{
Application.Run(new CriticalSection());
}
private void OnGenerateClick(object sender, System.EventArgs e)
{
try
{
DataListBox.Items.Clear();
Random rnd = new Random();
int result = Convert.ToInt32(Count.Text);
DataArray = new int[result];
for(int i = 0;i<DataArray.Length;i++)
{
DataArray[i] = rnd.Next(0,100);
DataListBox.Items.Add(DataArray[i]);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message,"Қате !!!",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
private void button2_Click(object sender, System.EventArgs e)
{
// Ағындарды құру және жіберу !!!
Thread thread1 = new Thread(new ThreadStart(MakeAction));
Thread thread2 = new Thread(new ThreadStart(MakeAction));
Thread thread3 = new Thread(new ThreadStart(MakeAction));
// Ағындарды жіберу
thread1.Start();
thread2.Start();
thread3.Start();
}
///
/// Үш жағдайдың біреуін орындайды (қосу, ең үлкен мәнді іздеу, бір мәнге барлық элементтерді қою)
///
private void MakeAction()
{
// Критикалық бөлім басы
lock(this)
{
int Result = 0;
int CurMax = DataArray[0];
Random rnd = new Random();
int SetVal = rnd.Next(0,10);
switch(Action)
{
case 0:
for(int i = 0;i<DataArray.Length;i++)
{
Result+=DataArray[i];
}
SummaInfo.Text = Result.ToString();
break;
case 1:
for(int i = 1;i<DataArray.Length;i++)
{
if(DataArray[i]>CurMax)
CurMax = DataArray[i];
}
MaxResult.Text = CurMax.ToString();
break;
case 2:
DialogResult res=MessageBox.Show("OK басамыз және барлық массив элементтері тең болады" + SetVal,"Вопрос", MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
if(res==DialogResult.OK){
for(int i = 0;i<DataArray.Length;i++)
{
DataListBox.Items[i] = DataArray[i] = SetVal;
}
}
break;
default:
MessageBox.Show("Белгісіз мән", " Белгісіз мән
!!!", MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
break;;
}
Action++;
if(Action>2)
Action = 0;
}// Критикалық бөлім бітті
}
}
}
