国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

iPhone SDK 多線程使用方法以及注意事項(xiàng)

移動(dòng)開(kāi)發(fā) iOS
本文介紹的iPhone SDK 多線程使用方法以及注意事項(xiàng),很詳細(xì)的解決了我們常見(jiàn)的一些問(wèn)題,心來(lái)看內(nèi)容。

iPhone SDK 多線程使用方法以及注意事項(xiàng)是本文要介紹的內(nèi)容,不多說(shuō),直接進(jìn)入話題。雖然現(xiàn)在大部分PC應(yīng)用程序都支持多線程/多任務(wù)的開(kāi)發(fā)方式,但是在iPhone上,Apple并不推薦使用多線程的編程方式。但是多線程編程畢竟是發(fā)展的趨勢(shì),而且據(jù)說(shuō)即將推出的iPhone OS4將全
 
雖然現(xiàn)在大部分PC應(yīng)用程序都支持多線程/多任務(wù)的開(kāi)發(fā)方式,但是在iPhone上,Apple并不推薦使用多線程的編程方式。但是多線程編程畢竟是發(fā)展的趨勢(shì),而且據(jù)說(shuō)即將推出的iPhone OS4將全面支持多線程的處理方式。所以說(shuō)掌握多線程的編程方式,在某些場(chǎng)合一定能挖掘出iPhone的更大潛力

從例子入手

先從一個(gè)例程入手,具體的代碼參考了這里。還有例程可以下載。多線程程序的控制模型可以參考這里,一般情況下都是使用 管理者/工人模型, 這里,我們使用iPhone SDK中的 NSThread 來(lái)實(shí)現(xiàn)它。

首先創(chuàng)建一個(gè)新的 View-based application 工程,名字為 "TutorialProject" 。界面如下圖所示,使用UILabel實(shí)現(xiàn)兩部分的Part(Thread Part和Test Part),Thread Part中包含一個(gè)UIProgressView和一個(gè)UIButton;而Test Part包含一個(gè)值和一個(gè)UISlider。如圖:

iPhone SDK 多線程使用方法以及注意事項(xiàng)

接下來(lái),在 TutorialProjectViewController.h 文件中創(chuàng)建各個(gè)UI控件的 IBOutlets.

  1. @interface TutorialProjectViewController : UIViewController {  
  2.     // ------ Tutorial code starts here ------  
  3.     // Thread part  
  4.     IBOutlet UILabel *threadValueLabel;  
  5.     IBOutlet UIProgressView *threadProgressView;  
  6.     IBOutlet UIButton *threadStartButton;  
  7.     // Test part  
  8.     IBOutlet UILabel *testValueLabel;  
  9.     // ------ Tutorial code ends here ------  

同時(shí),也需要?jiǎng)?chuàng)建outlets變量的property.

  1. @property (nonatomic, retain) IBOutlet UILabel *threadValueLabel;  
  2. @property (nonatomic, retain) IBOutlet UIProgressView *threadProgressView;  
  3. @property (nonatomic, retain) IBOutlet UIProgressView *threadStartButton;  
  4. @property (nonatomic, retain) IBOutlet UILabel *testValueLabel; 

