#include "mythread.h"
#include <QElapsedTimer>
#include <QDebug>
#include <QTime>
#include <QThread>
Generate::Generate(QObject *parent) : QObject(parent), QRunnable()
{
setAutoDelete(true);// 设置当前类对象放到线程池里之后,工作完毕后自动析构
}
void Generate::recvNum(int num)
{
m_num = num;
}
void Generate::run()
{
qDebug() << "生成随机数的线程的线程地址" << QThread::currentThread();
QVector<int> list;
QElapsedTimer time;
// 使用系统时间初始化随机数种子
qsrand(QTime::currentTime().msec());
time.start();
for(int i = 0; i < m_num; i++)
{
list.push_back(qrand() % 100000);
}
int milsec = time.elapsed();// 获取程序运行时间
qDebug() << "生成" << m_num << "个随机数总共用时" << milsec << "ms";
emit sendArray(list);
}
BubbleSort::BubbleSort(QObject *parent) : QObject(parent), QRunnable()
{
setAutoDelete(true);// 设置当前类对象放到线程池里之后,工作完毕后自动析构
}
void BubbleSort::recvArray(QVector<int> list)
{
m_list = list;
}
void BubbleSort::run()
{
qDebug() << "冒泡排序的线程地址" << QThread::currentThread();
QElapsedTimer time;
time.start();
int temp;
for(int i=0; i<m_list.size(); ++i)
{
for(int j=0; j<m_list.size()-i-1; ++j)
{
if(m_list[j] > m_list[j+1])
{
temp = m_list[j];
m_list[j] = m_list[j+1];
m_list[j+1] = temp;
}
}
}
int milsec = time.elapsed();// 获取程序运行时间
qDebug() << "冒泡排序用时" << milsec << "ms";
emit finish(m_list);
}
QuickSort::QuickSort(QObject *parent) : QObject(parent), QRunnable()
{
setAutoDelete(true);// 设置当前类对象放到线程池里之后,工作完毕后自动析构
}
void QuickSort::recvArray(QVector<int> list)
{
m_list = list;
}
void QuickSort::run()
{
qDebug() << "快速排序的线程地址" << QThread::currentThread();
QElapsedTimer time;
time.start();// 开始计时
quickSort(m_list, 0, m_list.size() - 1);
int milsec = time.elapsed();// 获取程序运行时间
qDebug() << "快速排序用时" << milsec << "ms";
emit finish(m_list);
}
void QuickSort::quickSort(QVector<int> &list, int l, int r)
{
if(l < r)
{
int i = l, j = r;
// 拿出第一个元素,保存到x中,第一个位置成为一个坑
int x = list[l];
while (i < j) {
// 从右向做找小于x的数
while (i < j && list[j] >= x) {
// 直到遇到小于等于x的数
j--;
}
if (i < j)
{
//将右侧找到的小于x的元素放入左侧坑中,右侧出现一个坑
//左侧元素索引后移
list[i++] = list[j];
}
//从左向右找大于等于x的数
while (i < j && list[i] < x)
{
//右移,直到遇到大于x的数
i++;
}
if(i < j)
{
//将左侧找到的元素放入右侧坑中,左侧出现一个坑
//右侧元素索引向前移动
list[j--]= list[i];
}
}
// 此时i=j,将保存在x中的数填入坑中
list[i] = x;
quickSort(list, l, i - 1);// 递归调用
quickSort(list, i+ 1, r);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt创建线程的两种方式+线程池方式
共24个文件
cpp:9个
h:6个
pro:3个
需积分: 5 0 下载量 91 浏览量
2024-04-29
16:50:23
上传
评论
收藏 23KB ZIP 举报
温馨提示
1.方式1:继承 QThread 类方式:通过继承 QThread 类并重写 run() 函数来创建线程,线程对象本身即为线程。 优点:相对简单,易于理解和实现;可以直接重写 run() 函数来定义线程的逻辑;可以通过信号和槽机制与其他对象进行通信。 缺点:对象和线程是紧密耦合的,可能导致设计上的限制和复杂性;不能方便地重复使用线程对象,每次都需要创建一个新的对象。 2.方式2:使用类对象的 moveToThread() 方式:将对象移动到线程中,并在线程中手动调用对象的工作函数来创建线程。 优点:对象与线程分离,使得线程逻辑和对象逻辑分离,提高了代码的可维护性和灵活性;可以将一个对象移动到多个线程中,实现线程间的数据共享和交互;可以使用信号和槽机制在对象和线程之间进行通信。 缺点:需要手动管理对象的生命周期,包括正确的对象移动和线程退出的处理;需要手动调用对象的工作函数,增加了一定的复杂性。 两种方式的选择取决于具体的需求和设计。仅需简单的线程操作,继承 QThread 类方式可能更为简洁。如果需要更灵活的线程控制和对象交互,使用类对象的 moveToThread() 方式可能更适合
资源推荐
资源详情
资源评论
收起资源包目录
Thread_creation.zip (24个子文件)
Thread_creation
QThread_1
mainwindow.h 418B
mythread.cpp 3KB
QThread_1.pro 1KB
mainwindow.cpp 2KB
main.cpp 240B
mainwindow.ui 2KB
QThread_1.pro.user 22KB
mythread.h 1KB
QThread_2
mainwindow.h 418B
mythread.cpp 3KB
QThread_2.pro 1KB
mainwindow.cpp 2KB
main.cpp 240B
mainwindow.ui 2KB
mythread.h 939B
QThread_2.pro.user 22KB
QThreadpool
QThreadpool.pro 1KB
mainwindow.h 418B
mythread.cpp 4KB
mainwindow.cpp 2KB
main.cpp 240B
mainwindow.ui 2KB
QThreadpool.pro.user 22KB
mythread.h 1KB
共 24 条
- 1
资源评论
可可西里啊
- 粉丝: 292
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功