Олон урсгал ямар хэрэгтэй вэ?

C# хэлний олон урсгал буюу Multithreading ухагдхууны талаар аьч үзье. Сэдэв өргөн хүрээтэй, нарийн, хүндэвтэр учраас нилээд хэдэн хичээлийг хамран судлах болно. Multithreading ухагдхууныг практик ажилд ихээр тохиолддог энгийн жишээнээс эхлэн авч үзье. Бидэнд удаан хугацаанд биелэгдэх ажиллагааг эхлүүлээд түүний явцыг хянах хэрэгтэй боллоо гэе.

Үүнийг загварчлахын тулд прогресс бар, Эхлэх, Зогсоох гэсэн хоёр товч бүхий энгийн форм үүсгэе.

Эхлэх товч ажиллагааг эхлүүлнэ гэдэг нь ойлгомжтой. Харин Зогсоох товч ажиллагааг дуусаагүй байхад зогсоох үүрэгтэй. C# дээр програм хэрхэн үүсгэх, формыг яаж зурахыг та өөрөө сайн мэдэж байгаа гэж бодож байна. Програмын үндсэн класс бол

using System;
using System.Threading;

namespace MultiThread
{
    class Worker
    {
        private bool _cancelled = false;

        public void Cancel()
        {
            _cancelled = true;
        }

        public void Work()
        {
            for (int i = 0; i <= 99; i++)
            {
                if (_cancelled)
                    break;
                Thread.Sleep(50);
                ProcessChanged(i);
            }
            WorkCompleted(_cancelled);
        }

        public event Action<int> ProcessChanged;

        public event Action<bool> WorkCompleted;
    }
}

код бүхий ямар нэгэн удаан хугацаанд биелэгдэх ажиллагааг үзүүлэх Worker юм. Класс хэсэг элементээс бүрдэнэ. Эхнийх нь бол ажиллагааг цуцлагдсан эсэхийг заах private хэлбэрийн _cancelled талбар. Талбарт утга олгох Cancel нээлттэй арга удаан хугацаанд биелэгдэх ажиллагааг програмаас зогсоох командыг өгөхөд _cancelled талбарт true утгыг өгөх юм. Классын үндсэн арга Work урт хугаацаатай хийгдэх ажиллагааг төлөөлнө. Арга ердийн цикл эхлүүлээд цикл дотроо _cancelled талбарыг шалгана. Хэрвээ талбарын утга true буюу ажиллагааг цуцалсан бол циклийн ажиллагааг тэр дор нь break командаар зогсооно. Цааш Thread.Sleep(50) командаар бид хийгдэж байгааг ажиллагааг харуулж байгаа хэрэг. Энд урсгал эсхүл багцтай /thread/ ажилладаг эхний аргатай танилцаж байгаа. Sleep арга тухайн үед ажиллаж байгаа урсгалыг заагдсан тооны миллисекундээр зогсоодог. Кодод бид ажиллагааны логикийг төлөөлүүлэн thread -ыг 50 миллисекунд зогсоосон хэрэг. Бодит програмд үүний оронд ямар нэгэн үйлдлийг хийх нь ойлгомжтой. Програм тодорхой үйлдлийг хийсний дараа үйл явцыг ажиглахаар /сонсох/ бүртгүүлсэн бүртгүүлэгчдэд мэдэгдэхийн тулд зохих ажиллагааны үйл явцыг дуудах хэрэгтэй. Циклээс гараагүй учраас ажиллагаа нэг алхамаар урагшилсанг мэдэгдэхийн тулд ProcessChanged үйл явцад циклийн тоолуурыг дамжуулан дуудна. Цикл break командаар эсхүл ердийн явцаараа дууссан эсэхээс үл хамааран WorkCompleted үйл явцад бүртгүүлсэн бүх бүртгүүлэгчдэд ажиллагаа ердийн эсхүл цуцлагдсанг мэдэгдэхийн тулд түүнд _cancelled талбарын утгыг дамжуулан дуудна. Классын төгсгөлд үйл ажиллагааны явцыг ажиглагчдад мэдээллэх ProcessChanged, WorkCompleted хоёр үйл явцыг /event/ зарласан. ProcessChanged үйл явц ажиллагаа ямар нэгэн байдлаар урагшилсанг харин WorkCompleted нь ажиллагаа дууссанг илтгэнэ. Үндсэн классын ажиллагааны логик энгийн учраас таныг ойлгосон гэж үзээд програмын формын кодыг

namespace MultiThread
{
    public partial class MainForm : Form
    {
        private Worker _worker;

