树莓派中安装QT
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:WIN7
硬件:树莓派
步骤:
参考链接:http://qt-project.org/wiki/apt-get_Qt4_on_the_Raspberry_Pi
Firstly I got the development tools needed by Qt Creator in the hope it would be less heavy for the Pi to download separately.
Then I went for Qt Creator
I also installed
this gives as a result Qt Creator 2.5 with Qt 4.8.1 32 bit
如果出现问题:e: unable to locate package qt creator,则输入以下命令更新
sudo apt-get update && sudo apt-get upgrade
如果还是有问题,尝试sudo apt-get install qtcreator
We can only compile for remote embedded devices and this is not the case here, because we are on the Pi and not remotely accessing it.
I added a gcc toolchain
Options > build & run > tab tool chain > button add
Choose GCC
- Then set compiler path : /usr/bin/arm-linux-gnueabihf-gcc-4.6
- Debugger : /usr/bin/gdb
- Mkspec : default
Qt Creator seems to detect that we are going to deploy on a remote target.
To fix this :
- Go to menu help > about plugins
- Uncheck device support > remote linux
- Restart Qt Creator
- Go to tools > options TAB > build & run > Qt versions > add “/usr/bin/qmake-qt4”
It will then show up as a desktop project in the project wizard instead of embedded.
【前言】我们从事Android开发以来,都自始自终被灌输着处理耗时的任务时要在非UI线程做。于是我们有了各种处理并发的编程手段,无论是自己用new Thread(Runnable)新起工作线程(Worker thread),还是利用Android提供的API(AsnyTask,CursorLaoder等)都是处理耗时任务的。但是在一个大型的应用程序中,如果我们需要处理数量很多且频繁的耗时任务时,如果还是采用之前的手段,无疑会带来很多不便;一来频繁创建销毁线程会造成资源(内存和Cpu)的浪费,二来代码会显得很凌乱。于是我们提出了使用线程池来处理频繁的耗时任务。
在JDK1.5的类库中,JAVA的开发者就给我们提供了现成的线程池,java.util.concurrent包下就提供了线程池的api。
我的应用架构设计中,在处理并发的任务时,就要用到线程池,关于线程池,我把它想成是一个统一管理多线程任务的地方,具体来说,就是线程池接受多线程任务(实现Runnable接口),并通过创建线程池时配置好的一些参数来统一管理和执行这些任务,我们在需要执行耗时任务的时候,只需要向线程池发送一个消息(希望执行的耗时操作)就可以了,当然,我们在发送请求的同时,可以传入一些回调的接口,这样就能在耗时任务执行完毕之后得到回调来更新UI。
如何实现自定义的线程池?
JDK提供的线程池固然可以满足一般的开发需求,但是实现自定义的线程池还是很有必要的。
自定义线程池一般可以继承自类ThreadPoolExcutor,该类的构造方法里面有几个很重要的参数,这几个参数决定着线程池的策略和处理能力。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。
threadFactory - 执行程序创建新线程时使用的工厂。
handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
这些参数既可以在构造的时候传入,也可以在后期通过set方法来设定。
setMaximumPoolSize(int maximumPoolSize)
setRejectedExecutionHandler(RejectedExecutionHandler handler)
setKeepAliveTime(long time, TimeUnit unit)
setCorePoolSize(int corePoolSize)
线程池表达了一种边界的概念,这个边界是通过corePoolSize和maximumPoolSize来体现的,如果线程池接受的任务小于corePoolSize,则新提交的任务会被线程池通过新建线程来处理,如果大于corePoolSize而小于maximumPoolSize,则新传入的任务会被排队队列容纳,如果队伍容纳不下或者队列是直接提交型队列时,任务就会被提交给线程池,线程池会创建新线程来处理任务,如果大于maximumPoolSize,则新加入的任务会被拒绝,这里要注意的时,被拒绝的意思并不等于被抛弃,只是会触发线程池的RejectExecutionHandler,这里我们可以通过设置自定义的handler来实现线程池的拒绝策略(比如用一个队列来保存被拒绝的任务,以后还可以从该队列取出任务继续执行)。
在自定义线程池的时候,选择合适的排队队列显得尤为重要,我们一般有以下三种队列可选
SynchronousQueue 直接提交队列,该队列不会保存任务,而是会把任务直接提交给线程池。
LinkedBlockingQueue 无界队列,这队列没有极限,可以无限加入任务保存,这样maximumPoolSize就不起作用了,创建的线程数就永远不会超过corePoolSize了。
ArrayBlockingQueue 有界队列。
如何处理被拒绝任务?
1.定义被拒绝的策略
当 Executor 已经关闭,并且 Executor 将有限边界用于最大线程和工作队列容量,且已经饱和时,在方法 execute(java.lang.Runnable) 中提交的新任务将被拒绝。在以上两种情况下,execute 方法都将调用其 RejectedExecutionHandler 的 RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) 方法。
ThreadPoolExecutor.AbortPolicy
用于被拒绝任务的处理程序,它将抛出 RejectedExecutionException.
ThreadPoolExecutor.CallerRunsPolicy
用于被拒绝任务的处理程序,它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务。 ThreadPoolExecutor.DiscardOldestPolicy
用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试 execute;如果执行程序已关闭,则会丢弃该任务。
ThreadPoolExecutor.DiscardPolicy
用于被拒绝任务的处理程序,默认情况下它将放弃被拒绝的任务。
2.自定义RejectedExecutionHandler
使用自定义RejectedExecutionHandler来定义线程池的拒绝策略,比如用一个队列来保存被拒绝的任务以便以后继续执行或者直接丢弃。
更多灵活的处理
ThreadPoolExcutor提供了一些可被覆写的hook方法
afterExecute(Runnable r,
Throwable t)
基于完成执行给定 Runnable 所调用的方法。
beforeExecute(Thread t,
Runnable r)
在执行给定线程中的给定 Runnable 之前调用的方法。
这两个方法在每个任务被线程池执行前后都被会回调,所以我们可以覆写这两个方法来自定义需要的功能。
前两天看到一个文章,题名为《所有的程序员都是自学成才》。当时没有什么特别的想法,只是觉得自己也确实是基本上靠自学来掌握新的知识的。但是今天在公车上没事好好想了一想,想明白了,原来对于程序员来说,只能自学才能成才。
这个道理似乎有点奇怪,因为我们从小都是由老师教授新知识的。我自己也实验过,掌握同样的高中课本上的知识,自己自学的速度通常比老师讲授的速度要慢一倍的时间。即一个知识点,如果你自己要看2小时的书才能理解的话,有好的老师给你讲解的话,只需要一个小时就够了。所以,我一直希望在学习各种东西的时候都能去听一些课程,因为我认为这样节省了我学习的时间。
但是这个道理在程序员这一行行不通,为什么这么说呢?原因有2点:
计算机编程相关的知识更新速度很快。同时,国内的IT类资料的翻译质量相当差,原创的优秀书籍也很少。所以,我们通常需要靠阅读英文才能掌握最新的资料。 计算机编程知识需要较多的专业知识积累和实践。
如果一个培训机构有一个老师,他强到能够通过自己做一些项目来积累很多专业知识和实践,并且不断地从国外资料上学习最新的技术。那么这个人在企业里面会比在国内的培训机构更有施展自己能力的空间。国内的培训机构因为受众面的原因,基本上还是培养那种没有自学能力,只能做低级技术活的代码民工,所以对老师的技术要求不会那么高,自然也不会给出很诱人的薪水。但是企业就不一样了,企业需要不停地利用新技术来增强自己的产品竞争力,所以对于IT企业来说,产品的竞争就是人才的竞争,所以给优秀的人能够开出很高的薪水。
所以,我们不能期望从IT类培训机构中学习到最新的技术,一切只能通过我们自学。当然,自学之后在同行之间相互交流,对于我们的技术成长也是很有用的。
所以,各位同行,别想有人能够教你,一切还是靠自己吧。
1楼mazhaojuan前天 16:35自学是一种能力!