Re: AfxBeginThread - is it better to call it's SuspendThread() or something else...
"voytello" <voytello@gmail.com> schrieb im Newsbeitrag =
news:1146207663.682897.6380@v46g2000cwv.googlegroups.com...
Hello
I am wondering, which way is better to stop running the thread, for
example:
/************************************************************/
BOOL CNewDlg::OnInitDialog()
{
...
//calling the first thread
m_pThread[0] = ::AfxBeginThread(FirsThread,this,0,0,0,NULL);
//calling second thread - suspended
m_pThread[1] = ::AfxBeginThread(SecondThread,
this,0,0,CREATE_SUSPENDED,NULL);
}
/************************************************************/
//both functions of threads (FirstThread and SecondThread) has =
similiar
body:
UINT CNewDlg::FirstThread(LPVOID pParam) //and UINT
CNewDlg::FirstThread(LPVOID pParam)
{
CMyDlg* pMain = (CMyDlg*)pParam;
while(true)
{
pMain->TimeFun(); //this function gets time from CTime and displays
to screen
}
return 0;
}
/************************************************************/
So, when I want to use SecondThread, I suspend the FirstThread with
function ->SuspendThread() and I wake up SecindThread with function
->ResumeThread(); similarly I am doing it when I want to woke up
FirstThread and so on.
Huh, my question is: Is it better maybe to use a bool variable in
while() in function of thread or suspend it with SuspendFunction?
When variable will be true, the thread will be running, when false it
will stop.
I know that this option is available when I want to use for every time
FirstThread I must call the AfxBeginThread for this thread, because
when bool variable will be false, the thread will stop - the same for
SecondThread.
Usually it is not a good idea to suspend one thread from a different =
thread. Imagine what might happen if the thread is suspended while it is =
executing some code guarded by a critical section. No other thread could =
execute that piece of code and sooner or later many other threads might =
wait for the suspended thread to continue.
Using a flag to tell the running thread to pause is a better solution =
because the thread can pause when it does not use any shared resources, =
but a simple bool is a bad idea. An event object would be much better. =
Create event objects (using CreateEvent) - one for each tread - that are =
initialy reset and let the threads wait for their respective object at =
the beginning of their loop (WaitForSingleObject). When the main thread =
wants to start a thread, it can set the event (SetEvent) and when it =
wants it to stop, it can reset it again. (Or you create events that will =
reset automatically once the waiting thread resumes. Then the loop would =
be executed only once.)
One last remark. It is never a good idea to pass (a pointer to) an MFC =
object from one thread to another and call member functions in another =
thread than the one, which created the object.
HTH
Heinz