65.9K
CodeProject is changing. Read more.
Home

Managed threads in Managed C++

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (12 votes)

Apr 4, 2002

viewsIcon

109974

How to create threads in Managed C++

Introduction

Using Managed C++ to create threads is not as easy as C#. If you already tried to compile a Managed C++ program with threads, you know what I am talking about. 

Details

First, do not try to add the thread in the same class, it won't compile. The easiest way I personally found is to create a new managed class ( remember to add __gc in the beginning of the class declaration ). In these instance we'll call it CMyThreads. Why not? Every program should have a CMySomething as a class.

#pragma once

__gc class CMyThreads
{
public:
CMyThreads(void);
~CMyThreads(void);

void MyThreadProc();
void AddArguments(void* pArg1, void* pArg2)
void * m_FirstArgument ;
void * m_SecondArgument ;
};

One problem in managed C++ threads is the arguments. You must create a function to call before starting the thread if you want arguments. (See AddArguments above)

Calling the thread from another class:

foo()
{
    CMyThreads * pMyThread;
    pMyThread = new CMyThreads;
    pMyThread->AddArguments(Argument1, Argument2);
    ThreadStart * pThread = new ThreadStart(pMyThread, &CMyThreads::MyThreadProc);
    Thread *oThread = new Thread(pThread);
    oThread->Start();
}

Before we create ThreadStart you must call AddArguments if you want arguments on this thread. The thread will not begin until you call the member function Start()

#include "StdAfx.h"
#using <mscorlib.dll>

using namespace System;
using namespace System::Threading;

#include <stdio.h>
#include "mythreads.h"


CMyThreads::CMyThreads(void)
{
}

CMyThreads::~CMyThreads(void)
{
}

void CMyThreads::MyThreadProc()
{
    Console::WriteLine(S"Starting Thread... ");
    Thread::Sleep(5);
    pClass->ExternalFunction(/*Arguments*/);
    Console::WriteLine(S"Finishing Thread...");
}

void CMyThreads::AddArguments(void* pArg1, void* pArg2)
{
    m_FirstArgument = pArg1;
    m_SecondArgument = pArg2;
}

Conclusion

Remember to Sleep to allow the main process to continue. Also you put anything you like in MyThreadProc() you can also call a function in another class. I hope you have fun!