Visual C++ .NET/Thread/Join

Материал из .Net Framework эксперт
Версия от 12:06, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Joining Threads

 
#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");
}


Threads interrupt, suspend, join

 
#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();
}