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() { } ...
随机推荐
- velocity map list 数组操作
Velocity生成模板的时候,经常需要使用到map.list对象,然后遍历输出对象的属性值.当你需要遍历的时候记录遍历的步长的时候,可以使用$velocityCount内置变量进行输出.下面demo ...
- 高通msm8994手动提升性能脚本
点击打开链接 [plain] view plain copy stop thermald stop mpdecision stop thermal-engine # online A57 echo 1 ...
- C链栈实现
#include <stdlib.h> #include <stdio.h> #include"LinkStack.h" const int TRUE = ...
- 5.0、Android Studio调试你的应用
Android Studio包含了一个调试器,允许你调试运行在Android虚拟机或连接的Android设备的应用.通过Android Studio的调试器,你可以: 1. 选择你调试设备的app 2 ...
- 巨星陨落 - Jim Gary
偶然在微软Research中搜论文时搜到了神牛Jim Gary的paper,看着照片有点眼熟,貌似在买过的哪本书中见过.于是就饶有兴致地看着Jim的生平介绍,结果- "Dr. Gray j ...
- Android 自定义View-android学习之旅(十四)
自定义View的步骤 当andoid提供的系统组件不满足要求时候,完全可以集成View来派生自定义组件. 首定定义一个继承View的子类,然后重写他一个或几个方法. 重写的方法介绍 构造器:这是定制V ...
- C++对C的函数拓展 - 占位参数
函数占位参数 占位参数只有参数类型声明,而没有参数名声明 一般情况下,在函数体内部无法使用占位参数 demo #include <iostream> using namespace std ...
- iOS 图片裁剪与修改
最近做的项目中需要上传头像,发表内容的时候也要涉及到图片上传,我直接用的原图上传,但是由于公司网络差,原图太大,老是加载好久好久,所以需要把原图裁剪或者修改分辨率之后再上传,找了好久,做了很多尝试才解 ...
- Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)
ObjectInputStream和ObjectOutputStream的作用是对基本数据和对象进行序列化操作支持.创建文件输出流对应的ObjectOutputStream对象,该ObjectOutp ...
- 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)
===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...