接下來(lái)定義按鈕按下時(shí)的動(dòng)作函數(shù),以及slider的變化函數(shù)。

  1. - (IBAction) startThreadButtonPressed:(UIButton *)sender;  
  2. - (IBAction) testValueSliderChanged:(UISlider *)sender;  
  3. 然后在 TutorialProjectViewController.m 文件中synthesize outlets,并在文件為實(shí)現(xiàn)dealloc釋放資源。  
  4. @synthesize threadValueLabel, threadProgressView, testValueLabel, threadStartButton;  
  5. ...  
  6. - (void)dealloc {  
  7.     // ------ Tutorial code starts here ------  
  8.     [threadValueLabel release];  
  9.     [threadProgressView release];  
  10.     [threadStartButton release];  
  11.     [testValueLabel release];  
  12.     // ------ Tutorial code ends here ------  
  13.     [super dealloc];  

現(xiàn)在開(kāi)始線程部分的代碼,首先當(dāng) thread button 被按下的時(shí)候,創(chuàng)建新的線程.

  1. - (IBAction) startThreadButtonPressed:(UIButton *)sender {  
  2.     threadStartButton.hidden = YES;  
  3.     threadValueLabel.text = @"0";  
  4.     threadProgressView.progress = 0.0;  
  5.     [NSThread detachNewThreadSelector:@selector(startTheBackgroundJob) toTarget:self withObject:nil];  

該按鈕被按下后,隱藏按鈕以禁止多次創(chuàng)建線程。然后初始化顯示值和進(jìn)度條,最后創(chuàng)建新的線程,線程的函數(shù)為 startTheBackgroundJob。具體的 startTheBackgroundJob 函數(shù)定義如下.

  1. - (void)startTheBackgroundJob {  
  2.  
  3.     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  4.     // 線程開(kāi)始后先暫停3秒(這里只是演示暫停的方法,你不是必須這么做的)  
  5.     [NSThread sleepForTimeInterval:3];  
  6.     [self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];  
  7.     [pool release];  

在第1行,創(chuàng)建了一個(gè) NSAutoreleasePool 對(duì)象,用來(lái)管理線程中自動(dòng)釋放的對(duì)象資源。這里 NSAutoreleasePool 在線程退出的時(shí)候釋放。這符合 Cocoa GUI 應(yīng)用程序的一般規(guī)則。最后一行,阻塞調(diào)用(waitUntilDone狀態(tài)是ON)函數(shù) makeMyProgressBarMoving。

  1. - (void)makeMyProgressBarMoving {  
  2.  
  3.     float actual = [threadProgressView progress];  
  4.     threadValueLabel.text = [NSString stringWithFormat:@"%.2f", actual];  
  5.     if (actual < 1) {  
  6.         threadProgressView.progress = actual + 0.01;  
  7.         [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO];  
  8.     }  
  9.     else threadStartButton.hidden = NO;  

這里計(jì)算用于顯示的進(jìn)度條的值,利用 NSTimer ,每0.5秒自增0.01,當(dāng)值等于1的時(shí)候,進(jìn)度條為100%,退出函數(shù)并顯示剛才被隱藏的按鈕。

最后,添加 UISlider 的實(shí)現(xiàn)函數(shù),用來(lái)更改主線程中 Test Part 中的 label 值。

  1. - (IBAction) testValueSliderChanged:(UISlider *)sender {  
  2. testValueLabel.text = [NSString stringWithFormat:@"%.2f", sender.value];  

編譯執(zhí)行,按下線程開(kāi)始按鈕,你將看到進(jìn)度條的計(jì)算是在后臺(tái)運(yùn)行。如圖:

iPhone SDK 多線程使用方法以及注意事項(xiàng)

使用線程的注意事項(xiàng)

線程的堆棧大小

iPhone設(shè)備上的應(yīng)用程序開(kāi)發(fā)也是屬于嵌入式設(shè)備的開(kāi)發(fā),同樣需要注意嵌入式設(shè)備開(kāi)發(fā)時(shí)的幾點(diǎn)問(wèn)題,比如資源上限,處理器速度等。

iPhone 中的線程應(yīng)用并不是無(wú)節(jié)制的,官方給出的資料顯示iPhone OS下的主線程的堆棧大小是1M,第二個(gè)線程開(kāi)始都是512KB。并且該值不能通過(guò)編譯器開(kāi)關(guān)或線程API函數(shù)來(lái)更改。

你可以用下面的例子測(cè)試你的設(shè)備,這里使用POSIX Thread(pthread),設(shè)備環(huán)境是 iPhone 3GS(16GB)、SDK是3.1.3。 

  1. #include "pthread.h"  
  2.  
  3. void *threadFunc(void *arg) {  
  4.     void*  stack_base = pthread_get_stackaddr_np(pthread_self());  
  5.     size_t stack_size = pthread_get_stacksize_np(pthread_self());  
  6.     NSLog(@"Thread: base:%p / size:%u", stack_base, stack_size);  
  7.     return NULL;  
  8. }  
  9.  
  10. - (void)applicationDidFinishLaunching:(UIApplication *)application {  
  11.     void*  stack_base = pthread_get_stackaddr_np(pthread_self());  
  12.     size_t stack_size = pthread_get_stacksize_np(pthread_self());  
  13.     struct rlimit limit;  
  14.     getrlimit(RLIMIT_STACK, &limit);  
  15.     NSLog(@"Main thread: base:%p / size:%u", stack_base, stack_size);  
  16.     NSLog(@"  rlimit-> soft:%llu / hard:%llu", limit.rlim_cur, limit.rlim_max);  
  17.  
  18.     pthread_t thread;  
  19.     pthread_create(&thread, NULL, threadFunc, NULL);  
  20.  
  21.     // Override point for customization after app launch  
  22.     [window addSubview:viewController.view];  
  23.     [window makeKeyAndVisible];  

結(jié)果如下:

模擬器

  1. Main thread: base:0xc0000000 / size:524288  
  2. rlimit-> soft:8388608 / hard:67104768  
  3. Thread: base:0xb014b000 / size:524288 

設(shè)備

  1. Main thread: base:0x30000000 / size:524288  
  2. rlimit-> soft:1044480 / hard:1044480  
  3. Thread: base:0xf1000 / size:524288 

由此可見(jiàn),當(dāng)你測(cè)試多線程的程序時(shí),模擬器和實(shí)際設(shè)備的堆棧大小是不一樣的。如果有大量遞歸函數(shù)調(diào)用可要注意了。

Autorelease

如果你什么都不考慮,在線程函數(shù)內(nèi)調(diào)用 autorelease 、那么會(huì)出現(xiàn)下面的錯(cuò)誤:

  1. NSAutoReleaseNoPool(): Object 0x********* of class NSConreteData autoreleased with no pool in place …. 

一般,在線程中使用內(nèi)存的模式是,線程最初

  1. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 

而在線程結(jié)束的時(shí)候 [pool drain] 或 [pool release]。

子線程中描畫(huà)窗口

多線程編程中普遍遵循一個(gè)原則,就是一切與UI相關(guān)的操作都有主線程做,子線程只負(fù)責(zé)事務(wù),數(shù)據(jù)方面的處理。那么如果想在子線程中更新UI時(shí)怎么做呢?如果是在windows下,你會(huì) PostMessage 一個(gè)描畫(huà)更新的消息,在iPhone中,需要使用performSelectorOnMainThread 委托主線程處理。

比如,如果在子線程中想讓 UIImageView 的 image 更新,如果直接在線程中

  1. imageView.image = [UIImage imageNamed:@"Hoge.png"]; 

這么做,什么也不會(huì)出現(xiàn)的。需要將該處理委托給主線程來(lái)做,像下面:

  1. [delegate performSelectorOnMainThread:@selector(theProcess:) withObject:nil waitUntilDone:YES]; 

就OK了!

小結(jié):iPhone SDK多線程 使用方法以及注意事項(xiàng)的內(nèi)容介紹完了,希望本文對(duì)你有所幫助。

轉(zhuǎn)自 http://www.yifeiyang.net/iphone-developer-advanced-11-multiple-threads-of-use-and-precautions/

責(zé)任編輯:zhaolei 來(lái)源: CocoaChina
相關(guān)推薦

2011-08-01 12:53:25

iPhone 多線程 線程

2024-02-01 09:39:02

asyncawaitPromise

2011-06-14 15:25:28

C++多線程

2011-07-25 17:48:10

iPhone 內(nèi)存

2012-03-11 18:46:18

iPhone4S

2011-07-04 17:55:59

Qt SDK Windows

2025-04-03 07:33:56

2011-07-21 15:40:24

iPhone 內(nèi)存管理 對(duì)象

2010-08-12 09:39:26

FlexaddChil

2010-07-27 14:17:52

Flex SDK4

2009-06-12 09:46:40

Java String

2012-06-13 02:02:43

ServletJavaJSP

2014-05-16 10:04:19

JavaScriptthis原理

2017-04-06 09:49:55

Hive注意事項(xiàng)優(yōu)化

2010-11-26 16:27:01

MySQL使用變量

2011-07-06 11:13:29

iOS游戲開(kāi)發(fā)

2010-01-18 14:25:19

使用C++Builde

2011-07-19 10:16:58

噴墨打印機(jī)注意事項(xiàng)

2011-06-23 11:15:25

SEO網(wǎng)站優(yōu)化

2022-09-23 09:25:04

代碼方法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久人体av| 成人影院www在线观看| www.66久久| av午夜在线观看| 成人免费在线一区二区三区| 欧美激情资源网| 激情欧美一区二区三区黑长吊| 91综合免费在线| 一区二区成人在线视频 | 国产日韩欧美精品电影三级在线| 欧美亚洲爱爱另类综合| 91国产福利在线| 综合久久久久| 幼a在线观看| 91成人免费看| 91精品国产91热久久久做人人| 自拍亚洲一区| 欧美性猛交p30| 亚洲一区中文字幕在线观看| 精品久久久久久久久久久| 亚洲成人最新网站| av在线网址观看| 你真棒插曲来救救我在线观看| 亚洲视频综合网| 国产精品久久影院| 欧美福利专区| 欧美家庭影院| 午夜精品久久久内射近拍高清| 精品日韩在线观看| 99re这里都是精品| 中文在线免费一区三区| 日本电影一区二区在线观看| 青青草成人网| 视频一区国产| www.在线播放| 一本久道综合色婷婷五月| 一区二区欧美在线| 亚洲一区二区欧美日韩| 亚洲综合不卡| 99re6热只有精品免费观看| 国产精品毛片一区二区三区四区| 久久av中文字幕| 91成人国产精品| 久久婷婷综合激情| 欧美日韩一区二区国产| 日韩08精品| a黄色片在线观看| 精产国产伦理一二三区| 日韩在线国产| 成人黄色短视频在线观看| 欧美日韩一区二区三区在线免费观看 | 欧美激情自拍偷拍| av成人在线观看| 美女网站在线| 国产二区三区四区| 免费人成在线观看视频播放| 91久久极品少妇xxxxⅹ软件 | 中文子幕无线码一区tr| 国产成人日日夜夜| 久久亚洲综合| 在线日韩中文| 欧美ab在线视频| 蜜臀av免费一区二区三区| 亚洲精品视频在线免费| 四虎4hu新地址入口2023| www.av片| 国产91沈先生在线播放| 国产盗摄视频在线观看| 欧美一区国产一区| 国产成人精品福利一区二区三区| 国产91成人video| 精品国产一区二区三区久久影院 | 不卡的av一区| 97久草视频| 一区二区成人av| 亚洲欧美一区二区激情| 亚洲第一中文字幕| 这里只有精品99re| 亚洲男人天堂网站| 成人永久免费视频| 成人免费观看49www在线观看| 久草免费福利在线| 欧美高清视频一区二区| 欧美日韩在线免费视频| av在线不卡观看免费观看| 日韩激情视频网站| 男人天堂网视频| 五月天男人天堂| 欧美男女爱爱视频| 无码精品国产一区二区三区免费| 黄色国产精品视频| 亚洲国产成人精品无码区99| 欧美在线日韩精品| 一区二区三区在线视频看| 欧美gvvideo网站| 色哟哟精品丝袜一区二区| 国内在线免费视频| 中文字幕在线直播| 日韩在线精品强乱中文字幕| 国产一区二区电影在线观看| 午夜无码国产理论在线| 操喷在线视频| 精品一区二区三区亚洲| 狠狠做深爱婷婷综合一区| 欧美综合一区| 亚洲欧美成人综合| 国产精品综合一区二区| 玉米视频成人免费看| 亚洲码在线观看| 97色在线观看| 国产精品一区二区不卡视频| 国产精品视频午夜| 亚洲欧洲在线一区| av成人网在线| 久久91导航| 亚洲三级性片| 久久久久免费| 成人免费大片黄在线播放| 91av视频在线播放| 国产97在线观看| 五月婷婷综合色| 国产精品第157页| 91caoporm在线视频| 91av久久| 久久精品亚洲人成影院| 久久综合丝袜日本网| 亚洲女厕所小便bbb| 在线播放视频一区| 日韩精品在线免费播放| 成人激情免费在线| 黄色网在线视频| av小次郎在线| 亚洲香蕉网站| 成人一区在线观看| 欧美疯狂性受xxxxx喷水图片| 欧美亚洲另类制服自拍| 久久久久久久久久久久久久久久av| 精品国产电影| 看欧美ab黄色大片视频免费| 精品美女调教视频| 久久青青视频| 久久久久电影| 亚洲精品大片www| 欧美日本韩国一区| 91在线国产电影| 亚洲精品国产视频| 国内精品久久久久伊人av| av动漫在线观看| 国产精品一区二区三区av| 亚洲性视频h| 国产精品免费视频一区| 亚洲欧美国产制服动漫| 色一情一乱一伦一区二区三区丨| av资源种子在线观看| 亚洲香蕉网站| 色乱码一区二区三区88| 欧美专区中文字幕| free性亚洲| 91午夜精品| 国产日韩精品视频一区| 偷偷要91色婷婷| 亚洲毛片在线看| 蜜桃av色综合| 国产粉嫩一区二区三区在线观看| 精品国产免费人成网站| 人人精品人人爱| 色婷婷国产精品| 成人av片在线观看| 亚洲男人天堂古典| 久久久91精品国产一区二区三区| 亚洲成人av资源| 91免费电影网站| 成人高潮aa毛片免费| 久久99九九99精品| 欧美日韩在线视频一区| 51精品在线观看| 四虎最新地址发布| xvideos.蜜桃一区二区| 久久99精品久久久久久动态图 | 在线不卡日本v二区707| 国产精品一区二区在线观看网站| 日韩一区二区免费视频| 日韩av高清在线看片| 欧美午夜精品一区二区三区电影| 欧美日免费三级在线| 日本黄网免费一区二区精品| 亚洲天堂手机| 欧美韩日一区二区三区| 国内精品久久久久久久果冻传媒| 色女人在线视频| 97aⅴ精品视频一二三区| 国产深夜精品福利| 欧美精品一区三区在线观看| 成人在线免费观看av| 国产精品7m凸凹视频分类| 色一区av在线| www.av在线播放| 国产精品私人自拍| 精品视频一区二区三区四区| 极品美女一区|