Урсгалын багц

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

namespace MultiThreadConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i=1; i<=10; i++)
            {
                Thread thread = new Thread(Work);
                thread.Start(i);
                Thread.Sleep(200);
            }

            Console.ReadLine();
        }

        private static void Work(object i)
        {
            Console.WriteLine("Урсгалын id: {0}, параметр: {1}",
                Thread.CurrentThread.ManagedThreadId, i);
        }
    }
}

код бүхий жижигхэн консол програмыг харцгаая. Кодод 10 алхамтай циклийг эхлээд циклийн дотор шинэ урсгал үүсгээд түүнийг эхлүүлнэ. Дараа нь үндсэн урсгалд 200 милисекунд хүлээлтийг үүсгэнэ. Thread.Sleep(200); команд шинээр үүсгэн эхлүүлсэн thread урсгалд биш харин програмын үндсэн урсгалд хамааралтай гэдгийг сануулъя. Шинээр үүсгэх урсгал бүрд дамжуулж буй Work арга урсгалын id ба параметрийг консолд үзүүлнэ. Урсгалын id гэдэг нь програмыг ажлуулан буй орчноос урсгал бүрд олгох дугаар юм. Тухайн үед эхэлсэн урсгалын дугаарыг Thread.CurrentThread.ManagedThreadId шинжээр авч болно. Програмыг ажлуулбал

дээрх үр дүнг үзүүлнэ. Програмд 10 өөр урсгалыг үүсгээд урсгал бүрд циклийн алхамын дугаарыг дамжуулсан нь үр дүнгээс харагдана. Энд бид маш чухал нэг зүйлийг тооцоогүй. Учир нь урсгал үүсгэх, түүний устгалт, урсгал хоорондын шилжилт зэрэг нь компьютераас нилээд нөөц шаардсан ажиллагаа байдаг. Үүнийг тооцоогүй манай програм үйлдлийн системээс нилээд хэмжээний нөөцийг үр дүнгүй зарцуулах юм. Програмын ажиллагааны логикоос харвал циклд үүсгэж байгаа урсгал бүр эхний урсгалаа дууссаны дараа үүсгэгдэж байхаар бодолцон Thread.Sleep(200); командыг тавин өгсөн учраас ийм тохиолдолд хамаагүй бага нөөцийг зарцуулах боломж байгаа. Кодыг хэрхэн сайжруулах болох вэ? Энд бид урсгалын багцыг ашиглаж

    class Program
    {
        static void Main(string[] args)
        {
            for (int i=1; i<=10; i++)
            {
                ThreadPool.QueueUserWorkItem(Work, i);

                Thread.Sleep(200);
            }

            Console.ReadLine();
        }

        private static void Work(object i)
        {
            Console.WriteLine("Урсгалын id: {0}, параметр: {1}",
                Thread.CurrentThread.ManagedThreadId, i);
        }
    }

гэж хийе. Урсгалын багцын удирдлага ThreadPool статик классаар хийгддэг. Класст шинээр үүсгэгдсэн урсгалд биелэгдэх делегатыг хэрэгтэй бол параметрийн хамтаар дамжуулан өгдөг QueueUserWorkItem гэдэг арга бий. Урсгалын багц болон урсгалыг шууд үүсгэх хоёрын ялгаа гэвэл урсгалын багцаар удирдаж байхад шинэ урсгалыг биелүүлэх ажиллагааг шууд эхлүүлэхгүйгээр урсгалд ажиллах делегатыг дараалалд оруулан өгдөг. Энэхүү дараалал урсгалын багцад /ThreadPool/ байрлах бөгөөд делегат тухайн үед чөлөөтэй байгаа урсгалд биелэгдэх юм. Дараалалд буй делегатын ажиллах ээлж болоход чөлөөтэй урсгал байхгүй бол урсгалын багц шинэ урсгалыг үүсгэн өгдөг. Програмыг ажлуулаад кодын өөрчлөлт ямар дүн өгөхийг харвал

консолд дээрх үр дүн гарна. Өмнөх кодтой ижил ажиллагаа хийж буй өөрчлөлт хийсэн кодын ажиллагаанд 9, 10 гэсэн id -тай урсгалууд оролцож байгааг анхаарна уу. Өмнөх жишээнд 10 урсгал байсан бол одоо 2 урсгал болсноор бид үйлдлийн системийн нөөцийг 5 дахин хэмнэж чадлаа. Урсгалын багцад хэдэн урсгал байгаа, тэднийг ямар төлөвт оршин буйг та хэзээ ч урьдчилан мэдэж чадахгүй. Яг ийм шалтгаанаас үүдэн урсгалыг шууд үүсгэхээс урсгалын багцыг ашиглах нь хамаагүй үр дүнтэй ашигтай байдаг. Энэ давуу тал та олон урсгалыг эрчимтэй ашиглах программыг зохиох үед илүү мэдрэгдэнэ.

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

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

Мэдээллийн технологийн салбарын хөгжлийг дагаад кодлогчийн хэрэгцээ жилээс жилд өссөөр байна. Програмийн кодлогч болоход туслах зорилгоор сайтад орчин үед өндөр эрэлттэй байгаа хэлүүдийн хичээлүүдийг цувралаар оруулсаар байх болно. Аливаа зүйлийг сурах суурь бол таны хүсэл эрмэлзлэл гэдгийг Суралцах хир хэцүү вэ? нийтлэлийг уншаад эргэцүүлэн бодоорой.

Хичээлээр консолоос өгөгдөл оруулах, консолд өгөгдлийг үзүүлэхийг судлах болно.

Консолийн гаралт

