qt之qthread的使用

我们知道c++使用线程很方便

#include <thread>
void func()
{
	std::cout<<"hello"<<std::endl;
}
int main()
{
	std::thread t(func);
	t.join();  //阻塞执行  ,等待函数执行完毕才会执行后面的操作
	std::thread t1(func);
	t1.detach();   //放在后台执行
}

qt有一个类叫Qthread
网上有很多方法,包括qt的官方文档,写的是尽量使用movetothread,需要创建一个qobject类,这个类中放耗时函数。然后创建Qthread,通过stdmovetothread将耗时函数操作在另外一条线程中执行。需要在析构函数中进行删除。我觉得这样写不是很方便。
当我只需要执行一个函数,却需要创建一个类,很麻烦
qthread进行操作的是run函数,我觉得继承写就是可以的

class EP_JobShotIndexThread :public QThread
{
	Q_OBJECT

public:
	EP_JobShotIndexThread(EP_JobWgt *pwgt, QList<QString> i_idList, QList<QString> i_norepeatList)
	{
		m_pJobWgt = pwgt;
		m_ShotIDList = i_idList;
		m_noRepeatShotIDList = i_norepeatList;
	}

private:

	void run()
	{
		m_pJobWgt->SetShotDataIndex(m_ShotIDList, m_noRepeatShotIDList);
	}

	EP_JobWgt* m_pJobWgt = nullptr;
	QList<QString> m_ShotIDList;
	QList<QString> m_noRepeatShotIDList;

};

我的耗时函数是

void EP_JobWgt::SetShotDataIndex(QList<QString> i_idList, QList<QString> i_norepeatList)
{
	for (auto i : i_norepeatList)
	{
		int index = 0;
		for (int j = 0; j < i_idList.size(); j++)
		{
			if (i == i_idList[j])
			{
				index = index + 1;
				m_pShotListTableModel->setData(m_pShotListTableModel->index(j, 3), index);
			}
		}
	}
}

这个进行测试,是需要大概15秒左右的时间才能执行完成。所以我将他放在线程中执行。
使用起来也很方便

EP_JobShotIndexThread* thread = new EP_JobShotIndexThread(this,StrIdList, norepeatIDList);
	thread->start();

ヾ( ̄▽ ̄)ByeBye

Qt使用 QThread 实现多线程可以分为以下步骤: 1. 创建一个继承自 QThread 的子类,重写其 run() 方法,该方法将在新的线程中执行。 2. 在子类中定义信号和槽,以便在主线程和子线程之间进行通信。 3. 在主线程中创建子线程对象,并使用 start() 方法启动线程。 4. 在主线程使用 connect() 方法将子线程的信号与主线程的槽连接起来,以实现跨线程通信。 以下是一个简单的示例: ```c++ #include <QThread> #include <QDebug> class MyThread : public QThread { Q_OBJECT signals: void mySignal(QString message); protected: void run() override { qDebug() << "Thread started"; emit mySignal("Hello from thread"); qDebug() << "Thread finished"; } }; class MyClass : public QObject { Q_OBJECT public slots: void mySlot(QString message) { qDebug() << "Received message:" << message; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyThread thread; MyClass obj; QObject::connect(&thread, &MyThread::mySignal, &obj, &MyClass::mySlot); thread.start(); return a.exec(); } #include "main.moc" ``` 在这个例子中,我们定义了一个 MyThread 类,它继承自 QThread,重写了 run() 方法,并定义了一个 mySignal 信号。我们还定义了一个 MyClass 类,它有一个名为 mySlot 的槽,用于接收 MyThread 发出的信号。在 main() 函数中,我们创建了一个 MyThread 对象和一个 MyClass 对象,并使用 connect() 方法将 mySignal 信号连接到 mySlot 槽。然后,我们调用 start() 方法来启动线程。当 run() 方法被执行时,它将发出 mySignal 信号,并传递一个字符串参数。这个信号将被发送到主线程,并调用 mySlot 槽来处理它。最后,我们调用 a.exec() 来启动 Qt 的事件循环,以便在主线程中接收信号和执行槽函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油小杜(接qt定制功能,单模块开发等)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值