About threads in VC++
Maheshwar Gundelly -- gundelly@enuxsa.eas.asu.edu Sunday, April 14, 1996 Hi, Environment : Windows NT Version :3.51 VC++ 4.0 I want to create threads in my VC++ program. Does any one can help me with some code as how to create threads in VC++ with AfxBeginThread. I want to have thread function and calling functions to be the members functions of a class. Note : Need an example if possible Thank you, Mahesh
Mike Blaszczak -- mikeblas@msn.com Wednesday, April 17, 1996 [Mini-digest: 6 responses] From: owner-mfc-l@netcom.com on behalf of Maheshwar Gundelly Sent: Sunday, April 14, 1996 21:16 > Environment : Windows NT Version :3.51 VC++ 4.0 Thanks. > I want to create threads in my VC++ program. Does any one can help > me with some code as how to create threads in VC++ with AfxBeginThread. So, you're actually writing an MFC program and not just a C++ program? If you're writing just a plain C++ program, calling AfxBeginThread() is not a good idea. You shouldn't use AfxBeginThread() unless you're using MFC in your application. > I want to have thread function and calling functions to be the > members functions of a class. You can't do that. There's no way for the thread function to get a "this" pointer. You have to carefully work around that issue. I'd recomend, instead, that you use the _real_ MFC method of calling AfxBeginThread() with the RUNTIME_CLASS() info for a class you'd like to create. > Note : Need an example if possible Try the MUTEXES sample on your Visual C++ CD. .B ekiM TCHAR sz[] = _T("These words are my own: I don't speak for Microsoft"); -----From: Clarence ChiangAnyway, back to the question ... I think AfxBeginThread is overloaded, one version will take a pointer to a function, a pointer to the data which is the parameter(s) to the function and some other arguments as well. I will probably do something like this: class Worker { public: static void TheWorkingFunc( ... ) { ... } // I think this function must take a certain // parameter in order to pass to AfxBeginThread } ... Worker w( ... ); AfxBeginThread( ..., &Worker::TheWorkingFunc, (void *)&w, ...); .. That way you can group each thread in to different class. Hope that helps. Clarence Spider Island Software -----From: Ranjiv Sharma Environment : Windows NT Version :3.51 VC++ 4.0 >> I want to create threads in my VC++ program. Does any one can help >> me with some code as how to create threads in VC++ with AfxBeginThread. There are 2 overloaded AfxBeginThread() fnuctions. One is for a UI thread, to which you need to pass the runtime class of your thread. The other, which is probable what you want to use is prototyped as follows CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); The Thread function is of type AFX_THREADPROC which in turn is defined as typedef UINT (AFX_CDECL *AFX_THREADPROC)(LPVOID); You are pretty much limited to using a function that matches this prototype as your thread function. You can probably simulate what you want by doing something like this class CMyClass { public: UINT MyThreadFunction(); void MyThreadCallingFunction(); } void CMyClass::MyThreadCallingFunction() { //pass the object as the parameter to the thread function AfxBeginThread(NonClassThreadFunction, this); } UINT AFX_CDECL NonClassThreadFunction(LPVOID pObj) { //pObj contains your object CMyClass* pThis = (CMyClass*) pObj; pObj->MyThreadFunction(); } Basically, you pass the object as the parameter in the Thread function, and then turn around and call a member function of the object in the Thread function. Hope that helps -Ranjiv -----From: Steven Youngs Well, in order for the thread function (I'm talking worker threads here by the way) to be a class member, you will have to make it static. Here is a simple example class CFoo { CWinThread *m_pThread; void StartFooThread(); static UINT FooWorker(LPVOID pParam); } void CFoo::StartFooThread() { m_pThread = AfxBeginThread(FooWorker, NULL); } UINT CFoo::FooWorker(LPVOID pParam) { TRACE("I'm a worker thread\n"); } NOTE: I've omitted all error checking and resource management code :-) The pParam argument allows you to pass data into your worker thread. Hope this helps. Steve. _____________ Steven Youngs NC Graphics (Cambridge) Ltd. -----From: craigtt@ccmail.PE-Nelson.COM Mahesh, You can make the ThreadProc of the thread a member function of a class if the function is "static". If the thread needs to operate on a particular instance of the class, you can pass a pointer to the instance as the parameter to the ThreadProc. If you want a class to appear to be operating independently in its own thread, consider deriving the class from CWinThread. While CWinThread is documented to be for user interface threads, you can override the Run function which is essentially the ThreadProc and turn it into a simple worker thread with the advantage that you have full access to all the members of the class. Tim Craig PE-Nelson -----From: Vladislav Mamistvalov Try read MS Book online "Multithreading:Creating User-Interface Threads" = and "Multithreading:Creating Worker Threads" the last topic have = example.
Tony D. Abel -- tabel@campus.mci.net Thursday, April 18, 1996 Thread snippet: This thread is started to provide communication between a modeless real time status dialog and a hardware controller object. TempBKThread is a global function that handles messages for event notification. // Start background thread m_pTempThread = AfxBeginThread( (AFX_THREADPROC)TempBKThread, (LPVOID)this, THREAD_PRIORITY_LOWEST ); // ---------------------------------------------------------------------- // Background thread which handles commands to the controller // ---------------------------------------------------------------------- UINT TempBKThread( LPVOID pParam ) { CMyDlg *pDlg = (CMyDlg*)pParam; const int iTimeOut = 1500; // 1.5 sec. CTempInterface* pTempCtrl = DIFFRACT.GetTempInterface( CDiffract::kAccess_ReadWrite, pDlg ); ASSERT( pTempCtrl ); pDlg->m_dThreadSetPoint = pTempCtrl->GetTemp(); for(;;) { try { while( ::WaitForSingleObject( pDlg->m_hCommandEvent, iTimeOut ) == WAIT_TIMEOUT ) { // Poll the controller /* Do controller work */ } // We have been signaled by the dialog switch( pDlg->m_iThreadAction ) { case CMyDlg::eMSG_ACTION_RAMP: // Start a ramp /* Do ramp work */ break; case CMyDlg::eMSG_ACTION_DO_SOMETHING: /* Process more messages if you like */ break; // This ends the thread upon shutdown of the controller operation. // Wait for thread to terminate DWORD dwExitCode = STILL_ACTIVE; while( dwExitCode == STILL_ACTIVE ) { Sleep( 200 ); VERIFY( ::GetExitCodeThread( m_pTempThread->m_hThread, &dwExitCode ) ); } // delete the thread delete m_pTempThread; I hope this helps you to get started. Sincerely, Tony D. Abel At 09:16 PM 4/14/96 -0700, you wrote: >Hi, >Environment : Windows NT Version :3.51 VC++ 4.0 > > > I want to create threads in my VC++ program. Does any one can help >me with some code as how to create threads in VC++ with AfxBeginThread. > > I want to have thread function and calling functions to be the >members functions of a class. > >Note : Need an example if possible > >Thank you, > Mahesh > >
| Вернуться в корень Архива |