summaryrefslogtreecommitdiff
path: root/src/processrunner.cpp
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-11-06 06:50:05 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2019-11-06 07:45:03 -0500
commit8f40ec0bdcb99cc1a0a2bde3074842391844f5d6 (patch)
treecb27da55c4860a4140174d52a8f982e2da5037de /src/processrunner.cpp
parent96cc662b187f465713d3963f7c8cf9a1b4856aa5 (diff)
threaded wait for process
Diffstat (limited to 'src/processrunner.cpp')
-rw-r--r--src/processrunner.cpp42
1 files changed, 31 insertions, 11 deletions
diff --git a/src/processrunner.cpp b/src/processrunner.cpp
index d97c00ef..68acca92 100644
--- a/src/processrunner.cpp
+++ b/src/processrunner.cpp
@@ -55,11 +55,7 @@ std::optional<ProcessRunner::Results> singleWait(HANDLE handle, DWORD pid)
return ProcessRunner::Error;
}
- const DWORD WAIT_EVENT = WAIT_OBJECT_0 + 1;
-
- // Wait for a an event on the handle, a key press, mouse click or timeout
- const auto res = MsgWaitForMultipleObjects(
- 1, &handle, FALSE, 50, QS_KEY | QS_MOUSEBUTTON);
+ const auto res = WaitForSingleObject(handle, 50);
switch (res)
{
@@ -70,7 +66,6 @@ std::optional<ProcessRunner::Results> singleWait(HANDLE handle, DWORD pid)
}
case WAIT_TIMEOUT:
- case WAIT_EVENT:
{
// still running
return {};
@@ -216,10 +211,6 @@ std::optional<ProcessRunner::Results> timedWait(
// the process is still running
- // keep processing events so the app doesn't appear dead
- QCoreApplication::sendPostedEvents();
- QCoreApplication::processEvents();
-
// check the lock widget
switch (ls.result())
{
@@ -263,7 +254,7 @@ std::optional<ProcessRunner::Results> timedWait(
}
}
-ProcessRunner::Results waitForProcesses(
+ProcessRunner::Results waitForProcessesThreadImpl(
const std::vector<HANDLE>& initialProcesses, LockWidget::Session& ls)
{
using namespace std::chrono;
@@ -322,6 +313,35 @@ ProcessRunner::Results waitForProcesses(
}
}
+void waitForProcessesThread(
+ ProcessRunner::Results& result,
+ const std::vector<HANDLE>& initialProcesses, LockWidget::Session& ls)
+{
+ result = waitForProcessesThreadImpl(initialProcesses, ls);
+ ls.unlock();
+}
+
+ProcessRunner::Results waitForProcesses(
+ const std::vector<HANDLE>& initialProcesses, LockWidget::Session& ls)
+{
+ auto results = ProcessRunner::Running;
+
+ auto* t = QThread::create(
+ waitForProcessesThread, std::ref(results), initialProcesses, std::ref(ls));
+
+ QEventLoop events;
+ QObject::connect(t, &QThread::finished, [&]{
+ events.quit();
+ });
+
+ t->start();
+ events.exec();
+
+ delete t;
+
+ return results;
+}
+
ProcessRunner::Results waitForProcess(
HANDLE initialProcess, LPDWORD exitCode, LockWidget::Session& ls)
{