当前位置: 首页 > news >正文

网站开发需要的软件有哪些做网站前端多少钱

网站开发需要的软件有哪些,做网站前端多少钱,网站开发 售后服务协议,动画制作教学为了让程序尽快响应用户操作#xff0c;在开发应用程序时经常会使用到线程。对于耗时操作如果不使用线程#xff0c;UI 界面将会长时间处于停滞状态#xff0c;这种情况是用户非常不愿意看到的#xff0c;我们可以用线程来解决这个问题。 大多数情况下#xff0c;多线程耗…为了让程序尽快响应用户操作在开发应用程序时经常会使用到线程。对于耗时操作如果不使用线程UI 界面将会长时间处于停滞状态这种情况是用户非常不愿意看到的我们可以用线程来解决这个问题。 大多数情况下多线程耗时操作会与 UI 进行交互比如显示进度、加载等待。。。让用户明确知道目前的状态并对结果有一个直观的预期甚至有趣巧妙的设计能让用户爱上等待把等待看成一件很美好的事。 一、多线程操作 UI 界面的示例 下面是一个使用多线程操作 UI 界面的示例 - 更新进度条采用子类化 QThread 的方式。与此同时分享在此过程中有可能遇到的问题及解决方法。 首先创建 QtGui 应用工程名称为 “myThreadBar”类名选择 “QMainWindow”其他选项保持默认即可。再添加一个名称为 WorkerThread 的头文件定义一个 WorkerThread 类让其继承自 QThread并重写 run () 函数修改 workerthread.h 文件如下 #ifndef WORKERTHREAD_H #define WORKERTHREAD_H#include QThread #include QDebugclass WorkerThread : public QThread {Q_OBJECTpublic:explicit WorkerThread(QObject *parent 0): QThread(parent){qDebug() Worker Thread : QThread::currentThreadId();}protected:virtual void run() Q_DECL_OVERRIDE{qDebug() Worker Run Thread : QThread::currentThreadId();int nValue 0;while (nValue 100){// 休眠50毫秒msleep(50);nValue;// 准备更新emit resultReady(nValue);}}signals:void resultReady(int value); };#endif // WORKERTHREAD_H 通过在 run () 函数中调用 msleep (50)线程会每隔 50 毫秒让当前的进度值加 1然后发射一个 resultReady () 信号其余时间什么都不做。在这段空闲时间线程不占用任何的系统资源。当休眠时间结束线程就会获得 CPU 时钟将继续执行它的指令。在 mainwindow.ui 上添加一个按钮和进度条部件然后 mainwindow.h 修改如下 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include QMainWindow #include workerthread.hnamespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget *parent nullptr);~MainWindow();private slots:// 更新进度void handleResults(int value);// 开启线程void startThread();private:Ui::MainWindow *ui;WorkerThread m_workerThread; };#endif // MAINWINDOW_H 然后 mainwindow.cpp 修改如下 #include mainwindow.h #include ui_mainwindow.hMainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui-setupUi(this);qDebug() Main Thread : QThread::currentThreadId(); // 连接信号槽this-connect(ui-pushButton, SIGNAL(clicked(bool)), this, SLOT(startThread())); }MainWindow::~MainWindow() {delete ui; }void MainWindow::handleResults(int value) {qDebug() Handle Thread : QThread::currentThreadId();ui-progressBar-setValue(value); }void MainWindow::startThread() {WorkerThread *workerThread new WorkerThread(this);this-connect(workerThread, SIGNAL(resultReady(int)), this, SLOT(handleResults(int)));// 线程结束后自动销毁this-connect(workerThread, SIGNAL(finished()), workerThread, SLOT(deleteLater()));workerThread-start(); } 由于信号与槽连接类型默认为 “Qt::AutoConnection”在这里相当于 “Qt::QueuedConnection”。也就是说槽函数在接收者的线程主线程中执行。 执行程序“应用程序输出” 窗口输出如下 Main Thread : 0x3140 Worker Thread : 0x3140 Worker Run Thread : 0x2588 Handle Thread : 0x3140 显然UI 界面、Worker 构造函数、槽函数处于同一线程主线程而 run () 函数处于另一线程次线程。 回到顶部 二、避免多次 connect 当多次点击 “开始” 按钮的时候就会多次 connect ()从而启动多个线程同时更新进度条。为了避免这个问题我们先在 mainwindow.h 上添加私有成员变量 WorkerThread m_workerThread;然后修改 mainwindow.cpp 如下 #include mainwindow.h #include ui_mainwindow.hMainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui-setupUi(this);// 连接信号槽this-connect(ui-pushButton, SIGNAL(clicked(bool)), this, SLOT(startThread()));this-connect(m_workerThread, SIGNAL(resultReady(int)), this, SLOT(handleResults(int))); }MainWindow::~MainWindow() {delete ui; }void MainWindow::handleResults(int value) {qDebug() Handle Thread : QThread::currentThreadId();ui-progressBar-setValue(value); }void MainWindow::startThread() {if (!m_workerThread.isRunning())m_workerThread.start(); } 不再在 startThread () 函数内创建 WorkerThread 对象指针而是定义私有成员变量再将 connect 添加在构造函数中保证了信号槽的正常连接。在线程 start () 之前可以使用 isFinished () 和 isRunning () 来查询线程的状态判断线程是否正在运行以确保线程的正常启动。 三、优雅地结束线程的两种方法 如果一个线程运行完成就会结束。可很多情况并非这么简单由于某种特殊原因当线程还未执行完时我们就想中止它。 不恰当的中止往往会引起一些未知错误。比如当关闭主界面的时候很有可能次线程正在运行这时就会出现如下提示 QThread: Destroyed while thread is still running 这是因为次线程还在运行就结束了 UI 主线程导致事件循环结束。这个问题在使用线程的过程中经常遇到尤其是耗时操作。大多数情况下当程序退出时次线程也许会正常退出。这时虽然抱着侥幸心理但隐患依然存在也许在极少数情况下就会出现 Crash。 所以我们应该采取合理的措施来优雅地结束线程一般思路 发起线程退出操作调用 quit () 或 exit ()。 等待线程完全停止删除创建在堆上的对象。 适当的使用 wait ()用于等待线程的退出和合理的算法。 方法一 这种方式是 Qt4.x 中比较常用的主要是利用 “QMutex 互斥锁 bool 成员变量” 的方式来保证共享数据的安全性。在 workerthread.h 上继续添加互斥锁、析构函数和 stop () 函数修改如下 #ifndef WORKERTHREAD_H #define WORKERTHREAD_H#include QThread #include QMutexLocker #include QDebugclass WorkerThread : public QThread {Q_OBJECTpublic:explicit WorkerThread(QObject *parent 0): QThread(parent),m_bStopped(false){qDebug() Worker Thread : QThread::currentThreadId();}~WorkerThread(){stop();quit();wait();}void stop(){qDebug() Worker Stop Thread : QThread::currentThreadId();QMutexLocker locker(m_mutex);m_bStopped true;}protected:virtual void run() Q_DECL_OVERRIDE {qDebug() Worker Run Thread : QThread::currentThreadId();int nValue 0;while (nValue 100){// 休眠50毫秒msleep(50);nValue;// 准备更新emit resultReady(nValue);// 检测是否停止{QMutexLocker locker(m_mutex);if (m_bStopped)break;}// locker超出范围并释放互斥锁}}signals:void resultReady(int value);private:bool m_bStopped;QMutex m_mutex; };#endif // WORKERTHREAD_H 当主窗口被关闭其 “子对象” WorkerThread 也会析构调用 stop () 函数使 m_bStopped 变为 true则 break 跳出循环结束 run () 函数结束进程。当主线程调用 stop () 更新 m_bStopped 的时候run () 函数也极有可能正在访问它这时他们处于不同的线程所以存在资源竞争因此需要加锁保证共享数据的安全性。 为什么要加锁很简单是为了共享数据段操作的互斥。避免形成资源竞争的情况多个线程有可能访问同一共享资源的情况。方法二 Qt5 以后可以使用 requestInterruption ()、isInterruptionRequested () 这两个函数使用很方便修改 workerthread.h 文件如下 #ifndef WORKERTHREAD_H #define WORKERTHREAD_H#include QThread #include QMutexLocker #include QDebugclass WorkerThread : public QThread {Q_OBJECTpublic:explicit WorkerThread(QObject *parent nullptr): QThread(parent){qDebug() Worker Thread : QThread::currentThreadId();}~WorkerThread(){// 请求终止requestInterruption();quit();wait();}protected:virtual void run() Q_DECL_OVERRIDE{qDebug() Worker Run Thread : QThread::currentThreadId();int nValue 0;// 是否请求终止while (!isInterruptionRequested()){while (nValue 100){// 休眠50毫秒msleep(50);nValue;// 准备更新emit resultReady(nValue);}}} signals:void resultReady(int value); };#endif // WORKERTHREAD_H 在耗时操作中使用 isInterruptionRequested () 来判断是否请求终止线程如果没有则一直运行当希望终止线程的时候调用 requestInterruption () 即可。这两个函数内部也使用了互斥锁 QMutex。
http://www.zqtcl.cn/news/780520/

