objective-c中线程编程一例
/*
print with threads :
print every file's first n char contents under the path that pass to this program,
format like : pwt [-h n] /some/path
*/
#import <Foundation/Foundation.h>
#define DEFAULT_N_SIZE 32
//#define MIN(x,y) (x<=y?x:y)
@class Main;
@interface OperationReadFile:NSOperation{
NSString *path;
}
@property(copy) NSString *path;
-(id)initWithPath:(NSString*)path;
@end
@interface Main:NSObject{
NSString *path;
NSOperationQueue *queue;
}
@property (copy) NSString *path;
+(id)shared;
-(void)start;
-(id)initWithPath:(NSString *)path;
-(void)print:(NSString *)str;
@end
@implementation OperationReadFile
@synthesize path;
-(id)initWithPath:(NSString*)path_v{
self = [super init];
if(self){
self.path = path_v;
}
return self;
}
NSString *head_n(NSString *str,NSUInteger n){
return [str substringToIndex:MIN(n,[str length])];
}
-(void)main{
//NSLog(@"path is %@",path);
NSString *content = [NSString stringWithContentsOfFile:path
encoding:NSASCIIStringEncoding error:NULL];
content = head_n(content,DEFAULT_N_SIZE);
NSLog(@"content:%@",content);
[[Main shared] performSelectorOnMainThread:@selector(print:)
withObject:content waitUntilDone:NO];
}
@end
@implementation Main{
NSMutableArray *files;
}
static Main *shared;
@synthesize path;
+(id)shared{
if(!shared){
NSLog(@"ERR:shared is not inited!");
}
return shared;
}
-(void)start{
for(NSString *file in files){
OperationReadFile *orf = [[OperationReadFile alloc] initWithPath:file];
[queue addOperation:orf];
}
}
-(void)print:(NSString *)str{
NSLog(@"file contents : %@",str);
}
-(id)initWithPath:(NSString *)path_v{
if(shared) return shared;
self = [super init];
if(self){
self.path = [path_v stringByExpandingTildeInPath];
NSLog(@"full path is %@",path);
NSFileManager *fm = [NSFileManager defaultManager];
files = [NSMutableArray array];
NSDirectoryEnumerator *enum_dir = [fm enumeratorAtPath:path];
NSString *file;
BOOL flag = false;
while(file = [enum_dir nextObject]){
//NSLog(@"file is %@",file);
[fm fileExistsAtPath:[path stringByAppendingPathComponent:file] isDirectory:&flag];
if(flag)
[enum_dir skipDescendents];
else
[files addObject:[path stringByAppendingPathComponent:file]];
}
NSLog(@"files is : %@",files);
queue = [[NSOperationQueue alloc] init];
shared = self;
}
return self;
}
-(id)init{
return [self initWithPath:@"."];
}
@end
int main(void){
@autoreleasepool{
NSProcessInfo *pi = [NSProcessInfo processInfo];
NSArray *args = [pi arguments];
NSLog(@"args : %@",args);
//NSString *path = @".";
Main *main = [[Main alloc] init];
//NSLog(@"%@",[@"~/src" stringByAppendingPathComponent:@"asm_src"]);
//Main *main = [[Main alloc]initWithPath:@"~/src/asm_src/nasm_src/linux"];
[main start];
//NSString *content = [[NSString alloc] initWithContentsOfFile:@"./9.m"
//encoding:NSUTF8StringEncoding error:NULL];
//NSLog(@"%@",[NSString stringWithContentsOfFile:@"./9.m"
//encoding:NSASCIIStringEncoding error:NULL]);
//NSLog(@"%@",content);
NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop run];
}
return 0;
}
objective-c中线程编程一例的更多相关文章
- muduo网络库源码学习————线程本地单例类封装
muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...
- 【并发编程】线程池是否需要手动关闭吗?以Hutool中的线程池为例
Hutool工具包中使用线程池的API是: ThreadUtil.execute() /** * 直接在公共线程池中执行线程 * * @param runnable 可运行对象 */ public s ...
- Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞
Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...
- Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别
Task C# 多线程和异步模型 TPL模型 Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...
- OC中两种单例实现方式
OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...
- Java中线程的yield(),sleep()以及wait()的区别
从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不 ...
- JavaSE中线程与并行API框架学习笔记1——线程是什么?
前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...
- JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?
前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...
- java双重检测或枚举类实现线程安全单例(懒汉模式)
双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...
随机推荐
- Solr 5.5.0 + tomcat 7.0.69 + zookeeper-3.4.6 Cloud部署
Solr介绍:Solr是一个独立的企业级搜索应用服务器,Solr基于Lucene的全文搜索服务器,同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了 ...
- 带你深入理解STL之迭代器和Traits技法
在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...
- android连接打印机
android连接 网络打印,主要使用socket连接设备,发送指令给设备. 首先要有设备的IP,端口号一般默认的是9100 //打印设备网络IP etIp.setText("192.16 ...
- 12 PopupWindow
PopupWindow创建方式 PopupWindow pop = new PopupWindow() PopupWindow pop = new PopupWindow(上下文, 填充宽, 填充高) ...
- IDEA阅读Spark源码
将spark编译成idea-sbt工程 tar -zxvf spark-1.1.0.tgz cd spark-1.1.0 sbt/sbt gen-idea 等待-- 成功后就能以SBT工程的形式导入i ...
- Linux系统调用的实现机制分析
API/POSIX/C库的关系 系统调用的实现 3.1 系统调用处理程序 添加新系统调用 给Linux添加一个新的系统调用是件相对容易的工作.怎样设计和实现一个系统调用是难题所在, ...
- UNIX环境高级编程——线程私有数据
线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制. 在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变 ...
- JavaScript 关键字
JavaScript 关键字 和其他任何编程语言一样,JavaScript 保留了一些关键字为自己所用. JavaScript 同样保留了一些关键字,这些关键字在当前的语言版本中并没有使用,但在以后 ...
- XML解析之SAX解析过程代码详解
上一篇谢了解析原理和过程,这里应用代码直观认识这个原理: 新建Demo1类: import java.io.File; import javax.xml.parsers.SAXParser; impo ...
- 小强的HTML5移动开发之路(19)——HTML5 Local Storage(本地存储)
来自:http://blog.csdn.net/dawanganban/article/details/18218701 一.浏览器存储的发展历程 本地存储解决方案很多,比如Flash SharedO ...