多线程的使用与注意事项
来源:互联网 发布:java hashmap 红黑树 编辑:程序博客网 时间:2024/05/16 18:21
主要介绍一下iPhone SDK中多线程的使用方法以及注意事项。虽然现在大部分PC应用程序都支持多线程/多任务的开发方式,但是在iPhone上,Apple并不推荐使用多线程的编程方式。但是多线程编程毕竟是发展的趋势,而且据说即将推出的iPhone OS4将全面支持多线程的处理方式。所以说掌握多线程的编程方式,在某些场合一定能挖掘出iPhone的更大潜力。
从例子入手
先从一个例程入手,具体的代码参考了这里。还有例程可以下载。
多线程程序的控制模型可以参考这里,一般情况下都是使用 管理者/工人模型, 这里,我们使用iPhone SDK中的 NSThread 来实现它。
首先创建一个新的 View-based application 工程,名字为 "TutorialProject" 。界面如下图所示,使用UILabel实现两部分的Part(Thread Part和Test Part),Thread Part中包含一个UIProgressView和一个UIButton;而Test Part包含一个值和一个UISlider。
接下来,在 TutorialProjectViewController.h 文件中创建各个UI控件的 IBOutlets.
同时,也需要创建outlets变量的property.
接下来定义按钮按下时的动作函数,以及slider的变化函数。
然后在 TutorialProjectViewController.m 文件中synthesize outlets,并在文件为实现dealloc释放资源。
现在开始线程部分的代码,首先当 thread button 被按下的时候,创建新的线程.
该按钮被按下后,隐藏按钮以禁止多次创建线程。然后初始化显示值和进度条,最后创建新的线程,线程的函数为 startTheBackgroundJob.
具体的 startTheBackgroundJob 函数定义如下.
在第1行,创建了一个 NSAutoreleasePool 对象,用来管理线程中自动释放的对象资源。这里 NSAutoreleasePool 在线程退出的时候释放。这符合 Cocoa GUI 应用程序的一般规则。
最后一行,阻塞调用(waitUntilDone状态是ON)函数 makeMyProgressBarMoving。
这里计算用于显示的进度条的值,利用 NSTimer ,每0.5秒自增0.01,当值等于1的时候,进度条为100%,退出函数并显示刚才被隐藏的按钮。
最后,添加 UISlider 的实现函数,用来更改主线程中 Test Part 中的 label 值。
编译执行,按下线程开始按钮,你将看到进度条的计算是在后台运行。
使用线程的注意事项
线程的堆栈大小
iPhone设备上的应用程序开发也是属于嵌入式设备的开发,同样需要注意嵌入式设备开发时的几点问题,比如资源上限,处理器速度等。
iPhone 中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第二个线程开始都是512KB。并且该值不能通过编译器开关或线程API函数来更改。
你可以用下面的例子测试你的设备,这里使用POSIX Thread(pthread),设备环境是 iPhone 3GS(16GB)、SDK是3.1.3。
结果如下:
- 模拟器
Main thread: base:0xc0000000 / size:524288rlimit-> soft:8388608 / hard:67104768Thread: base:0xb014b000 / size:524288
- 设备
Main thread: base:0x30000000 / size:524288rlimit-> soft:1044480 / hard:1044480Thread: base:0xf1000 / size:524288
由此可见,当你测试多线程的程序时,模拟器和实际设备的堆栈大小是不一样的。如果有大量递归函数调用可要注意了。
Autorelease
如果你什么都不考虑,在线程函数内调用 autorelease 、那么会出现下面的错误:
NSAutoReleaseNoPool(): Object 0x********* of class NSConreteData autoreleased with no pool in place ….
一般,在线程中使用内存的模式是,线程最初
而在线程结束的时候 [pool drain] 或 [pool release]。1
子线程中描画窗口
多线程编程中普遍遵循一个原则,就是一切与UI相关的操作都有主线程做,子线程只负责事务,数据方面的处理。那么如果想在子线程中更新UI时怎么做呢?如果是在windows下,你会 PostMessage 一个描画更新的消息,在iPhone中,需要使用performSelectorOnMainThread 委托主线程处理。
比如,如果在子线程中想让 UIImageView 的 image 更新,如果直接在线程中
这么做,什么也不会出现的。需要将该处理委托给主线程来做,像下面:
就OK了!
- 多线程的使用与注意事项
- iPhone 多线程的使用与注意事项
- iPhone开发进阶(11)--- 多线程的使用与注意事项
- iPhone开发进阶(11)--- 多线程的使用与注意事项
- iPhone开发进阶(11)--- 多线程的使用与注意事项
- c-多线程使用的注意事项
- iPhone开发多线程使用与注意事项
- iPhone开发多线程使用与注意事项
- linux下使用多线程的注意事项
- iPhone开发进阶(11)— 多线程的使用与注意事项
- libcurl 多线程使用注意事项
- 多线程使用注意事项
- libcurl 多线程使用注意事项
- libcurl 多线程使用注意事项
- 多线程join使用注意事项
- STL的使用与注意事项
- 多线程编程的注意事项
- 多线程的一些注意事项
- DevDiv移动开发社区编著的《Windows Phone开发实战体验(应用+游戏)》隆重登场啦
- arm linux 启动流程
- Android工程师怒斥360拦截弹窗广告
- wpf+.net 4.5 surface2.0 = 异步多点触控 时间轴 part5
- 设计模式之——模板方法
- 多线程的使用与注意事项
- 解决使用枚举串口类而造成无法无法解析的外部符号的问题
- 第一日
- 使用RealViewMDK时常见的问题 access violation at 0xFFFFFFFC: no “write” permission
- 选择排序的php实现 Selection Sort
- 什么是实时数据库? .
- ASP 常用MD5加密程序(16位、32位、小写、大写)
- Eclipse中设置编码的方式
- 用gdb和gdbserver远程调试tq2440