相关文章:

  • 资阳房地产网站建设学校网站建设板块分析
  • 山东华邦建设网站首页wordpress h5自适应
  • 合肥市建设工程劳务分包合同备案表在哪个网站下载国际国内热点新闻事件
  • 临猗做网站怎么做挣钱的网站
  • 做软装找图片的网站wordpress 表单留言
  • 360网站挂马检测wordpress路径爆出
  • 有什么网站学做标书的专门做短视频的公司
  • 网站怎么做图片动态图片短视频推广
  • 海口的网站建设网页设计欣赏可爱风格
  • 高端网站设计哪个好五莲网站建设维护推广
  • 外贸网站 测速国内创意网页设计
  • 网站商城前台模板免费下载自己做网站统计
  • 十大免费货源网站免费版本厦门建网站多少钱
  • 网站建设投标书范本深圳网页设计培训多少钱
  • 动态ip可以做网站北京万户网络
  • 网址大全免费网站中国建设银行驻莫斯科网站
  • 网站建设 教材 推荐网站导入
  • 网站备案扫描智能软件开发就业前景
  • 快速网站建设费用口碑营销图片
  • wordpress地址和站点地址错天津seo诊断
  • 张云网站建设做谷歌推广比较好的公司
  • 电子商务网站建设与管理的论文题目智能自助建站系统源码
  • 个人网站建设价格网站做视频转流量
  • 点网站出图片怎么做深圳市中心在哪
  • 企业网站建设58同城网站优化排名软件哪些最好
  • 最专业企业营销型网站建设企业宣传海报设计制作
  • 石家庄建站公司软件开发岗位介绍
  • 网站开发知识视频教程公司网站总感觉少点什么找什么人做
  • 做网站ps建立多大的画布网站排名监控工具
  • 烟台网站开发网站建设横幅标语