RSS

C#: Thread & MethodInvoker

04 Sep

Сайн байна уу залуусаа.

Өмнө нь Thread гээд л жижиг post бичиж байсан даа. Тэгвэл энэ удаад жаахан дэлгэрүүлье гэж бодлоо.

Хүмүүс Tread – ийн тухай онол ярьвал ингэж ярих байх.
Чиний хийж байгаа програм бол аав процесс, Thread бол хүү процесс. Аав хэдэн ч хүүтэй байж болно. Аав байхгүй бол хүү байхгүй гээд л ярих байсан байх … 😛

C# дээр бол :
using System.Threading;

private void Thread_Job()
{
this.Button1.Text = “товч”;
}

ThreadStart ts = new ThreadStart(Thread_Job);
Thread t = new Thread(ts);
t.Start();

// Thread_Job – гэх функцыг ажиллуулахад бол ингээд л боллоо. Тухайн Thread_Job функц ямарч асуудалгүй чиний програмыг гацаахгүй ажиллах ба функц дуусахад Thread зогсоно. Гэвч нэг асуудал гарч ирсэн. Юу вэ гэвэл: Thread_Job функ дотороо юу ч бичсэн болох боловч үндсэн Main Thread рүүгээ хандах боломжгүй болчихсон. хамгийн энгийнээр л гэхэд this.Button1.Text = “товч”; гэх код ажиллахгүй. Үүнийг шийдхийн тулд MethodInvoker – ийг ашигладаг юм байна. Жишээ нь:

private void Thread_Job()
{
this.Invoke((MethodInvoker)delegate() { this.Button1.Text = “товч”; });
}

Гэвэл харин ажиллана.

Тэгвэл харин:

private void TextChanger()
{
this.Button1.Text = “товч”;
}

private void Thread_Job()
{
Invoke((MethodInvoker)delegate() { this.Button1.Text = “товч”; });
TextChanger();
}

гэж бичвэл бас л ажиллахгүй бөгөөд

private void Thread_Job()
{
this.Invoke((MethodInvoker)delegate() { this.Button1.Text = “товч”; });

Invoke(new MethodInvoker(TextChanger));

//Өөрөөр

MethodInvoker tch = new MethodInvoker(TextChanger);
Invoke(tch);
}

гэвэл харин ажиллана.

Анхааруулхад:Invoke ашиглаж байх үед Thread.Abort() хийж алдаа зааж байна лээ шүү. Тухайн функ дуусахад Thread аяндаа зогсоно.
Хэрэг болох болтугай… амжилт…😛

 
10 Comments

Posted by on September 4, 2009 in .NET Visual studio, Learner, My

 

10 responses to “C#: Thread & MethodInvoker

  1. dokdokay

    December 22, 2013 at 4:20 pm

    По данным Всемирной организации здравоохранения, привычка употреблять спиртное является причиной почти 4 % всех смертей в мире. От злоупотребления спиртными напитками погибает больше населения, чем от СПИДа, туберкулеза и войн. Наибольшее влияние употребления алкоголя на летальность наблюдается в РФ и странах СНГ: каждый пятый человек в них умирает от причин, связанных с употреблением спиртного

     
  2. aibolitbis

    December 14, 2013 at 1:36 pm

    Космос устроен очень интересно, а челеовек устройством подобен космосу. Веды содержат информацию исчерпывающую обо всем.

     
  3. annyfa

    August 24, 2013 at 9:38 am

    Всем привет! Я недавно зарегистрировалась Вконтакте, а друзей там почти нет, не с кем поболтать.
    Если кому-то тоже скучно и хочется пообщаться, добавляйтесь (особенно, если вы из Новосибирска) в друзья, будем дружить )))))
    http://vk.com/id219037808

     
  4. Disuackkami

    March 19, 2011 at 4:26 am

    thanks

     
  5. aagii

    January 17, 2010 at 3:49 pm

    Что вы говорим? человек. Если вы хотите поговорить с нами, просто измените Ваш пить, xaxaxax

     
  6. AndraaDejavu

    January 17, 2010 at 3:43 am

    Музыкальный ансамбль Deja Vu – это коллектив виртуозных вокалистов и музыкантов на праздник.
    Deja Vu– лидер в области музыкального сопровождения праздников, дней рождения, шоу-программ, копроративов, торжеств и дней рождения.
    В копилке музыкальной группы Дежа вю около 3 тыс. песен.
    Живая музыка. Ждаз, ретро, хиты 70-80-90-х, диско, поп, шансон, фоновое сопровождение .
    Музыканты Deja Vu обладает мощной качественной аппаратурой, позволяющей заполнить приятным уху звуком как небольшое помещение (фуршет), так и огромное помещение (корпоратив до тысячи человек).

    Игорь +7 916 623 4047, Андрей +7 910 483 8294

     
  7. bokhoo

    November 11, 2009 at 2:30 pm

    харин тийм, баярлалаа та 2т

     
  8. delgerdalai

    November 11, 2009 at 2:12 pm

    ene post-n buruu bichsen zuiliig joshua zov bolgoj ogson bn, good.
    UI threadin xuvid ingej invoke xiij oor thread-s oorchilxoos gadna, Control.CheckForIllegalCrossThreadCalls = false; bolgoj bolno, xaraad l oilgogdoj bgaa biz dee. ingesen toxioldold thread dotoros UI object ruu shuud xandaj bolno.

     
  9. bokhoo

    September 8, 2009 at 4:30 pm

    nice онолын үүднээс ярьж байна. чико tnks

     
  10. joshua

    September 8, 2009 at 4:16 pm

    Дээр нь нэмээд хэлэхэд, өөр thread дээрээс яагаад main thread рүү хандаж болдоггүй юм бэ гэвэл windows program-ууд нь message loop ашиглан ажилдаг юм. Програм эхлэх үед UI thread буюу гол thread нь нэг message queue үүсгэдэг ба үүнийг TLS буюу thread local storage ашиглан өөртөө хамаатуулдаг юм. Өөр thread дээр this.button1.Text = “30”; гэж өгөх үед тухайн button1 контрол дотоод өгөгдлөө өөрчлөх боловч шинээр өөрийгөө зурах хүсэлтээ message болгон тухайн thread-ийн message queue рүү post хийдэг юм. Гэтэл шинэ thread ямар ч message queue, loop байхгүй тул тухайн контрол гацсан юм шиг болдог. Мөн .NET орчинд тухайн контрол өөр thread – ээс дуудагдвал алдаа өгдөг болсон байх шиг байна лээ. Invoke нь харин тухайн функцыг тухайн контрол үүссэн тэр thread дээр дууддаг юм. Гэхдээ үүнийг дуудахдаа контролын HandleCreated нь true байх ёстойг шалгах хэрэгтэй үгүй бол олоход хэцүү алдаа гарж, гацдаг юм шүү … Хэхэ хэтэрхий их юм биччих үү дээ …

     

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: