浏览代码

UI: Add functions for executing funcs without blocking

Adds functions for executing functions within separate threads without
blocking the user interface, or by blocking the user interface with a
dialog box.
jp9000 6 年之前
父节点
当前提交
a0eab1a2ad
共有 2 个文件被更改,包括 46 次插入0 次删除
  1. 40 0
      UI/qt-wrappers.cpp
  2. 6 0
      UI/qt-wrappers.hpp

+ 40 - 0
UI/qt-wrappers.cpp

@@ -223,3 +223,43 @@ QThread *CreateQThread(std::function<void()> func)
 {
 	return new QuickThread(func);
 }
+
+void ExecuteFuncSafeBlock(std::function<void()> func)
+{
+	QEventLoop eventLoop;
+
+	auto wait = [&] ()
+	{
+		func();
+		QMetaObject::invokeMethod(&eventLoop, "quit",
+				Qt::QueuedConnection);
+	};
+
+	QScopedPointer<QThread> thread(CreateQThread(wait));
+	thread->start();
+	eventLoop.exec();
+	thread->wait();
+}
+
+void ExecuteFuncSafeBlockMsgBox(
+		std::function<void()> func,
+		const QString &title,
+		const QString &text)
+{
+	QMessageBox dlg;
+	dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowCloseButtonHint);
+	dlg.setWindowTitle(title);
+	dlg.setText(text);
+	dlg.setStandardButtons(0);
+
+	auto wait = [&] ()
+	{
+		func();
+		QMetaObject::invokeMethod(&dlg, "accept", Qt::QueuedConnection);
+	};
+
+	QScopedPointer<QThread> thread(CreateQThread(wait));
+	thread->start();
+	dlg.exec();
+	thread->wait();
+}

+ 6 - 0
UI/qt-wrappers.hpp

@@ -67,6 +67,12 @@ QDataStream &operator>>(QDataStream &in, OBSSceneItem &si);
 
 QThread *CreateQThread(std::function<void()> func);
 
+void ExecuteFuncSafeBlock(std::function<void()> func);
+void ExecuteFuncSafeBlockMsgBox(
+		std::function<void()> func,
+		const QString &title,
+		const QString &text);
+
 class SignalBlocker {
 	QWidget *widget;
 	bool blocked;