Call to afxBeginThread blocks till completion of thread Why?

 I am having a problem with afxBeginThread()
 Here is relevent code:
 struct CThreadInfo
       HANDLE m_hEventStartOperation;
       HANDLE m_hEventKillOperation;
       HANDLE m_hEventOperationKilled;
 // TODO: Add member initialization code here
 // Create Events for image_presenter_thread before Starting it
 m_himage_presenter_thread_Start = CreateEvent(NULL, FALSE, FALSE, NULL);
 m_himage_presenter_thread_Kill = CreateEvent(NULL, FALSE, FALSE, NULL);
 m_himage_presenter_thread_Killed = CreateEvent(NULL, FALSE, FALSE, NULL);
 // Initialize processing thread parameter structures
 m_image_presenter_thread_info.m_hEventStartOperation =
 m_image_presenter_thread_info.m_hEventKillOperation =
 m_image_presenter_thread_info.m_hEventOperationKilled =
 image_presenter_thread = AfxBeginThread(
                   (AFX_THREADPROC) image_presenter((LPVOID*)
                   (LPVOID*) &m_image_presenter_thread_info,
 UINT CMainFrame::image_presenter(void* pParam)
       CThreadInfo* p_image_presenter_thread_info = (CThreadInfo*) pParam;
 WHEN the code executes, AfxBeginThread executes and starts
 But then, AfxBeginThread DOES NOT RETURN.   Why?
 Of course, image_presenter( ) hangs because
 SetEvent(m_image_presenter_thread_Start)  is never executed
 because of the blocking AfxBeginThread call.
 Any help will be greatly appreciated
Who is Participating?
chensuConnect With a Mentor Commented:
image_presenter should be a static member function of CMainFrame.

image_presenter_thread = ::AfxBeginThread(image_presenter, &m_image_presenter_thread_info);

AfxBeginThread should return after it creates a new CWinThread object, calls its CreateThread function to start executing the thread.
sherwingwAuthor Commented:
Edited text of question
sherwingwAuthor Commented:

Declaring image_presenter to be a static member function, rather than just a member function of CMainFrame is not a viable soulution, as it SEVERLY restricts fhe functionality of image presenter.  Static functions only have access to static variables and static functions.  Consequently, if image_presenter is declared static, it can not make a call to any of the non static windows routines!

I tried the static solution, and went through the pain of "static-ing" all called functions .......but ran into a windows call, which was not a static function. So this is not viable.

Any other suggestions?
You have to use a static function or a global function. The reason is that a member function contains an implicit parameter (the this pointer). For example,

UINT CMainFrame::image_presenter(void* pParam);

is actually

UINT CMainFrame::image_presenter(CMainFrame *pThis, void* pParam);

if it is not a static function. And this prototype does not conform to what AfxBeginThread() requires. It is the implicit this pointer that lets you access the non-static members.

So, you can pass some data that the thread needs into the structure pointed by void* pParam. For example, you can pass the window handle. But, do not pass the this pointer. As Microsoft documentation says, it is dangerous to pass C++ objects from one thread to another, unless the objects are designed to be used in such a manner.
All Courses

From novice to tech pro — start learning today.