社区
iOS
帖子详情
多线程下载的问题```
ocwind
2010-08-05 11:09:54
各位大虾好,我想做一个多线程下载的程序,用三个线程下载一个文件!关于线程这方面有点理不清头绪,哪位大虾能给点指导啊?最好有例子,谢了````
...全文
204
8
打赏
收藏
多线程下载的问题```
各位大虾好,我想做一个多线程下载的程序,用三个线程下载一个文件!关于线程这方面有点理不清头绪,哪位大虾能给点指导啊?最好有例子,谢了````
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pure_coder
2010-10-17
打赏
举报
回复
这里有个跨平台的下载库,支持HTTP,FTP,HTTPS,多线程下载,还能在手机上跑,你可以参考下
http://www.easygeteasy.com
xuanliao
2010-08-10
打赏
举报
回复
你们蛋疼啊!
ocwind
2010-08-06
打赏
举报
回复
[Quote=引用 4 楼 programmerno1 的回复:]
下载的文件多大??
[/Quote]
随便多大```
ProgrammerNO1
2010-08-06
打赏
举报
回复
下载的文件多大??
乖乖nn小妮子
2010-08-06
打赏
举报
回复
你们不在公司里问,还发帖呢,哈哈,搞笑呢
陌尘笑
2010-08-05
打赏
举报
回复
好像太乱了 我上不了 附件 才来这里不知道怎么上
陌尘笑
2010-08-05
打赏
举报
回复
iphone 多线程 Thread (iphone开发入门 1) 收藏
以下是开发初期收集整理的一点资料,简单实用,希望对新人有帮助,都是网络上收集的,原始出处以不明,若侵犯您的权益,请告知,本人将及时删除相关内容。
多线程之NSInvocationOperation 多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始的多线程方法存在很多的毛病,包括线程锁死等。在Cocoa中,Apple提供了NSOperation这个类,提供了一个优秀的多线程编程方法。 本次介绍NSOperation的子集,简易方法的NSInvocationOperation: @implementation MyCustomClass - (void)launchTaskWithData:(id)data { //创建一个NSInvocationOperation对象,并初始化到方法 //在这里,selector参数后的值是你想在另外一个线程中运行的方法(函数,Method) //在这里,object后的值是想传递给前面方法的数据 NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod:) object:data]; // 下面将我们建立的操作“Operation”加入到本地程序的共享队列中(加入后方法就会立刻被执行) // 更多的时候是由我们自己建立“操作”队列 [[MyAppDelegate sharedOperationQueue] addOperation:theOp]; } // 这个是真正运行在另外一个线程的“方法” - (void)myTaskMethod:(id)data { // Perform the task. } @end一个NSOperationQueue 操作队列,就相当于一个线程管理器,而非一个线程。因为你可以设置这个线程管理器内可以并行运行的的线程数量等等。下面是建立并初始化一个操作队列:
@interface MyViewController : UIViewController { NSOperationQueue *operationQueue; //在头文件中声明该队列 } @end @implementation MyViewController - (id)init { self = [super init]; if (self) { operationQueue = [[NSOperationQueue alloc] init]; //初始化操作队列 [operationQueue setMaxConcurrentOperationCount:1]; //在这里限定了该队列只同时运行一个线程 //这个队列已经可以使用了 } return self; } - (void)dealloc { [operationQueue release]; //正如Alan经常说的,我们是程序的好公民,需要释放内存! [super dealloc]; } @end简单介绍之后,其实可以发现这种方法是非常简单的。很多的时候我们使用多线程仅仅是为了防止主线程堵塞,而NSInvocationOperation就是最简单的多线程编程,在iPhone编程中是经常被用到的。
/////////////////////////////////////////////////////////////////////////////////////////////////// 1 在主线程里加入一个loading画面…… 2 { 3 [window addSubview:view_loading]; 4 [NSThread detachNewThreadSelector:@selector(init_backup:) toTarget:self withObject:nil]; 5 } 可以通过performSelectorOhMainThread更新UI元素,比如设置进度条等等。最后消除loading画面,载入主View。 7 - (void)init_backup:(id)sender 8 { 9 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 10 11 // ... 12 int i = status; 13 [self performSelectorOnMainThread:@selector(show_loading:) withObject:[NSNumber numberWithInt:i] waitUntil Done:NO]; 14 15 [view_loading removeFromSuperview]; 16 [window addSubview:tabcontroller_main.view]; 17 [pool release]; 18 }
///////////////////////////////////////////////////////
利用iphone的多线程实现和线程同步 从接口的定义中可以知道,NSThread和大多数iphone的接口对象一样,有两种方式可以初始化:
一种使用initWithTarget :(id)target selector:(SEL)selector object:(id)argument,但需要负责在对象的retain count为0时调用对象的release方法清理对象。
另一种则使用所谓的convenient method,这个方便接口就是detachNewThreadSelector,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。
#import <UIKit/UIKit.h> @interface SellTicketsAppDelegate : NSObject <UIApplicationDelegate> { int tickets; int count; NSThread* ticketsThreadone; NSThread* ticketsThreadtwo; NSCondition* ticketsCondition; UIWindow *window; }
@property (nonatomic, retain) IBOutlet UIWindow *window; @end
然后在实现中添加如下代码: // SellTicketsAppDelegate.m // SellTickets // // Created by sun dfsun2009 on 09-11-10. // Copyright __MyCompanyName__ 2009. All rights reserved. // #import "SellTicketsAppDelegate.h" @implementation SellTicketsAppDelegate @synthesize window; - (void)applicationDidFinishLaunching:(UIApplication *)application { tickets = 100; count = 0; // 锁对象 ticketCondition = [[NSCondition alloc] init]; ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [ticketsThreadone setName:@"Thread-1"]; [ticketsThreadone start]; ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [ticketsThreadtwo setName:@"Thread-2"]; [ticketsThreadtwo start]; //[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; // Override point for customization after application launch [window makeKeyAndVisible]; } - (void)run{ while (TRUE) { // 上锁 [ticketsCondition lock]; if(tickets > 0) { [NSThread sleepForTimeInterval:0.5]; count = 100 - tickets; NSLog(@"当前票数是:%d,售出:%d,线程名:%@",tickets,count,[[NSThread currentThread] name]); tickets--; }else { break; } [ticketsCondition unlock]; } } - (void)dealloc { [ticketsThreadone release]; [ticketsThreadtwo release]; [ticketsCondition release]; [window release]; [super dealloc]; } @end
------------------------------------------------------------------------------------- // 定义 #import <UIKit/UIKit.h>
@interface ThreadSyncSampleViewController : UIViewController { int _threadCount; NSCondition *_myCondition; }
@end
//实现文件如下:
#import "ThreadSyncSampleViewController.h"
@implementation ThreadSyncSampleViewController
/* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { // Custom initialization } return self; } */
/* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; // //_myCondition = nil; // _myCondition = [[NSCondition alloc] init]; // NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(threadTester) userInfo:nil repeats:YES]; [timer fire]; }
- (void)threadTester{ [_myCondition lock]; _threadCount = -2; //如果有n个要等待的thread,这里置成 -n [_myCondition unlock]; // NSLog(@""); NSLog(@"------------------------------------------------------------------------------"); [NSThread detachNewThreadSelector:@selector(threadOne) toTarget:self withObject:nil]; [NSThread detachNewThreadSelector:@selector(threadTwo) toTarget:self withObject:nil]; [NSThread detachNewThreadSelector:@selector(threadThree) toTarget:self withObject:nil]; return; }
- (void)threadOne{ NSLog(@"@@@ In thread 111111 start."); [_myCondition lock]; int n = rand()%5 + 1; NSLog(@"@@@ Thread 111111 Will sleep %d seconds ,now _threadCount is : %d",n,_threadCount); sleep(n); //[NSThread sleepForTimeInterval:n]; _threadCount ++ ; NSLog(@"@@@ Thread 111111 has sleep %d seconds ,now _threadCount is : %d",n,_threadCount); [_myCondition signal]; NSLog(@"@@@ Thread 1111111 has signaled ,now _threadCount is : %d",_threadCount); [_myCondition unlock]; NSLog(@"@@@ In thread one complete."); [NSThread exit]; return; }
- (void)threadTwo{ NSLog(@"### In thread 2222222 start."); [_myCondition lock]; int n = rand()%5 + 1; NSLog(@"### Thread 2222222 Will sleep %d seconds ,now _threadCount is : %d",n,_threadCount); sleep(n); // [NSThread sleepForTimeInterval:n]; _threadCount ++ ; NSLog(@"### Thread 2222222 has sleep %d seconds ,now _threadCount is : %d",n,_threadCount); [_myCondition signal]; NSLog(@"### Thread 2222222 has signaled ,now _threadCount is : %d",_threadCount); [_myCondition unlock]; //_threadCount ++ ; NSLog(@"### In thread 2222222 complete."); [NSThread exit]; return; }
- (void)threadThree{ NSLog(@"<<< In thread 333333 start."); [_myCondition lock]; while (_threadCount < 0) { [_myCondition wait]; } NSLog(@"<<< In thread 333333 ,_threadCount now is %d ,will start work.",_threadCount); [_myCondition unlock]; NSLog(@"<<< In thread 333333 complete."); [NSThread exit]; return; }
/* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } */
- (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. }
- (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; }
- (void)dealloc { [_myCondition release]; [super dealloc]; }
@end
楼主自己看看吧 我之前学习用过这个
Android
多线程
文件夹
下载
及断点续传
Android实现网络
多线程
下载
,断点续传,压缩包内有两个项目: downloadDemo:
多线程
下载
MulThreadDownloader:断点续传(网上别人的项目)
下载
多线程
编程技术开发资料 高清完整PDF版
多线程
编程技术开发资料.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权
问题
,请联系删除!
JAVA
多线程
精讲下
本课程是《零基础学Java》系列课程中的"
多线程
"相关课程.授课形式延续了之前课程的授课风格。内容细腻、详尽,由浅入深!通过本门课程的学习你可以深刻理解Java
多线程
的原理及实现运行机制,深刻学习
多线程
的生命...
Android
多线程
断点续传
下载
+在线播放音乐
Android
多线程
断点续传
下载
+在线播放音乐,我想很多小白都想要。
多线程
下载
多线程
下载
使用
多线程
下载
文件可以很快地完成文件的
下载
,比如迅雷就是采用了
多线程
的方式来实现快速
下载
的。之所以采用
多线程
的形式会加快
下载
速度,是因为客户端启动多个线程进行
下载
时服务器就会为该客户端提供...
iOS
29,027
社区成员
12,466
社区内容
发帖
与我相关
我的任务
iOS
主要讨论与iOS相关的软件和技术
复制链接
扫一扫
分享
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章