        public MainForm()
        {
            InitializeComponent();

            butStart.Click += butStart_Click;
            butStop.Click += butStop_Click;
        }

        private void butStart_Click(object sender, EventArgs e)
        {
            _worker = new Worker();
            _worker.ProcessChanged += _worker_ProcessChanged;
            _worker.WorkCompleted += _worker_WorkCompleted;

            butStart.Enabled = false;

            _worker.Work();
        }

        private void _worker_ProcessChanged(int progress)
        {
            progressBar.Value = progress;
        }

        private void _worker_WorkCompleted(bool cancelled)
        {
            string message = cancelled ? "Ажиллагаа цуцлагдсан" : "Ажиллагаа дууссан";
            MessageBox.Show(message);
            butStart.Enabled = true;
        }

        private void butStop_Click(object sender, EventArgs e)
        {
                  if (_worker != null)
                    worker.Cancel();
        }
    }
}

харцгаая. Эхлээд програмын бүх ажиллагаа нэг багцад /thread/ явагдах синхрон үйл ажиллагааг авч үзье. Формд үндсэн Worker класс төрлийн _worker хувьсагчийг зарласан. MainForm аргад формын Эхлэх, Зогсоох хоёр товчийг дарах үйл явцад бүртгүүлсэн. Үндсэн ажиллагаа butStart_Click аргад явагдана. Аргад Worker классын хувийг /обьект/ үүсгээд түүний ProcessChanged, WorkCompleted үйл явцуудад бүртгүүлнэ. Дараа нь Эхлэх товчийг дарсны дараа хэрэглэгч түүнийг форм дээрээс дахин дахин даруулахгүйн тулд butStart.Enabled = false; гэж идэвхигүй болгоод Worker классын Work аргыг дуудан ажиллагааг эхлүүлнэ. Worker классын үйл явцуудын боловсруулагчид юу хийгдэх вэ? WorkCompleted үйл явц Worker классын ажиллагаа дууссаны дараа үүснэ. Бид ажиллагааг цуцалсан эсэх cancelled хувьсагчийн утга true байвал Ажиллагаа цуцлагдсан харин утга false байвал Ажиллагаа дууссан гэсэн мэдээллийг үзүүлнэ. Үүгээр таны програмын ажиллагааны төлвөөс хамааран ямар ажиллагааг хийхийг харуулах гэсэн юм. Сургалтын жишээнд бид энгийн байлгах үүднээс текстийг дэлгэц дээр харуулаад хэрэглэгч ажиллагааг дахин явуулах боломжийг хангах зорилгоор Эхлэх товчийг идэвхитэй болгосон. ProcessChanged үйл явцын боловсруулагчид прогрес барын утганд түүнд дамжин ирсэн параметрийн утгыг олгосон. Зогсоох товчийг дарахад butStop_Click арга дуудагдах бөгөөд Worker классын хувь /обьект/ _worker үүссэн байвал түүний Cancel аргыг дуудна. Кодыг ажлуулаад Эхлэх товчийг дарвал

ажиллагаа явагдаж байгааг прогресс бар харуулах боловч бид формыг удирдаж чадахгүй. Хэдийгээр Зогсоох товч идэвхитэй байгаа ч түүн дээр даралт хийх боломжгүй. Програм синхрон горимд буюу форм, ажиллагааны процесс хоёр нэг багцад /thread/ ажиллаж байхад үндсэн процесс форм дээрх ямар нэгэн үйлдлийг бүрэн хаадаг. Өөрөөр хэлбэл хэрэглэгчийн форм дээр хийсэн үйлдлийг ердөө хүлээн авахгүй. Яагаад гэвэл Эхлэх товчийг даран ажиллагааг эхлүүлсний дараа бүх нөөцийг тухайн ажиллагаанд өгөөд график интерфейст юу ч үлдээгүйтэй холбоотой. Иймээс Эхлэх товчийг даран эхлүүлж буй ажиллагааг тусдаа урсгалд /thread/ явуулах хэрэгтэй гэсэн дүгнэлтэд хүрнэ.

Дараагийн хичээлүүдэд олон урсгалыг үүсгэн удирдах аргуудын талаар дэлгэрэнгүй авч үзэх болно.

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 131 Төлбөртэй

Хувьсагчид утгыг хадгалдаг бол аргууд тодорхой үйлдлийг хийх командуудын багцыг агуулдаг. Үнэндээ арга гэдэг нь тодорхой үйлдлийг хийх нэрлэгдсэн кодийн блок.
Аргын ерөнхий иодорхойлолт

[модификатор] буцаах_утгын_төрөл аргын_нэр([параметрүүд])
{
    // аргын бие
}

