/*
    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中线程编程一例的更多相关文章

  1. muduo网络库源码学习————线程本地单例类封装

    muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...

  2. 【并发编程】线程池是否需要手动关闭吗?以Hutool中的线程池为例

    Hutool工具包中使用线程池的API是: ThreadUtil.execute() /** * 直接在公共线程池中执行线程 * * @param runnable 可运行对象 */ public s ...

  3. Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞

    Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...

  4. 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 ...

  5. OC中两种单例实现方式

    OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...

  6. Java中线程的yield(),sleep()以及wait()的区别

    从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不 ...

  7. JavaSE中线程与并行API框架学习笔记1——线程是什么?

    前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...

  8. JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

    前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...

  9. java双重检测或枚举类实现线程安全单例(懒汉模式)

    双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...

随机推荐

  1. velocity map list 数组操作

    Velocity生成模板的时候,经常需要使用到map.list对象,然后遍历输出对象的属性值.当你需要遍历的时候记录遍历的步长的时候,可以使用$velocityCount内置变量进行输出.下面demo ...

  2. 高通msm8994手动提升性能脚本

    点击打开链接 [plain] view plain copy stop thermald stop mpdecision stop thermal-engine # online A57 echo 1 ...

  3. C链栈实现

    #include <stdlib.h> #include <stdio.h> #include"LinkStack.h" const int TRUE = ...

  4. 5.0、Android Studio调试你的应用

    Android Studio包含了一个调试器,允许你调试运行在Android虚拟机或连接的Android设备的应用.通过Android Studio的调试器,你可以: 1. 选择你调试设备的app 2 ...

  5. 巨星陨落 - Jim Gary

    偶然在微软Research中搜论文时搜到了神牛Jim Gary的paper,看着照片有点眼熟,貌似在买过的哪本书中见过.于是就饶有兴致地看着Jim的生平介绍,结果-  "Dr. Gray j ...

  6. Android 自定义View-android学习之旅(十四)

    自定义View的步骤 当andoid提供的系统组件不满足要求时候,完全可以集成View来派生自定义组件. 首定定义一个继承View的子类,然后重写他一个或几个方法. 重写的方法介绍 构造器:这是定制V ...

  7. C++对C的函数拓展 - 占位参数

    函数占位参数 占位参数只有参数类型声明,而没有参数名声明 一般情况下,在函数体内部无法使用占位参数 demo #include <iostream> using namespace std ...

  8. iOS 图片裁剪与修改

    最近做的项目中需要上传头像,发表内容的时候也要涉及到图片上传,我直接用的原图上传,但是由于公司网络差,原图太大,老是加载好久好久,所以需要把原图裁剪或者修改分辨率之后再上传,找了好久,做了很多尝试才解 ...

  9. Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)

    ObjectInputStream和ObjectOutputStream的作用是对基本数据和对象进行序列化操作支持.创建文件输出流对应的ObjectOutputStream对象,该ObjectOutp ...

  10. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...