在MAC OS X 开发中,如何让程序有多线程?方法1

来源:互联网 发布:淘宝宝贝图片尺寸 编辑:程序博客网 时间:2024/04/29 17:59

学习目的:NSThread的使用

功能:

1):主线程,不做任何事情,如果做事,就会先执行,然后其他事件排后执行,这样导致界面会等待主线程事件完成后,才做其他的响应事件。

(这不是我们的目的,我们的目的是:一边一个事件执行中,一边其他界面的控件能去做事,而不是界面卡住状态!)

2):辅助线程1:申明,然后初始化,然后start,三步完成,停止,可以直接设置一个中间变量来停止,然后cancel,和nil就可以了。

当然:在初始化的时候,要调用你写的函数。

H文件

<pre name="code" class="objc">#import <Cocoa/Cocoa.h>@interface EDUCATIONDocument : NSPersistentDocument{    NSThread *thread_second;}@property (assign) IBOutlet NSTextField *m_ET_input;@property (assign) IBOutlet NSTextField *m_LB_GetValue;@property (assign) IBOutlet NSTextField *m_LB_Thread1_Show;@end


M文件

////  EDUCATIONDocument.m//  Learn_NSThread////  Created by DMD on 31/7/14.//  Copyright (c) 2014 EDUCATION. All rights reserved.//#import "EDUCATIONDocument.h"static bool g_thread1_run_flag =false;static int g_count=0;@implementation EDUCATIONDocument@synthesize m_LB_Thread1_Show;@synthesize m_LB_GetValue;@synthesize m_ET_input;- (id)init{    self = [super init];    if (self) {        // Add your subclass-specific initialization here.    }    return self;}- (NSString *)windowNibName{    // Override returning the nib file name of the document    // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.    return @"EDUCATIONDocument";}- (void)windowControllerDidLoadNib:(NSWindowController *)aController{    [super windowControllerDidLoadNib:aController];    // Add any code here that needs to be executed once the windowController has loaded the document's window.}+ (BOOL)autosavesInPlace{      return YES;}- (IBAction)OnBT_Start_Thread1:(id)sender{    [self do_thread1];}- (IBAction)OnBT_Stop_Thread1:(id)sender{    g_thread1_run_flag = false;    [thread_second cancel];    thread_second = nil;}- (IBAction)OnBT_Now_Station:(id)sender{    m_LB_GetValue.stringValue = [NSString stringWithFormat:@"g_thread1_run_flag = %d,g_ount = %d",g_thread1_run_flag,g_count];}- (IBAction)OnBT_GetNumber:(id)sender{    m_LB_GetValue.stringValue = m_ET_input.stringValue;}// Show Top 1 ++-(void)closeModalWindow:(id)sender{    [[NSApplication sharedApplication] stopModal];}- (void)windowWillClose:(NSNotification *)notification{    [self performSelectorOnMainThread:@selector(closeModalWindow:) withObject:nil waitUntilDone:NO];}// Show Top 1 ---(void)do_thread1{    //主线程:不需要申明变量    [self performSelectorOnMainThread:@selector(thread_function_main) withObject:self waitUntilDone:YES];        //次线程,需要申明    thread_second = [[NSThread alloc] initWithTarget:self selector:@selector(thread_function_second) object:nil];        //次线程开始    g_thread1_run_flag = true;    [thread_second start];        //和次线程一起做的事情//    [NSThread detachNewThreadSelector:@selector(threadFunc3) toTarget:self withObject:nil];}-(void)thread_function_main{}-(void)thread_function_second{    if(false == g_thread1_run_flag)    {        return ;    }    int i=0;    int j=0;    int max =100;    for (i=1; i<max; i++)    {        for (j=1; j<max; j++)        {            g_count=i*j;            if (false == g_thread1_run_flag)            {                i=max;                break;            }            else            {                [NSThread sleepForTimeInterval:0.02f];// = sleep(20 ms)                self.m_LB_Thread1_Show.stringValue = [NSString stringWithFormat:@"%d x %d  = %d",i,j,g_count];            }        }    }    }//当关闭窗口的时候,执行的事件,属于协议函数 [也可以不用在H里面申明]- (BOOL)windowShouldClose:(id)window{    NSAlert* alert = [[NSAlert alloc] init];    [alert setAlertStyle:NSInformationalAlertStyle];    [alert setMessageText:@"Are you sure you want to quit?"];    [alert addButtonWithTitle:@"Yes"];    [alert addButtonWithTitle:@"No"];    NSInteger result = [alert runModal];    if (result == NSAlertFirstButtonReturn)    {        [self OnBT_Stop_Thread1:nil];        [alert release];        return YES;    }    [alert release];    return NO;}//当关闭窗口的时候 [也可以不用在H里面申明]- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication{    return YES;}@end


运行效果

测试OK!


0 0
原创粉丝点击