Visual C++ .NET/Thread/Join

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Joining Threads

<source lang="csharp">

  1. include "stdafx.h"

using namespace System; using namespace System::Threading; ref class MyThread { public:

   static void ThreadFunc(Object ^Name);

}; void MyThread::ThreadFunc(Object ^Name) {

   for (int i = 0; i < 5; i++)
   {
       Console::WriteLine("{0} {1}", Name, i.ToString());
       Thread::Sleep(1);
   }

} void main() {

   Thread ^thr1 =
       gcnew Thread(gcnew ParameterizedThreadStart(&MyThread::ThreadFunc));
   Thread ^thr2 =
       gcnew Thread(gcnew ParameterizedThreadStart(&MyThread::ThreadFunc));
   thr1->Start("Thread1");
   thr1->Join();
   thr2->Start("Thread2");
   Console::WriteLine("End of Main");

}

 </source>


Threads interrupt, suspend, join

<source lang="csharp">

  1. include "stdafx.h"

using namespace System; using namespace System::Threading; ref class MyThread { public:

   static void ThreadFunc1();
   static void ThreadFunc2();

}; void MyThread::ThreadFunc1() {

   Console::WriteLine("Before long sleep");
   try
   {
       Thread::Sleep(Timeout::Infinite);
   }
   catch(ThreadInterruptedException^){/*continue processing*/}
   Console::WriteLine("After long sleep");

} void MyThread::ThreadFunc2() {

   for (int i = 0; i < 5; i++)
   {
       Console::WriteLine("Thread {0}",i.ToString());
       Thread::Sleep(2);
   }

} void main() {

   Thread ^thr1 = gcnew Thread(gcnew ThreadStart(&MyThread::ThreadFunc1));
   Thread ^thr2 = gcnew Thread(gcnew ThreadStart(&MyThread::ThreadFunc2));
   Console::WriteLine("Sleep/interrupt thread");
   thr1->Start();
   Thread::Sleep(4);
   for (int i = 0; i < 4; i++)
   {
         Console::WriteLine("**Main2 {0}", i.ToString());
         Thread::Sleep(2);
   }
   thr1->Interrupt();
   thr1->Join();
   Console::WriteLine("\nSuspend/resume thread");
   thr2->Start();
   Thread::Sleep(4);
   thr2->Suspend();
   for (int i = 0; i < 4; i++)
   {
       Console::WriteLine("**Main1 {0}", i.ToString());
       Thread::Sleep(2);
   }
   thr2->Resume();

}

 </source>