Re: thread questions
"Lisa Pearlson" <no@spam.plz> wrote in message
news:eGIs13qfJHA.5572@TK2MSFTNGP02.phx.gbl...
Hi all,
Imagine I need a function that does a lengthy search.
For this function not to block, it should be implemented to be
asynchronous.
I guess this would be implemented this way:
DWORD WINAPI DoSearch(LPVOID lpParameter)
{
// do some length search here
return 0;
}
HANDLE DoSearch(LPCTSTR lpszSubject)
{
return CreateProcess(... SearchProc ...);
}
Do not use CreateProcess for this. You should be creating a thread (not a
process). That requires a call to CreateThread, or _beginthreadex, or
AfxBeginThread, depending on what library you are using. A thread can
access data in your process, a new process can not.
I want the ability to have multiple simultaneous searches, e.g.:
HANDLE hSearch1 = DoSearch(_T("Search 1"));
HANDLE hSearch2 = DoSearch(_T("Search 2"));
I could wait for a search to complete this way:
WaitForSingleObject(hSearch1, INFINITE); // wait for completion
CloseHandle(hSearch1); // cleanup
If your program displays windows in its main thread the WaitForSingleObject
will make it "non responsive," as in frozen. This defeats the purpose of
multithreading. When a thread completes it can post a message to a window
in your main thread to notify it of completion.
So far, so good...
Now I would like the ability to ABORT the thread, by simply performing a
CloseHandle.
CloseHandle(hSearch2); // abort second search
Normally, I use some event handle or global BOOL value, and pass that to
thread, eg:
BOOL g_bAbort = FALSE;
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
LPBOOL pBool = (LPBOOL) lpParameter;
while (!pBool) {
// do something
}
return 0;
}
However, this requires a global variable, .. and that complicates the
ability to run copies of the function simultanously (I reckon it requires
a global list that dynamically allocates data to hold reference to each
thread).. I wonder if there is an easy way.
There's nothing wrong with using a bool and there is no reason it has to be
global. At this point it would be good to consider an object, not just a
function, to accomplsh what you want. Calling the object's DoSearch would
start it's thread and return a pointer to it's abort bool.
In particular, I am wondering if a thread can be made to abort as soon as
all handles to it have been closed, eg:
CloseHandle(hSearch2); // should abort the thread
Is it possible for a thread to be aware of handles to itself having been
closed?
Not exactly. The test inside the thread's loop is necessary so the thread
will have a chance to free resources and cleanly shut down.
I assume this can not work:
I assume this will not work:
DWORD WINAPI SomeFunc(LPVOID lpParameter)
{
HANDLE hThread = *(HANDLE*) lpParameter; // will this code execute
BEFORE the local variable in caller is destroyed???
NO! It will execute at some unknown arbitrary time. Create an object and
initialize its member variables so each thread will have whatever data it
needs before it starts.
--
Scott McPhillips [VC++ MVP]