Wake host on a separate worker thread to avoid hanging the UI for DNS resolution

This commit is contained in:
Cameron Gutman 2018-09-05 16:10:32 -07:00
parent 8a2491d955
commit 78730f7235
3 changed files with 26 additions and 3 deletions

View file

@ -177,6 +177,11 @@ bool NvComputer::wake()
for (QString& addressString : addressList) { for (QString& addressString : addressList) {
QHostInfo hostInfo = QHostInfo::fromName(addressString); QHostInfo hostInfo = QHostInfo::fromName(addressString);
if (hostInfo.error() != QHostInfo::NoError) {
qWarning() << "Error resolving" << addressString << ":" << hostInfo.errorString();
continue;
}
// Try all IP addresses that this string resolves to // Try all IP addresses that this string resolves to
for (QHostAddress& address : hostInfo.addresses()) { for (QHostAddress& address : hostInfo.addresses()) {
QUdpSocket sock; QUdpSocket sock;

View file

@ -1,5 +1,7 @@
#include "computermodel.h" #include "computermodel.h"
#include <QThreadPool>
ComputerModel::ComputerModel(QObject* object) ComputerModel::ComputerModel(QObject* object)
: QAbstractListModel(object) {} : QAbstractListModel(object) {}
@ -119,11 +121,27 @@ void ComputerModel::deleteComputer(int computerIndex)
endRemoveRows(); endRemoveRows();
} }
bool ComputerModel::wakeComputer(int computerIndex) class DeferredWakeHostTask : public QRunnable
{
public:
DeferredWakeHostTask(NvComputer* computer)
: m_Computer(computer) {}
void run()
{
m_Computer->wake();
}
private:
NvComputer* m_Computer;
};
void ComputerModel::wakeComputer(int computerIndex)
{ {
Q_ASSERT(computerIndex < m_Computers.count()); Q_ASSERT(computerIndex < m_Computers.count());
return m_Computers[computerIndex]->wake(); DeferredWakeHostTask* wakeTask = new DeferredWakeHostTask(m_Computers[computerIndex]);
QThreadPool::globalInstance()->start(wakeTask);
} }
void ComputerModel::pairComputer(int computerIndex, QString pin) void ComputerModel::pairComputer(int computerIndex, QString pin)

View file

@ -34,7 +34,7 @@ public:
Q_INVOKABLE void pairComputer(int computerIndex, QString pin); Q_INVOKABLE void pairComputer(int computerIndex, QString pin);
Q_INVOKABLE bool wakeComputer(int computerIndex); Q_INVOKABLE void wakeComputer(int computerIndex);
Q_INVOKABLE Session* createSessionForCurrentGame(int computerIndex); Q_INVOKABLE Session* createSessionForCurrentGame(int computerIndex);