某个函数需要用线程执行时,创建一个一次性的线程,在线程里面调用该函数。
头文件
class TaskThread : public QThread
{
Q_OBJECT
public:
TaskThread(QObject *parent = 0);
~TaskThread();
void setFunction(QObject* obj,QString function,QVariant value=NULL);
signals:
void taskEnd();
public:
void run();
private:
int m_index;
QObject* m_obj;
QString m_function;
QVariant m_value;
QThread *m_Thread;
};
cpp
TaskThread::TaskThread(QObject *parent)
{
m_index = -1;
connect(this,SIGNAL(taskEnd()),this,SLOT(deleteLater()));
}
TaskThread::~TaskThread()
{
}
void TaskThread::setFunction(QObject* obj,QString function,QVariant value)
{
while(m_index != -1)
{
QThread::msleep(10);
}
m_index = 1;
m_obj = obj;
m_function = function;
m_value = value;
m_Thread = m_obj->thread();
m_obj->moveToThread(this);
start();
}
void TaskThread::run()
{
QByteArray ba = m_function.toLatin1();
const char* ch=ba.constData();
QMetaObject::invokeMethod(m_obj,ch,Q_ARG(QVariant, m_value));
m_index = -1;
m_obj->moveToThread(m_Thread);
emit taskEnd();
}
另外一个例子:可以自己改写(以调用系统键盘为例子)
#ifndef FUNCTIONTHREAD_H
#define FUNCTIONTHREAD_H
#include <QObject>
#include <QThread>
#include <QVariant>
//线程执行某个功能, 一次性功能
class functionThread : public QThread
{
Q_OBJECT
public:
static functionThread* getFunction(); //获取公共指针
static void winSoftKeyboard(); //调用系统键盘
signals:
protected:
void run(); //线程运行
private:
functionThread(QObject *parent = 0);
~functionThread();
void runWinSoftKeyboard(); //线程调用系统键盘
private:
static functionThread* gFunctiton; //全局指针
};
#endif // FUNCTIONTHREAD_H
#include "functionThread.h"
#include <Windows.h>
#include <QMutex>
static QStringList functionList; //要执行的功能
static QMutex functionMutex; //的锁
functionThread* functionThread::gFunctiton = 0;//全局指针
functionThread::functionThread(QObject *parent) : QThread(parent)
{
}
functionThread::~functionThread()
{
}
//获取公共指针
functionThread *functionThread::getFunction()
{
if(gFunctiton == 0)
{
gFunctiton = new functionThread();
}
return gFunctiton;
}
//线程运行
void functionThread::run()
{
while (functionList.count())
{
functionMutex.lock();
QString function = functionList.first();
functionList.removeAt(0);
functionMutex.unlock();
if(function == "runWinSoftKeyboard")
{
runWinSoftKeyboard();
}
}
}
//调用系统键盘
void functionThread::winSoftKeyboard()
{
functionMutex.lock();
functionList.append("runWinSoftKeyboard");
functionMutex.unlock();
if(!getFunction()->isRunning())
getFunction()->start();
}
//线程调用系统键盘
void functionThread::runWinSoftKeyboard()
{
PVOID OldValue = nullptr;
BOOL bRet = Wow64DisableWow64FsRedirection(&OldValue);
QString csProcess = "C:\\Windows\\System32\\osk.exe";
QString params="";
ShellExecute(nullptr, L"open", (LPCWSTR)csProcess.utf16(), (LPCWSTR)params.utf16(), nullptr, SW_SHOWNORMAL);
if (bRet)
{
Wow64RevertWow64FsRedirection(OldValue);
}
}
调用:
functionThread::winSoftKeyboard();