байна. Модификатор, параметрүүд заавал байх албагүй.

  Нээгдсэн тоо: 71 Төлбөртэй

Өмнөх хичээлүүдэд int, byte, double, string, object гэх мэтийн өгөгдлийн төрлүүдийг үзсэн. Үүний зэрэгцээ структур, тооллого /enum/, класс зэрэг нарийн төрлүүдийг ч үзсэн. Энэ бүх төрлүүдийг утгын төрлүүд (утгатай төрлүүд ч гэж бас нэрлэдэг) (value types) ба холбоосын төрлүүд (reference types) гэсэн ангилалд хувааж болно. Эдгээрийн ялгааг ойлгох нь чухал.

  Нээгдсэн тоо: 103 Төлбөртэй

switch/case бүтэц илэрхийллийн утгыг утгуудын багцтай харьцуулан утга тохирсон бол тодорхой кодийг биелүүлдэг.

switch бүтцийн албан ёсны тодорхойлолт

switch (илэрхийлэл)
{
    case утга1:
        илэрхийллийн утга утга1-тэй тохирох үед ажиллах код
        break;
    case утга2:
        илэрхийллийн утга утга2-тэй тохирох үед ажиллах код
        break;
    //.............
    case утгаN:
        илэрхийллийн утга утгаN-тэй тохирох үед ажиллах код
        break;
    default:
        илэрхийллийн утга утгуудын багцад байхгүй үед ажиллах код
        break;
}

switch түлхүүр үгийн араас хаалтад харьцуулах илэрхийллийг өгнө.

  Нээгдсэн тоо: 401 Нийтийн

Өнөө үед мэдээллийн технологийн салбарт эрэлттэй, эрчимтэй хөгжүүлэлттэй, хамгийн хүчирхэг хэлүүдийн нэг бол програмчлалын C# хэл юм. Хэл дээр десктопийн жижигхэн програмаас эхлээд өдөрт сая сая хэрэглэгчид үйлчлүүлдэг том хэмжээний веб портал, сервисүүд гээд маш олон төрлийн програмуудыг боловсруулж байна.
C# залуу хэл биш бөгөөд .NET платформ хөгжлийн урт замыг туулсан. 2002 оны 2-р сард Microsoft Visual Studio .NET -тэй зэрэг хэлний анхны хувилбар гарсан.

Класс ба структурт ердийн талбар, арга, шинжүүдээс гадна статик талбар, арга, шинжүүд байж болдог. Статик талбар, арга, шинжүүд…

Нээгдсэн тоо : 45

 

Хичээлээр useState -тэй тун төстэй useRef хукийн талаар авч үзье. useRef хукийн онцлог ашиглалтыг компонент хэдэн удаа дахин…

Нээгдсэн тоо : 43

 

Хүүхдүүд тооны хичээлийг анхнаасаа зөв ойлгон сураагүйгээс анги ахих тусмаа математикийн хичээлийнн хоцрогдолоос болоод дургүй болох тал байдаг.…

Нээгдсэн тоо : 103

 

Нийтлэлээр графикийн хэвүүдийн /GUI pattern/ түүхийг авч үзье. Боловсруулалтын графикийн хэвүүдийг 30 гаруй жилийн туршид боловсруулж байгаа бөгөөд…

Нээгдсэн тоо : 82

 

Хааяа өөр өөр параметрүүдийн багцтай нэг аргыг үүсгэх шаардлага гардаг. Ирсэн параметрүүдээс хамааран аргын тодорхой хэрэгжүүлэлтийг хэрэглэнэ. Ийм…

Нээгдсэн тоо : 81

 

Ямарч програмын ажиллагааны чухал хэсэг бол төрөл бүрийн мэдээллийн боловсруулалт, тэдгээртэй ажиллахтай холбоотой байдаг. Иймээс энэ хичээлээс vuejs

Нээгдсэн тоо : 65

 

Хичээлээр react -ийн хукуудаас их өргөн ашиглагддаг useEffect -ийн талаар авч үзье. useEffect -ийн ажиллагааг судлах хуудасны кодийг

Нээгдсэн тоо : 61

 

Илэрхийлэл бол математикийн хэлний үндэс болсон суурь ойлголтуудын нэг. Математикийн илэрхийллийг тооцооны алгоритм, аксиом, теорем, бодлогын нөхцлүүд гээд…

Нээгдсэн тоо : 82

 

Програм зохиох бол нарийн төвөгтэй ажил. Ямар ч програмын хувьд өөрийн хийх ажлаа гүйцэтгэхийн чацуу цаашдаа хөгжих, ажлын…

Нээгдсэн тоо : 74