MAC COCOA一个简单的多线程程序[2]

MAC COCOA一个简单的多线程程序[2]

使用RUNLOOP计数,实现一个时间计数器和事件at the same time 运行。

STEP 1

H

CODE:

//
//  EDUAppDelegate.h
//  test_runloop_multithread
//
//  Created by DMD on 23/6/14.
//  Copyright (c) 2014 EDU. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface EDUAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;

@property (assign) IBOutlet NSTextField *m_Label_TotalCount;
@property (assign) IBOutlet NSTextField *m_Label_EveryStartCount;

@property (assign) IBOutlet NSTextField *m_Edit_SetCurrentNumber;

@property (assign) IBOutlet NSTextField *m_Label_EveryStartCount_Set;

@property (assign) IBOutlet NSTextField *m_Label_Restart;

@property  CFRunLoopSourceRef m_source1;
@property  CFRunLoopSourceContext m_source1_context;
@property  CFRunLoopTimerRef m_timer1;
@property  CFRunLoopTimerContext m_timer1_context;

@property NSString *m_total_str;
@property int m_total_count;

-(void)Show_Msg;

-(void) set_label_value:(int)value;

@end

M

CODE:

//
//  EDUAppDelegate.m
//  test_runloop_multithread
//
//  Created by DMD on 23/6/14.
//  Copyright (c) 2014 EDU. All rights reserved.
//

/****************************************
 Function : 1个线程来计数,另一个线程来接受用户输入的字符串,互相之间不干扰
 目的:测试多线程程序工作,了解原理
 *****************************************/

#import "EDUAppDelegate.h"

//Define Public Variable +++++
static int g_total_count=0;
static EDUAppDelegate *m_window_main;
//---------------------------

@implementation EDUAppDelegate

//define var +++
@synthesize m_Edit_SetCurrentNumber;
@synthesize m_Label_EveryStartCount;
@synthesize m_Label_EveryStartCount_Set;
@synthesize m_Label_TotalCount;
@synthesize m_Label_Restart;

@synthesize m_source1;
@synthesize m_source1_context;
@synthesize m_timer1;
@synthesize m_timer1_context;
@synthesize m_total_count;
@synthesize m_total_str;

//---------------
- (void)dealloc
{
    [super dealloc];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    m_window_main = self;
    m_total_count=0;
    [email protected]"";
}

-(void) set_label_value:(int)value
{
    NSString *myname;
    myname = [NSString stringWithFormat:@"Every Start Count:%d",value];

    m_total_str = [m_total_str stringByAppendingString:myname];
    m_total_str = [m_total_str stringByAppendingString:@"\n"];

    m_Label_EveryStartCount.stringValue = m_total_str;

    if((m_total_count>0 )&&(m_total_count % 5 ==0))
    {
        [email protected]"";
        m_Label_Restart.stringValue = @"Re-Start 0";
        m_total_count =0;
        [self Show_Msg];
    }

}
//+++++[一个多线程里面调用的函数,C++方式的函数,而不是Object-C方式]
// Call Function (2 Method)++
// Do thing 1
void my_do1(void *info __unused)
{
    m_window_main.m_total_count++;
    printf("Every Start Count: [%d] \n",m_window_main.m_total_count );
    [m_window_main set_label_value:m_window_main.m_total_count];

    g_total_count++;
    printf("Total Count is :\"%d\" \n",g_total_count );
    m_window_main.m_Label_TotalCount.stringValue =[NSString stringWithFormat:@"Number is [%d]",g_total_count];
}
// Timer Function 1
void timer_function1(CFRunLoopTimerRef timer __unused, void *info)
{
    CFRunLoopSourceSignal(info);
}
// Call Function (2 Method)--
// START
- (IBAction)OnBT_Start:(id)sender
{
    // 每一次Start时,一些变量需要Clear
    // 句柄:m_window_main 是本类的指针,必须初始化,一般为[ClassName1 alloc]init
    // 这里使用的是本身类,就直接 =self就可以了。
    m_window_main.m_total_count =0;

    m_Label_Restart.stringValue = @"Start!";
    [email protected]"";

    // 第一个线程:执行的事件 [begin] ++++++++
    //STEP 1 : [线程内容]初始化CFRunLoopSourceContext的空间
    bzero(&m_source1_context, sizeof(m_source1_context));
    //STEP 2 : [线程内容]调用要执行的函数
    m_source1_context.perform = my_do1;

    //STEP 3 : [线程源]初始化CFRunLoopSourceRef
    m_source1 = CFRunLoopSourceCreate(NULL, 0, &m_source1_context);
    //STEP 4 : 将线程源加到当前线程里面去
    CFRunLoopAddSource(CFRunLoopGetCurrent(), m_source1, kCFRunLoopCommonModes);
    //STEP 5 : 执行完,将线程源释放
    CFRelease(m_source1);

   // 第一个线程:执行的事件 [end] ++++++++

    // 第二个线程:一个时间计数器,用来启动上面的事件线程 [begin]+++++++++
    // STEP 1 初始化时间线程内容空间
    bzero(&m_timer1_context, sizeof(m_timer1_context));
    // STEP 2 [非常关键] 时间计数器的内容源头是上面的事件源头
    m_timer1_context.info = m_source1;

    // STEP 3 生成时间线程源头句柄
    m_timer1 = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 1, 0, 0,
                                     timer_function1, &m_timer1_context);

    // STEP 4 将时间源加入到时间计数列表里面
    CFRunLoopAddTimer(CFRunLoopGetCurrent(), m_timer1, kCFRunLoopCommonModes);
    CFRelease(m_timer1);
    //第二个线程:一个时间计数器,用来启动上面的事件线程 [end]--------

    //如果不用,就会在执行中,可以做其他的事件。但是在DOS环境状态,必须有这一行,在编译时才能看到。
    // CFRunLoopRun();
}