Өмнөх хичээлүүдэд консолд мэдээлэл үзүүлэхдээ компиляторын Console.WriteLine аргыг хэрэглэсэн. Хэрвээ консолд мэдээллийг гаргах хэрэгтэй түүнийг Console.WriteLine аргад дамжуулах хэрэгтэй. Жишээ нь төслийн Program.cs файлд

string hello = "Сайн уу Монгол";
Console.WriteLine(hello);
Console.WriteLine("C# -д тавтай морил!");
Console.WriteLine("Баяртай Монгол...");
Console.WriteLine(24.5);

командуудыг (statement) өгөөд төслийг ажлуулбал консолд

гэж харуулна.

  Нээгдсэн тоо: 303 Бүртгүүлэх

.NET -д бүх классууд бүр бидний үүсгэсэн классууд, жишээ нь System.Int32 гэх мэтүүд суурь төрлүүд далд хэлбэрээр Object классаас үүсдэг. Кодод Object классийг сууриар зааж өгөөгүй байсан ч анхдагчаар далд хэлбэрээр Object класс удамшилтын шатлалын оройд байрладаг. Иймээс бүх төрлүүд, классууд System.Object класст тодорхойлогдсон аргуудыг хэрэгжүүлж болно. Эдгээр аргуудыг авч үзье.

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

ОХП-д классын тухай ойлголт чухал байр суурийг эзэлдэг. Иймээс классын төрлүүдийн талаар сайтар ойлгосон байх шаардлагатай. Хичээлээр бид битүүмжлэгдсэн, статик, абстракт классуудын талаар авч үзнэ. Классын эдгээр төрлүүдийг хөнгөнөөс нь хүнд рүү нь битүүмжлэгдсэн, статик, абстракт гэсэн дарааллаар судлана.

Битүүмжлэгдсэн буюу sealed класс

Классыг тэмдэглэх sealed түлхүүр үгийн орчуулга нь битүүмжлэгдсэн гэсэн байгаа юм. Орчуулга оновчтой болоогүй байж мэдэх тул sealed class гэсэн англи нэрээр нь тогтоон авбал илүү сайн. sealed түлхүүр үг юуг илэрхийлэх, хаана хэрхэн ашиглах вэ? Хэрвээ классыг sealed түлхүүр үгээр тэмдэглэсэн бол тэр эцэг класс болж болохгүй. Өөрөөр хэлбэл sealed классаас удамшуулж болохгүй. Иймээс удамшилтын гинж sealed түлхүүр үгээр тэмдэглэгдсэн класс дээр тасрах болно.

  Нээгдсэн тоо: 2497 Бүртгүүлэх

Энэ удаагийн хичээлээр бид generalization буюу ерөнхийлөл гэдэг төрөл бүрийн обьектуудын төлөв байдлын хэвийг тодорхойлох нилээд хүчирхэг хэрэгслийн талаар үзнэ.  

Ерөнхийлөл гэж юу вэ?

Ерөнхийлөл гэдэг бол класс эсхүл аргуудыг удирдах хувьсах өгөгдлийн төрөл юм. Ерөнхийлөл ашиглах өгөгдлийн төрлүүдийг урьдчилан тодорхойлохгүйгээр тэдгээрийг програмын явцад сүүлд тодорхойлох боломжийг олгодог. Үүнийг жишээгээр харцгаая. Бидэнд int төрлийн оролтын параметртэй string төрлийн гаралттай

string Move(int distance)

Move гэсэн арга байлаа гэж бодъё.

Үйл явдал /event/ тодорхой үйлдэл хийгдсэн талаар системд мэдэгддэг. Хэрвээ бид энэхүү үйлдлийг ажиглах хэрэгтэй бол яг энд…

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

 

Манай төсөл олон хуудсуудтай болон тэдгээрийн хооронд динамикаар шилжилт хийж байгаа ч тухайн үед шилжилт хийгдсэн хуудаст тохирох…

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

 

Зочин (Visitor) паттерн классуудыг өөрчлөхгүйгээр тэдгээрийн обьектуудын үйлдлийг тодорхойлох боломжийг олгоно. Зочин хэвийг ашиглахдаа классуудын хоёр ангилалыг тодорхойлно.…

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

 

Лямбда-илэрхийлэл нь нэргүй аргын хураангуй бичилтийг илэрхийлнэ. Лямбда-илэрхийлэл утга буцаадаг, буцаасан утгыг өөр аргын…

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

 

Кодийн сайжруулалт /рефакторинг/ хичээлээр програмийн кодоо react -ийн зарчимд нийцүүлэн компонентод салгасан.…

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

 

Хадгалагч (Memento) хэв обьектын дотоод төлвийг түүний гадна гаргаж дараа нь хайрцаглалтын зарчмыг зөрчихгүйгээр обьектыг сэргээх боломжийг олгодог.

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

 

Делегаттай нэргүй арга нягт холбоотой. Нэргүй аргуудыг делегатийн хувийг үүсгэхэд ашигладаг.
Нэргүй аргуудын тодорхойлолт delegate түлхүүр үгээр…

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

 

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

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

 

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас…

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

 
Энэ долоо хоногт

Кубын ирмэг a. Дээд талын төвийг суурийн оройтой холбоход үүсэх пирамидийн бүтэн гадаргуун талбайг ол.

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

 

A=(-2; 3; 5), B=(4; -1; 7) векторууд өгөгджээ. 3A-2B векторын координатуудын нийлбэрийг ол.

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

 

Утасны лавлах номыг дэлгэн 7 цифрээс бүрдсэн дугаарыг санамсаргүйгээр байдлаар сонгоход дугаарын сүүлийн дөрвөн цифрүүд ижил байх хувилбарын тоог ол.

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