Qt的线程与异步
来源:互联网 发布:网络爱国事例 编辑:程序博客网 时间:2024/06/05 11:35
Qt线程
使用Qt开发多线程应用,这里有一篇必看的官网博客:You are doing it wrong,文章讲了QThread使用时常犯的错误。总结下来,QThread的正确使用思路有两种:
- 继承QThread,重新实现run(),将需要次线程执行的代码写入run()即可。
- 继承QObject实现功能,使用线程时创建一个QThread对象,将QObject对象通过moveToThread()移入该线程。
update:今天看Qt5的文档,发现官方文档已经添加了示例代码,直接看这个就可以了。
- Threading Basics
- QThread Class
Qt并发
并发是更高层的接口,可以不去操作底层的线程,也不需要关心信号和槽所在的线程,比较容易上手。Qt Concurrent使用方法很简单,如果是普通函数,调用方式为:
QFuture<T> QtConcurrent::run(Function function, ... )
如果是类的成员函数,需要传入对象指针。比如上面的例子,相当于默认传入了一个全局指针:
QtConcurrent::run(QThreadPool::globalInstance(), function, ...);
C++ 11的异步和线程
对比一下C++标准的异步实现:
#include <iostream>#include <future>#include <thread>std::future<int> ft;void async_func(){ // 开始异步执行 ft = std::async(std::launch::async, [](){ std::cout << "async start" <<endl; std::this_thread::sleep_for(std::chrono::seconds(3)); return 2046; });}void testAsync(){ std::future_status status; do { // 等一秒查一下状态 status = ft.wait_for(std::chrono::seconds(1)); if (status == std::future_status::deferred) { std::cout << "deferred" << std::endl; } else if (status == std::future_status::timeout) { std::cout << "timeout" << std::endl; } else if (status == std::future_status::ready) { std::cout << "ready" << std::endl; std::cout << ft.get() << std::endl; } } while(status != std::future_status::ready);}
下面是线程的简单示例(互斥锁):
#include <thread>#include <mutex>#include <chrono>std::mutex mlock;void func(){ mlock.lock(); // 可以去掉锁后观察区别 std::cout << "in...." << std::this_thread::get_id() << std::endl; std::this_thread::sleep_for(std::chrono::seconds(2)); std::cout << "out..." << std::this_thread::get_id() << std::endl; mlock.unlock();}void testThread(){ std::thread t1(func); std::thread t2(func); t1.join(); t2.join();}
阅读全文
0 0
- Qt的线程与异步
- Qt的线程与异步
- Qt 线程同步与异步处理
- 线程的同步与异步
- 线程的同步与异步
- 线程的同步与异步
- 线程的同步与异步
- 线程的同步与异步
- QNetworkAccessManager的异步与线程
- qt与linux的线程
- QT的进程与线程
- 我理解的异步与线程
- 线程同步与异步的区别
- 线程同步与异步的学习摘记
- C# 线程与异步
- 线程同步与异步
- 线程同步与异步
- 线程同步与异步
- JDK日志框架解读
- hdu2431 Counting problem
- 数字游戏
- 反射
- Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
- Qt的线程与异步
- 浅谈C语言与JAVA语言
- HDU 4614 Vases and Flowers (线段树[区间赋值+区间求和] + 二分)
- XML详解
- linux下开启和停止防火墙
- 几个概念——关于人工智能、大数据、深度学习
- HttpClient-4.3.X 中get和post方法使用
- Python爬虫实战之抓取淘宝MM照片(一)
- HttpClient在java中的使用