Re: worker thread
On 5 Nov., 11:26, Uwe Kotyczka <uwe.kotyc...@web.de> wrote:
On 5 Nov., 10:33, mfc <mfcp...@googlemail.com> wrote:
Which synchronisation techniques are you using to avoid that the
workerthread will be executed several times (coexistent )?
""""""
Another question: I also want to acchieve that the worker thread
could
be called only once. Therefore I need some synchronisation. Because
if
one user starts the worker thread by the dialog and another user
tries
to start the worker thread by the webserver a few seconds later; I
could get into some troubles. In both cases, the worker thread is
always started from the main thread. I don`t want to block the main
thread either, if the worker thread is already running. Which way or
solution is here recommended?
"""""""
I did not understand if both questions (above) ask for the same thing
in different words or if you asked for different things.
So in your OnClose handler you signal the event:
SetEvent(my_event...
Your main thread just asks the worker thread (politely) to close
itself.
Could you give me a small example how the mainframe will check if the
event is set??? IS the event "my_event" a global "variable" so that
the mainframe has also the possibility to test if it is set or not?
As Joe already explained you should use an appropriate place for your
worker thread. IIRC you use doc-view architecture (MDI/SDI).
What is the role of the document? Is it what you would call a
document "in real life"?. What does it mean if you have two documents
(MDI)? Will you allow that? If so, your OnClose handler would be
in your CChildFrame drived class, rather than in your CMainFrame
drived class. And of course it will be called even if the main frame
wants to close, the MFC framework will call it for you.
So the answer is clearly: Depends ;-)
Ohh I like this answer :-)... Unfortunately, I don`t want to start the
worker thread in the document or view class.
I`ve my own class, called MyParamClass which is no subclass. This
class and the subclasses contains all information, which are needed
for the verificiation of the data. The verification will be done in
the worker thread.
class MyParamClass
{
void StartMyWorkerThread();
protected:
};
void MyParamClass::StartMyWorkerThread()
{
AfxBeginThread(myThread, something); //and so on
}
void MyParamClass::~MyParamClass()
{
::CloseHandle(ShutdownEvent);
}
I`ve only installed one global variable installed for this
MyParamClass. In the thread I only do the verification, which means I
didn`t change any variable. After performing the verification and
everything was successfull, I will send a PostMessage back to the
mainthread to do all required changes.
Where do you call the AfxBeginThread now to start your worker thread?
Let's assume, you do it in your document class. Then I would make
"my_event" a member of the Document class. In this case you would not
override the CChildFrame's OnClose, but rather the document's
OnCloseDocument() function.
In any case I would try to avoid making "my_event" a global
variable.
Now how to avoid that two instances of your worker thread are started:
if you make the worker thread a member of, say, the document class.
then you initialize "mythread" in the c'tor to NULL. Before you start
a new thread you can check "if (mythread == NULL)" and start a new
thread. If it is not NULL, then it was started before. In this case
GetExitCodeThread will tell you if the thread is still alive.
Thanks for your explanations!
You're welcome.
For a more sophisticated synchronisation scheme you might take a look
at my FileAlarm demo athttp://home.arcor.de/kotyczka/samples_en.html
FileAlarm is a simple editor which starts a worker thread to watch if
the file opened in the editor is modified on hard disk by another app.
HTH- Zitierten Text ausblenden -
- Zitierten Text anzeigen -