功能:

实现多线程: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 rights reserved.
// /*
Test Thread
*/ #include <CoreFoundation/CoreFoundation.h> // Just for this c file.
static int g_vid=1; static void _perform(void *info __unused)
{
printf("No %d. hello,\n",g_vid);
g_vid++;
} static void _timer(CFRunLoopTimerRef timer __unused, void *info)
{
g_vid++; CFRunLoopSourceSignal(info);
} int main(int argc, const char * argv[])
{
// insert code here...
CFRunLoopSourceRef source;
CFRunLoopSourceContext source_context; // 第一个线程:运行自己定义的函数:_perform
bzero(&source_context, sizeof(source_context));
//调用要运行的函数
source_context.perform = _perform;
//声称循环源
source = CFRunLoopSourceCreate(NULL, 0, &source_context);
//将循环源添加到当前线程里面去
CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes); // 第二个线程:一个时间计数器
CFRunLoopTimerRef timer;
CFRunLoopTimerContext timer_context; bzero(&timer_context, sizeof(timer_context));
timer_context.info = source;
//生成时间循环源
timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 1, 0, 0,
_timer, &timer_context);
//添加时间循环器
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes); CFRunLoopRun();
return 0;
}

以上代码可读性不高,能够看以下的代码

//

//  main.c

//  test_runloop1

//

//  Created by DMD on 20/6/14.

//  Copyright (c) 2014 EDU. All rights reserved.

//

/*

Test Thread

*/

#include <CoreFoundation/CoreFoundation.h>

// Just for this c file.

staticint g_vid=1;

staticvoid _perform(void *info__unused)

{

printf("No %d. hello,\n",g_vid);

g_vid++;

}

staticvoid _timer(CFRunLoopTimerRef timer__unused,void
*info)

{

g_vid++;

CFRunLoopSourceSignal(info);

}

int main(int argc,constchar * argv[])

{

// insert code here...

CFRunLoopSourceRef source;

CFRunLoopSourceContext source_context;

//
第一个线程:运行自己定义的函数:_perform

bzero(&source_context,sizeof(source_context));

//调用要运行的函数

source_context.perform =_perform;

//声称循环源

source =CFRunLoopSourceCreate(NULL,0, &source_context);

//将循环源添加到当前线程里面去

CFRunLoopAddSource(CFRunLoopGetCurrent(), source,kCFRunLoopCommonModes);

//第二个线程:一个时间计数器

CFRunLoopTimerRef timer;

CFRunLoopTimerContext timer_context;

bzero(&timer_context,sizeof(timer_context));

timer_context.info = source;

//生成时间循环源

timer = CFRunLoopTimerCreate(NULL,CFAbsoluteTimeGetCurrent(),1,0,0,

_timer, &timer_context);

//添加时间循环器

CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer,kCFRunLoopCommonModes);

//假设不用,就会在运行中。能够做其它的事件。

//  CFRunLoopRun();

return0;

}

如图

測试成功。

參考:

http://blog.csdn.net/onlyou930/article/details/7423161

重要补充:

CFRunLoopRun();

以上函数,假设不用,就会在运行中。能够做其它的事件。假设用了这个函数。就会在xib界面中运行中将界面卡住。无法去做其它事情。

- (IBAction)OnBT_Stop:(id)sender

{

m_window_main.public_integer =
0;

}

会出现一个编译成功,可是执行不了,提示:请选择能够执行的框架,原因是:m_window_main 是本身的类,在本身里面不能前面增加自己。

另外,假设在一个m文件中面调用非类函数或者变量。比如在m里面写的C++函数。

须要额外申明这个类的变量指针。而且初始化函数里面 =self

比如在m文件头

static
EDUAppDelegate *m_window_main;

初始化函数里面须要

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

{

// Insert code here to initialize your application

m_window_main =
self;

}

这样才干够在其它非类函数里面调用类H定义的各种变量和函数。

调用函数的方法:

[m_window_main funct:var1];

也能够直接调用里面的变量Control

m_window_main.m_lable1=@"aaa";

[END]


MAC COCOA一个简单的多线程程序的更多相关文章

  1. 使用Go开发一个简单的服务器程序

    最近有个小项目,需要一个简单的后台程序来支撑,本来想用Nodejs来做,但是由于本人js一直很菜,并且很讨厌callback,虽然我也很喜欢异步模型,但我一直都觉得JS是反人类的.后台就用了go处理, ...

  2. 一个简单的多线程Python爬虫(一)

    一个简单的多线程Python爬虫 最近想要抓取拉勾网的数据,最开始是使用Scrapy的,但是遇到了下面两个问题: 前端页面是用JS模板引擎生成的 接口主要是用POST提交参数的 目前不会处理使用JS模 ...

  3. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...

  4. 编写一个简单的C++程序

    编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...

  5. 一个简单的flask程序

    初始化 所有Flask程序都必须创建一个程序实例. 程序实例是Flask类的对象,经常使用下述代码创建: from flask import Flask app = Flask(__name__) F ...

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

    实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP ...

  7. 输出多行字符的一个简单JAVA小程序

    public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...

  8. 如何创建一个简单的struts2程序

    如何创建一个简单的Struts2程序 “计应134(实验班) 凌豪” 1.创建一个新的Web项目test(File->new->Web Project) 2.Struts2框架的核心配置文 ...

  9. Linux系统学习笔记之 1 一个简单的shell程序

    不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步: ...

随机推荐

  1. Druid数据迁移小计

    Druid数据迁移小计 Druid 官方网站上讲了相关的 Dump Segment 和 Insert Segment 相关的功能,但是经过测试这些功能都不好用,报 Guice 的依赖错误,懒得找具体原 ...

  2. centos xampp 隐藏phpmyadmin地址

    /opt/lampp/etc/extra/httpd-xampp.conf Alias /phpmyadmin "/opt/xampp/phpMyAdmin/" 改为 Alias ...

  3. Codeforces 1099 A. Snowball-暴力(Codeforces Round #530 (Div. 2))

    A. Snowball time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  4. maven 打包可运行jar包(转)

    目录 1.前提 2.方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包 3.方法二:使用maven-assembly-plugin插件打包 4.方法三 ...

  5. 并发系列6-Java并发面试系列文章总结【石杉的架构笔记】

  6. Html导出Pdf

    最近领导给了一个新的需求:给了我一个html页面,让我导出Pdf页面 由于以前没有搞过这方面的需求,所以查百度找资料,找了一大堆的好东西,像ItextSharp和wkhtmltopdf 废话不说,进入 ...

  7. poj 1348 Period(KMP)

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. BZOJ 2212 [Poi2011]Tree Rotations(线段树合并)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2212 [题目大意] 给出一棵二叉树,每个叶节点上有一个权值,现在可以任意交换左右儿子, ...

  9. 【线段树区间合并】POJ3667-Hotel

    [题意] 一段区间初始均为可行.有两个操作: 1→找出长度为w的一段可行区间,如果存在则返回这个可行区间最靠左的情况,并将该区间设为不可行: 2→将区间[a,b]设为可行区间. [思路] 经典的线段树 ...

  10. Mac电脑,Andorid studio 配置 Flutter

    1,下载flutter cd ~/Library/ git clone -b dev https://github.com/flutter/flutter.git 2,环境配置: 这里配置用户级别环境 ...