/*
    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. Dynamics CRM2016 业务流程之Task Flow(一)

    Task Flow 属于CRM移动端的特性,如果在项目实施中用不到CRM自带的APP或者对自APP不感冒的,那就没有往下看的必要了,移步吧. 该功能默认是不开启的,需要我们去系统设置中开启它,打勾,选 ...

  2. C++对C语言的变量检测增强

    在C语言中,重复定义多个同名的全局变量是合法的 在C++中,不允许定义多个同名的全局变量 C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上 demo #include <st ...

  3. 1068. Find More Coins (30)

    题目如下: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...

  4. 发运模块中如何创建Debug 文件

     版本11.5.9到12.x A. 针对发运事务处理或者快速发运产生Debug文件 注意:如果通过发运事务处理执行发放,请参考B部分,下面这部分销售订单发放是格外的设置和日志文件. 1.   每一 ...

  5. Java-IO之PrintStream(打印输出流)

    PrintStream是打印输出流,继承于FilterOutputStream,PrintStream是用来装饰其他输出流,为其他输出流添加功能,方便他们打印出各种数据值表示形式.与其他输出流不同,P ...

  6. 【设计模式】java设计模式总述及观察者模式

    今天在准备腾讯的面试时想起来要复习一下设计模式,而刚好前几天在参加网易的在线考试的时候,也出了一道关于设计模式的选择题,主要是考察观察者模式,虽然那道题自己做对了,但觉得还是应该好好总结一下设计模式的 ...

  7. 12.1、Libgdx的图像之持续性和非持续性渲染

    (官网:www.libgdx.cn) Libgdx在默认情况下,渲染现成调用render()方法进行持续性渲染.频率取决于你的硬件设备. 有时候有些游戏中并不需要持续性的渲染,为了省电,可以关掉持续性 ...

  8. C++ Primer 有感(标准库vector及迭代器)

    vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...

  9. C语言assert的用法

    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int ...

  10. HDTV(1920x1080)码率和视频质量关系的研究 2 (实验结果)

    上一篇文章中介绍了实验的准备工作, HDTV(1920x1080)码率和视频质量关系的研究 1 (前期准备) 本文介绍一下实验的结果. 首先来看一下主观评价的试验结果: 从实验结果来看,可以得出以下结 ...