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;
}
时间: 2024-09-17 04:56:19

objective-c中线程编程一例的相关文章

Python中线程编程之threading模块的使用详解

  这篇文章主要介绍了Python中线程编程之threading模块的使用详解,由于GIL的存在,线程一直是Python编程中的焦点问题,需要的朋友可以参考下 threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入.下面分别举例说明.先来看看通过继承th

service-Service中线程的唯一实例

问题描述 Service中线程的唯一实例 我在service中初始化一个新的Thread.但是当我重启service时,新的被创建了,同时系统也崩溃了,因为我使用了照相机功能.如何让线程中只有一个实例呢?当关闭在线程中创建的service时.线程也同时被关闭吗? 解决方案 你应该使用一个lock或者一个静态变量: private static boolean isThreadRunning; 在你的service里写入以下方法: if(isThreadRunning) return;Thread

iOS中线程Call Stack的捕获和解析(一)

http://blog.csdn.net/jasonblog/article/details/49909209这里对上个月做的一个技术项目做部分技术小结,这篇文章描述的功能和我们在使用Xcode进行调试时点击暂停的效果类似. 一.获取任意一个线程的Call Stack 如果要获取当前线程的调用栈,可以直接使用现有API:[NSThread callStackSymbols]. 但是并没有相关API支持获取任意线程的调用栈,所以只能自己编码实现. 1. 基础结构 一个线程的调用栈是什么样的呢? 我

Java中线程用法总结_java

本文实例总结了Java中线程用法.分享给大家供大家参考.具体分析如下: 1.线程是基本调度单元.共享进程的资源,如内存和文件句柄.但有自己的pc(程序计数器),stack(线程栈)及本地变量 2.线程的优势: a) 充分利用多处理器 b) 可以简化模型.特定任务给特定线程.如servlets及rmi等框架. c) 对异步事件的简单处理.如socket,nio使用更复杂.而现在的操作系统支持更大数量的线程. d) 界面的更佳响应 3.内部锁:synchronized块.互斥.可重入(reentra

以实例简介Java中线程池的工作特点_java

什么原因使我们不得不使用线程池? 个人认为主要原因是:短时间内需要处理的任务数量很多 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存 以下是Java自带的几种线程池: 1.newFixedThreadPool  创建一个指定工作线程数量的线程池. 每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中. 2.newCachedThreadPool 创建

深入解析C++编程中线程池的使用_C 语言

为什么需要线程池目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传 统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务.任务执行完毕后,线程退出,这就是是"即时创建,即 时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于 不停的创建线程,销

Linux中线程和进程的区别

Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格.内存空间.磁盘空间.I/O设备等,然后该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其他相关资源,该进程就被运行起来. 线程是进程的一个实体,是CPU调度和分配的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器.一组寄存器和栈),但

link中混编数组,如何指定不同的混填比率,并且产生的数据要充分的随机?

问题描述 link中混编数组,如何指定不同的混填比率,并且产生的数据要充分的随机? link中混编数组,如何指定不同的混填比率,并且产生的数据要充分的随机? 解决方案 可以产生一个0~1的浮点数,并且根据你要的比率,比如说0.3/0.7,那么如果它小于0.3,就从第一个取,如果这个随机数大于0.3,就从第二个取 解决方案二: 充分随机,就是在一般随机的基础上增加算法,是其均匀分布.

C#中正则表达式应用一例

//蛙蛙推荐:C#中正则表达式应用一例//我上次的那个问题用C#来解决了,贴一下先//首先把本文所有代码复制保存为arr_reg.cs//然后把下面的代码用CSC编译成控制台程序后就可以看到结果了,编译命令如下://csc /t:exe arr_reg.csusing System;using System.Text.RegularExpressions;public class RegexTest{ public static void wawa_reg(){ string[] arr=new