Allows threads to call some method from within the GUI thread. More...
#include <mitkCallbackFromGUIThread.h>
Public Member Functions | |
void | CallThisFromGUIThread (itk::Command *, itk::EventObject *e=NULL) |
Change the current application cursor. | |
Static Public Member Functions | |
static CallbackFromGUIThread * | GetInstance () |
This class is a singleton. | |
static void | RegisterImplementation (CallbackFromGUIThreadImplementation *implementation) |
To be called by a toolkit specific CallbackFromGUIThreadImplementation. | |
Protected Member Functions | |
CallbackFromGUIThread () | |
Purposely hidden - singleton. |
Allows threads to call some method from within the GUI thread.
This class is useful for use with GUI toolkits that are not thread-safe, e.g. Qt. Any thread that needs to work with the GUI at some time during its execution (e.g. at the end, to display some results) can use this class to ask for a call to a member function from the GUI thread.
Usage example
We assume that you have a class ThreadedClass, that basically lives in a thread that is different from the GUI thread. Now this class has to change some element of the GUI to indicate its status. This could be dangerous (with Qt it is for sure).
The solution is, that ThreadedClass asks mitk::CallbackFromGUIThread to call a method from the GUI thread (main thread).
Here is part of the header of ThreadedClass:
class ThreadedClass : public ParentClass { public: ... // All you need // This function runs in its own thread ! void ThreadedFunction(); // This should be called from the GUI thread void ChangeGUIElementsToIndicateProgress(const itk::EventObject&); ... };
#include "mitkCallbackFromGUIThread.h" #include <itkCommand.h> // This method runs in a thread of its own! So it can't manipulate GUI elements directly without causing trouble void ThreadedClass::ThreadedFunction() { ... // Create a command object (passing parameters comes later) itk::ReceptorMemberCommand<ThreadedClass>::Pointer command = itk::ReceptorMemberCommand<ThreadedClass>::New(); command->SetCallbackFunction(this, &ThreadedClass::ChangeGUIElementsToIndicateProgress); // Ask to execute that command from the GUI thread mitk::CallbackFromGUIThread::GetInstance()->CallThisFromGUIThread(command); ... } // Do dangerous GUI changing stuff here void ThreadedClass::ChangeGUIElementsToIndicateProgress(const itk::EventObject& e) { Application::GetButtonGrid()->AddButton("Stop"); // this is pseudo code }
This obviously won't allow you to pass parameters to ChangeGUIElementsToIndicateProgress. If you need to do that, you have to create a kind of itk::EventObject that can be asked for a parameter (this solution is not nice, if you see a better solution, please mail to mitk-users@lists.sourceforge.net).
The itk::EventObject has to be created with "new" (which can also be done by calling MakeObject on an existing EventObject).
const mitk::OneParameterEvent* event = new mitk::OneParameterEvent(1); // this class is not yet defined but will be itk::ReceptorMemberCommand<ThreadedClass>::Pointer command = itk::ReceptorMemberCommand<ThreadedClass>::New(); command->SetCallbackFunction(this, &ThreadedClass::ChangeGUIElementsToIndicateProgress); mitk::CallbackFromGUIThread::GetInstance()->CallThisFromGUIThread(command, event); // DO NOT delete event now. This will be done by CallThisFromGUIThread after the command will executed.
Definition at line 177 of file mitkCallbackFromGUIThread.h.
mitk::CallbackFromGUIThread::CallbackFromGUIThread | ( | ) | [protected] |
Purposely hidden - singleton.
Definition at line 25 of file mitkCallbackFromGUIThread.cpp.
Referenced by GetInstance().
{ }
void mitk::CallbackFromGUIThread::CallThisFromGUIThread | ( | itk::Command * | cmd, |
itk::EventObject * | e = NULL |
||
) |
Change the current application cursor.
Definition at line 44 of file mitkCallbackFromGUIThread.cpp.
References mitk::CallbackFromGUIThreadImplementation::CallThisFromGUIThread(), and MITK_ERROR.
Referenced by mitk::WiiMoteThread::WiiMoteButtonPressed(), mitk::WiiMoteThread::WiiMoteCalibrationInput(), and mitk::WiiMoteThread::WiiMoteIRInput().
{ if (m_Implementation) { m_Implementation->CallThisFromGUIThread(cmd, e); } else { MITK_ERROR << "in mitk::CallbackFromGUIThread::CallbackFromGUIThread(): no implementation registered." << std::endl; } }
CallbackFromGUIThread * mitk::CallbackFromGUIThread::GetInstance | ( | ) | [static] |
This class is a singleton.
Definition at line 29 of file mitkCallbackFromGUIThread.cpp.
References CallbackFromGUIThread().
Referenced by mitk::WiiMoteThread::WiiMoteButtonPressed(), mitk::WiiMoteThread::WiiMoteCalibrationInput(), and mitk::WiiMoteThread::WiiMoteIRInput().
{ if (!m_Instance) { m_Instance = new CallbackFromGUIThread(); } return m_Instance; }
void mitk::CallbackFromGUIThread::RegisterImplementation | ( | CallbackFromGUIThreadImplementation * | implementation ) | [static] |
To be called by a toolkit specific CallbackFromGUIThreadImplementation.
Definition at line 39 of file mitkCallbackFromGUIThread.cpp.
Referenced by QmitkCallbackFromGUIThread::QmitkCallbackFromGUIThread().
{ m_Implementation = implementation; }