diff --git a/src/bridge/bridgemain.cpp b/src/bridge/bridgemain.cpp index 1fd7bf61..77614702 100644 --- a/src/bridge/bridgemain.cpp +++ b/src/bridge/bridgemain.cpp @@ -1548,7 +1548,10 @@ BRIDGE_IMPEXP void GuiCloseQWidgetTab(void* qWidget) BRIDGE_IMPEXP void GuiExecuteOnGuiThread(GUICALLBACK cbGuiThread) { - _gui_sendmessage(GUI_EXECUTE_ON_GUI_THREAD, (void*)cbGuiThread, nullptr); + GuiExecuteOnGuiThreadEx([](void* cb) + { + ((GUICALLBACK)cb)(); + }, cbGuiThread); } BRIDGE_IMPEXP void GuiUpdateTimeWastedCounter() @@ -1720,6 +1723,11 @@ BRIDGE_IMPEXP void GuiInvalidateSymbolSource(duint base) _gui_sendmessage(GUI_INVALIDATE_SYMBOL_SOURCE, (void*)base, nullptr); } +BRIDGE_IMPEXP void GuiExecuteOnGuiThreadEx(GUICALLBACKEX cbGuiThread, void* userdata) +{ + _gui_sendmessage(GUI_EXECUTE_ON_GUI_THREAD, (void*)cbGuiThread, userdata); +} + BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { hInst = hinstDLL; diff --git a/src/bridge/bridgemain.h b/src/bridge/bridgemain.h index 9cdf0c7f..2dbc6be3 100644 --- a/src/bridge/bridgemain.h +++ b/src/bridge/bridgemain.h @@ -1122,7 +1122,7 @@ typedef enum GUI_ADD_QWIDGET_TAB, // param1=QWidget*, param2=unused GUI_SHOW_QWIDGET_TAB, // param1=QWidget*, param2=unused GUI_CLOSE_QWIDGET_TAB, // param1=QWidget*, param2=unused - GUI_EXECUTE_ON_GUI_THREAD, // param1=GUICALLBACK, param2=unused + GUI_EXECUTE_ON_GUI_THREAD, // param1=GUICALLBACKEX cb, param2=void* userdata GUI_UPDATE_TIME_WASTED_COUNTER, // param1=unused, param2=unused GUI_SET_GLOBAL_NOTES, // param1=const char* text, param2=unused GUI_GET_GLOBAL_NOTES, // param1=char** text, param2=unused @@ -1171,6 +1171,7 @@ typedef enum struct _TYPEDESCRIPTOR; typedef void (*GUICALLBACK)(); +typedef void (*GUICALLBACKEX)(void*); typedef bool (*GUISCRIPTEXECUTE)(const char* text); typedef void (*GUISCRIPTCOMPLETER)(const char* text, char** entries, int* entryCount); typedef bool (*TYPETOSTRING)(const struct _TYPEDESCRIPTOR* type, char* dest, size_t* destCount); //don't change destCount for final failure @@ -1342,6 +1343,7 @@ BRIDGE_IMPEXP void GuiReferenceAddCommand(const char* title, const char* command BRIDGE_IMPEXP void GuiUpdateTraceBrowser(); BRIDGE_IMPEXP void GuiOpenTraceFile(const char* fileName); BRIDGE_IMPEXP void GuiInvalidateSymbolSource(duint base); +BRIDGE_IMPEXP void GuiExecuteOnGuiThreadEx(GUICALLBACKEX cbGuiThread, void* userdata); #ifdef __cplusplus } diff --git a/src/gui/Src/Bridge/Bridge.cpp b/src/gui/Src/Bridge/Bridge.cpp index 83c3f75d..7d8d9e10 100644 --- a/src/gui/Src/Bridge/Bridge.cpp +++ b/src/gui/Src/Bridge/Bridge.cpp @@ -591,9 +591,13 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2) break; case GUI_EXECUTE_ON_GUI_THREAD: - GuiAddLogMessage(QString().sprintf("thread id (bridge) %X\n", GetCurrentThreadId()).toUtf8().constData()); - emit executeOnGuiThread(param1); - break; + { + if(GetCurrentThreadId() == dwMainThreadId) + ((GUICALLBACKEX)param1)(param2); + else + emit executeOnGuiThread(param1, param2); + } + break; case GUI_UPDATE_TIME_WASTED_COUNTER: emit updateTimeWastedCounter(); diff --git a/src/gui/Src/Bridge/Bridge.h b/src/gui/Src/Bridge/Bridge.h index 68270aca..f593d7f0 100644 --- a/src/gui/Src/Bridge/Bridge.h +++ b/src/gui/Src/Bridge/Bridge.h @@ -126,7 +126,7 @@ signals: void addQWidgetTab(QWidget* qWidget); void showQWidgetTab(QWidget* qWidget); void closeQWidgetTab(QWidget* qWidget); - void executeOnGuiThread(void* cbGuiThread); + void executeOnGuiThread(void* cbGuiThread, void* userdata); void updateTimeWastedCounter(); void setGlobalNotes(const QString text); void getGlobalNotes(void* text); diff --git a/src/gui/Src/Gui/MainWindow.cpp b/src/gui/Src/Gui/MainWindow.cpp index cb323ce5..19e6fd82 100644 --- a/src/gui/Src/Gui/MainWindow.cpp +++ b/src/gui/Src/Gui/MainWindow.cpp @@ -89,7 +89,7 @@ MainWindow::MainWindow(QWidget* parent) connect(Bridge::getBridge(), SIGNAL(addQWidgetTab(QWidget*)), this, SLOT(addQWidgetTab(QWidget*))); connect(Bridge::getBridge(), SIGNAL(showQWidgetTab(QWidget*)), this, SLOT(showQWidgetTab(QWidget*))); connect(Bridge::getBridge(), SIGNAL(closeQWidgetTab(QWidget*)), this, SLOT(closeQWidgetTab(QWidget*))); - connect(Bridge::getBridge(), SIGNAL(executeOnGuiThread(void*)), this, SLOT(executeOnGuiThread(void*))); + connect(Bridge::getBridge(), SIGNAL(executeOnGuiThread(void*, void*)), this, SLOT(executeOnGuiThread(void*, void*))); connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(dbgStateChangedSlot(DBGSTATE))); connect(Bridge::getBridge(), SIGNAL(addFavouriteItem(int, QString, QString)), this, SLOT(addFavouriteItem(int, QString, QString))); connect(Bridge::getBridge(), SIGNAL(setFavouriteItemShortcut(int, QString, QString)), this, SLOT(setFavouriteItemShortcut(int, QString, QString))); @@ -1655,9 +1655,9 @@ void MainWindow::closeQWidgetTab(QWidget* qWidget) } } -void MainWindow::executeOnGuiThread(void* cbGuiThread) +void MainWindow::executeOnGuiThread(void* cbGuiThread, void* userdata) { - ((GUICALLBACK)cbGuiThread)(); + ((GUICALLBACKEX)cbGuiThread)(userdata); } void MainWindow::tabMovedSlot(int from, int to) diff --git a/src/gui/Src/Gui/MainWindow.h b/src/gui/Src/Gui/MainWindow.h index c7890965..5ca1babd 100644 --- a/src/gui/Src/Gui/MainWindow.h +++ b/src/gui/Src/Gui/MainWindow.h @@ -142,7 +142,7 @@ public slots: void addQWidgetTab(QWidget* qWidget); void showQWidgetTab(QWidget* qWidget); void closeQWidgetTab(QWidget* qWidget); - void executeOnGuiThread(void* cbGuiThread); + void executeOnGuiThread(void* cbGuiThread, void* userdata); void tabMovedSlot(int from, int to); void chkSaveloadTabSavedOrderStateChangedSlot(bool state); void dbgStateChangedSlot(DBGSTATE state);