// STOP
- (IBAction)OnBT_Stop:(id)sender
{
    CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_source1, kCFRunLoopCommonModes);
    CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), m_timer1, kCFRunLoopCommonModes);
    m_Label_Restart.stringValue = @"Stop!";
}

- (IBAction)OnBT_SetEveryStartCountNo:(id)sender
{
    m_Label_EveryStartCount_Set.stringValue = m_Edit_SetCurrentNumber.stringValue;
    g_total_count = [m_Label_EveryStartCount_Set.stringValue intValue];
}

- (IBAction)OnBT_CallSelfFunction:(id)sender
{
    [self OnBT_SetEveryStartCountNo:self];
}

// Show a MessageBox
-(void)Show_Msg
{
    NSAlert *alert = [[[NSAlert alloc] init]autorelease];
    [alert setMessageText:@"Label captio is :"];
    [alert setInformativeText:@"Close"];
    [alert setAlertStyle:NSWarningAlertStyle];
    [alert runModal];
}

@end

运行效果图:

成功!

需要补充:在定义自身类的时候,一定要初始化 =self,这样才可以使用本身类里面的成员函数或者变量

完成!

MAC COCOA一个简单的多线程程序[2]

时间: 2025-01-04 17:13:32

MAC COCOA一个简单的多线程程序[2]的相关文章

MAC COCOA一个简单的多线程程序

功能: 实现多线程:2个线程同时工作,一个用时间计数器,一个用来打印信息 STEP1 XCODE ->New Application ->Cocoa中的Command Line 自动增加: #include <CoreFoundation/CoreFoundation.h> STEP2 // // main.c // test_runloop1 // // Created by DMD on 20/6/14. // Copyright (c) 2014 EDU. All right

如何利用CEF3创建一个简单的应用程序 (Windows Platform)

1. 说明 这篇文章主要讲述如何利用CEF3来创建一个简单的应用程序,引用的是1535及以上版本中包含的 Cefsimple 项目例子.如果想知道关于CEF3更多的使用方法,可以去访问 GeneralUsage. 2. 开始 首先,根据自身所使用的开发平台,可以去 这里 下载对应的发布版本.针对这个教程,我们需要下载1750或者更新的版本.当前支持的平台有Windows, Linux和Mac OS X.每一个版本都包含了当在特定平台上编译特定版本CEF3时所需要的所有文件和资源.您可以通过包含在

如何利用CEF3创建一个简单的应用程序

说明: 这篇文章主要讲述如何利用CEF3来创建一个简单的应用程序,它参考了1535及以上版本中包含的 Cefsimple 项目例子.如果想知道关于CEF3更多的使用方法,可以去访问 GeneralUsage. 开始: 首先,根据自身所使用的开发平台,可以去这里下载对应的发布版本.针对这个教程,我们需要下载1750或者更新的版本.当前支持的平台有Windows, Linux和Mac OS X.每一个版本都包含了当在特定平台上编译特定版本CEF3时所需要的所有文件和资源.您可以通过包含在里边的 RE

一个简单的多线程爬虫

   本文介绍一个简单的多线程并发爬虫,这里说的简单是指爬取的数据规模不大,单机运行,并且不使用数据库,但保证多线程下的数据的一致性,并且能让爬得正起劲的爬虫停下来,而且能保存爬取状态以备下次继续. 爬虫实现的步骤基本如下: 分析网页结构,选取自己感兴趣的部分; 建立两个Buffer,一个用于保存已经访问的URL,一个用户保存带访问的URL; 从待访问的Buffer中取出一个URL来爬取,保存这个URL中感兴趣的信息:并将这个URL加入已经访问的Buffer中,然后将这个URL中的所有外链URL

大数据之网络爬虫-一个简单的多线程爬虫

   本文介绍一个简单的多线程并发爬虫,这里说的简单是指爬取的数据规模不大,单机运行,并且不使用数据库,但保证多线程下的数据的一致性,并且能让爬得正起劲的爬虫停下来,而且能保存爬取状态以备下次继续. 爬虫实现的步骤基本如下: 分析网页结构,选取自己感兴趣的部分; 建立两个Buffer,一个用于保存已经访问的URL,一个用户保存带访问的URL; 从待访问的Buffer中取出一个URL来爬取,保存这个URL中感兴趣的信息:并将这个URL加入已经访问的Buffer中,然后将这个URL中的所有外链URL

利用JSP编程技术实现一个简单的购物车程序

实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP中数据库编程方法: 二.实验要求 : 利用JSP编程技术实现一个简单的购物车程序,具体要求如下. (1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息. (2)编写一个JSP程序来处理用户提交的登录信息,如果用户名为本小组成员的名字且密码为对应的学号时,采用J

一个简单的Qt程序分析

本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton *button = new QPushButton("Quit"); QObject::connect(button, SIGNA

通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1 1)实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用 gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与

一个简单的Java程序

一个.NET技术还是很菜的水平的猿人现在要去学习Java不知道是坏是好,无从得知啊! 不过在网上看了好多Java方面的简单例子,感觉Java还是蛮不错的么!不管以后怎么样啦,先开始自己的Java菜鸟之旅吧! 建立一个Java项目,建立一个属于自己的包,然后就开始自己的Java之旅... 创建的时候勾上这个生成main方法的选项,这个好像类似与我们.Net程序里控制台程序有木有.... 创建完成后就是这么一个样子,可以看到我们的包,还有给我们创建好自己的类,并且带了一个静态的main方法咋看就像.