Add support for thread-specific log targets.

A worker thread can now have its own log target which will be used directly
by the log functions instead of buffering log output in the main thread; the
GUI thread in the thread sample shows how it works.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61422 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-07-13 11:09:26 +00:00
parent 409aa9e1ef
commit acad886cb4
6 changed files with 228 additions and 45 deletions

View File

@@ -759,24 +759,36 @@ public:
If the buffer is already empty, nothing happens.
It should only be called from the main application thread.
If you override this method in a derived class, call the base class
version first, before doing anything else, to ensure that any buffered
messages from the other threads are logged.
version first, before doing anything else.
*/
virtual void Flush();
/**
Flushes the current log target if any, does nothing if there is none.
As Flush() itself, this method should only be called from the main
application thread.
When this method is called from the main thread context, it also
flushes any previously buffered messages logged by the other threads.
When it is called from the other threads it simply calls Flush() on the
currently active log target, so it mostly makes sense to do this if a
thread has its own logger set with SetThreadActiveTarget().
*/
static void FlushActive();
/**
Returns the pointer to the active log target (may be @NULL).
Notice that if SetActiveTarget() hadn't been previously explicitly
called, this function will by default try to create a log target by
calling wxAppTraits::CreateLogTarget() which may be overridden in a
user-defined traits class to change the default behaviour. You may also
call DontCreateOnDemand() to disable this behaviour.
When this function is called from threads other than main one,
auto-creation doesn't happen. But if the thread has a thread-specific
log target previously set by SetThreadActiveTarget(), it is returned
instead of the global one. Otherwise, the global log target is
returned.
*/
static wxLog* GetActiveTarget();
@@ -866,6 +878,8 @@ public:
To suppress logging use a new instance of wxLogNull not @NULL. If the
active log target is set to @NULL a new default log target will be
created when logging occurs.
@see SetThreadActiveTarget()
*/
static wxLog* SetActiveTarget(wxLog* logtarget);
@@ -906,6 +920,32 @@ public:
*/
static void SetRepetitionCounting(bool repetCounting = true);
/**
Sets a thread-specific log target.
The log target passed to this function will be used for all messages
logged by the current thread using the usual wxLog functions. This
shouldn't be called from the main thread which never uses a thread-
specific log target but can be used for the other threads to handle
thread logging completely separately; instead of buffering thread log
messages in the main thread logger.
Notice that unlike for SetActiveTarget(), wxWidgets does not destroy
the thread-specific log targets when the thread terminates so doing
this is your responsibility.
This method is only available if @c wxUSE_THREADS is 1, i.e. wxWidgets
was compiled with threads support.
@param logger
The new thread-specific log target, possibly @NULL.
@return
The previous thread-specific log target, initially @NULL.
@since 2.9.1
*/
static wxLog *SetThreadActiveTarget(wxLog *logger);
/**
Sets the timestamp format prepended by the default log targets to all
messages. The string may contain any normal characters as well as %