diff --git a/src/Base/Console.cpp b/src/Base/Console.cpp index 97d371e73..084f477ca 100644 --- a/src/Base/Console.cpp +++ b/src/Base/Console.cpp @@ -42,9 +42,6 @@ using namespace Base; -char format[4024]; // global buffer -const unsigned int format_len = 4024; - //************************************************************************** // Construction destruction @@ -171,6 +168,9 @@ bool ConsoleSingleton::IsMsgTypeEnabled(const char* sObs, FreeCAD_ConsoleMsgType */ void ConsoleSingleton::Message( const char *pMsg, ... ) { + char format[4024]; + const unsigned int format_len = 4024; + va_list namelessVars; va_start(namelessVars, pMsg); // Get the "..." vars vsnprintf(format, format_len, pMsg, namelessVars); @@ -195,6 +195,9 @@ void ConsoleSingleton::Message( const char *pMsg, ... ) */ void ConsoleSingleton::Warning( const char *pMsg, ... ) { + char format[4024]; + const unsigned int format_len = 4024; + va_list namelessVars; va_start(namelessVars, pMsg); // Get the "..." vars vsnprintf(format, format_len, pMsg, namelessVars); @@ -219,6 +222,9 @@ void ConsoleSingleton::Warning( const char *pMsg, ... ) */ void ConsoleSingleton::Error( const char *pMsg, ... ) { + char format[4024]; + const unsigned int format_len = 4024; + va_list namelessVars; va_start(namelessVars, pMsg); // Get the "..." vars vsnprintf(format, format_len, pMsg, namelessVars); @@ -246,6 +252,9 @@ void ConsoleSingleton::Error( const char *pMsg, ... ) void ConsoleSingleton::Log( const char *pMsg, ... ) { + char format[4024]; + const unsigned int format_len = 4024; + if (!_bVerbose) { va_list namelessVars; diff --git a/src/Gui/CommandTest.cpp b/src/Gui/CommandTest.cpp index 32f3a0c8b..245c0d6be 100644 --- a/src/Gui/CommandTest.cpp +++ b/src/Gui/CommandTest.cpp @@ -33,6 +33,8 @@ # include # include # include +# include +# include #endif #include @@ -638,6 +640,110 @@ bool CmdTestMDI3::isActive(void) return getMainWindow()->activeWindow(); } +DEF_STD_CMD(CmdTestConsoleOutput); + +CmdTestConsoleOutput::CmdTestConsoleOutput() + : Command("Std_TestConsoleOutput") +{ + sGroup = QT_TR_NOOP("Standard-Test"); + sMenuText = QT_TR_NOOP("Test console output"); + sToolTipText= QT_TR_NOOP("Test console output"); + sStatusTip = QT_TR_NOOP("Test console output"); +} + +namespace Gui { +class TestConsoleObserver : public Base::ConsoleObserver +{ + QMutex mutex; +public: + int matchMsg, matchWrn, matchErr, matchLog; + TestConsoleObserver() : matchMsg(0), matchWrn(0), matchErr(0), matchLog(0) + { + } + virtual void Warning(const char * msg) + { + mutex.lock(); + matchWrn += strcmp(msg, "Write a warning to the console output.\n"); + mutex.unlock(); + } + virtual void Message(const char * msg) + { + mutex.lock(); + matchMsg += strcmp(msg, "Write a message to the console output.\n"); + mutex.unlock(); + } + virtual void Error(const char * msg) + { + mutex.lock(); + matchErr += strcmp(msg, "Write an error to the console output.\n"); + mutex.unlock(); + } + virtual void Log(const char * msg) + { + mutex.lock(); + matchLog += strcmp(msg, "Write a log to the console output.\n"); + mutex.unlock(); + } +}; + +class ConsoleMessageTask : public QRunnable +{ +public: + void run() + { + for (int i=0; i<10; i++) + Base::Console().Message("Write a message to the console output.\n"); + } +}; + +class ConsoleWarningTask : public QRunnable +{ +public: + void run() + { + for (int i=0; i<10; i++) + Base::Console().Warning("Write a warning to the console output.\n"); + } +}; + +class ConsoleErrorTask : public QRunnable +{ +public: + void run() + { + for (int i=0; i<10; i++) + Base::Console().Error("Write an error to the console output.\n"); + } +}; + +class ConsoleLogTask : public QRunnable +{ +public: + void run() + { + for (int i=0; i<10; i++) + Base::Console().Log("Write a log to the console output.\n"); + } +}; + +} + +void CmdTestConsoleOutput::activated(int iMsg) +{ + TestConsoleObserver obs; + Base::Console().AttachObserver(&obs); + QThreadPool::globalInstance()->start(new ConsoleMessageTask); + QThreadPool::globalInstance()->start(new ConsoleWarningTask); + QThreadPool::globalInstance()->start(new ConsoleErrorTask); + QThreadPool::globalInstance()->start(new ConsoleLogTask); + QThreadPool::globalInstance()->waitForDone(); + Base::Console().DetachObserver(&obs); + + if (obs.matchMsg > 0 || obs.matchWrn > 0 || obs.matchErr > 0 || obs.matchLog > 0) { + Base::Console().Error("Race condition in Console class\n"); + } +} + namespace Gui { @@ -661,6 +767,7 @@ void CreateTestCommands(void) rcCmdMgr.addCommand(new CmdTestMDI1()); rcCmdMgr.addCommand(new CmdTestMDI2()); rcCmdMgr.addCommand(new CmdTestMDI3()); + rcCmdMgr.addCommand(new CmdTestConsoleOutput()); } } // namespace Gui diff --git a/src/Gui/Qt4All.h b/src/Gui/Qt4All.h index 3db34caf9..dc2cf4349 100644 --- a/src/Gui/Qt4All.h +++ b/src/Gui/Qt4All.h @@ -37,12 +37,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -122,7 +124,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/Mod/Test/InitGui.py b/src/Mod/Test/InitGui.py index 51a3281cb..f56a6ebba 100644 --- a/src/Mod/Test/InitGui.py +++ b/src/Mod/Test/InitGui.py @@ -86,6 +86,10 @@ class TestWorkbench ( Workbench ): list = ["Std_TestProgress1", "Std_TestProgress2", "Std_TestProgress3", "Std_TestProgress4", "Std_TestProgress5"] self.appendMenu(menu,list) + menu = ["Test &Commands","Console"] + list = ["Std_TestConsoleOutput"] + self.appendMenu(menu,list) + menu = ["Test &Commands","MDI"] list = ["Std_MDITest1", "Std_MDITest2", "Std_MDITest3"] self.appendMenu(menu,list)