Qt 创建一个线程执行某个函数

某个函数需要用线程执行时,创建一个一次性的线程,在线程里面调用该函数。

头文件

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();

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值