作者atst (电脑无法阻止人类做蠢事)
看板MacDev
标题Re: [问题] 请问Cocoa程式要如何一直做同件事情?
时间Mon May 5 20:07:23 2008
※ 引述《Dannier (猫尾巴~)》之铭言:
: 我想要程式按一个butten可以开始持续做某件事 按另一个butten可以结束这件事
: 可是我发现按了第一个butten之後我就不能按第二个了
: 我大概知道是因为我的程式架构有问题 可是我实在是想不出为什麽
看来你没有把多绪程式的概念弄清楚,也不了解一般GUI程式的做法。
基本的程式都是循序执行:
main() //程式开始
{
指令1;
指令2;
...
指令n;
return result; //程式结束,回传执行结果
}
这种基本的循序程式,都是执行一次就直接结束。
但比较实际的程式,通常都要与使用者互动,若是执行一次就结束,就无法
与使用者互动,做不同的反应。
所以会有像下面这样的程式:
main()
{
while(1)
{
使用者输入;
switch(输入值)
{
case A: //如果使用者输入A
doA();
case B:
doB();
...//中略
}
}
}
而到了多工的程式中,如GUI程式,除了要与使用者互动外,还必需把执行的时间分配给
不同的执行绪,以便做画面的更新,或是档案存取,IO等动作。
这时程式的架构会像下面:
main()
{
while(1) //假设跑一次回圈要10s
{
updateDisplay(); //画面更新 -- 1s
getUIAction(); //撷取使用者输入或其他事件 -- 1s
dispatchTask(); //根据所撷取到的事件,分配工作 -- 1s
... // 其他各类工作 -- 总共7s
}
}
而NSRunLoop所做的就是将上一段的while(1)包成一个class供我们使用.
现在回到你的程式
: ----------------------------------------------------------------------
: /* periodicTest.m*/
: #import "periodicTest.h"
: @implementation periodicTest
: - (void)doloop:(BOOL)R{
: double resolution = 1.0;
: while (R)
: {
: NSDate* next = [NSDate dateWithTimeIntervalSinceNow:resolution];
: [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:next];
: printf("Do Loop...\n");
: }
: }
: @end
这段程式有好几个问题:
1. NSRunLoop在这里根本看不出有任何的功用.
一般NSRunLoop的用法,都是
用在另一个thread,或是当我有一个新的持续性的工作时,
我们会去向NSRunLoop注册,告诉他,我们有一个新的工作,请NSRunloop帮我们安排时
间去执行(NSTimer就是一例).
但是在这里,你既没有产生另一个thread,也没有安排工作给NSRunLoop,你只是告诉
Current Loop,执行一次就停下来,而你的current loop看来就是main loop. 如果不是
加了外面的while(R),恐怕整个程式就挂掉了.
2. 你的程式没有停止的条件。
你想的是call doloop(YES) 就开始跑,call doloop(NO)就停,但是,
- (void)doloop:(BOOL)R这个函式中, 「R」是一个区域变数,不是全域变数。
这意思是,你在呼叫doloop(YES)的时候的「R」与doloop(NO)的时候的「R」不是
同一个.
3. 因为你没有生成一个新的Thread,所以你的程式真正跑起来的样子类似:
main loop
{
updateDisplay();
... 中略
if actionA()
{
doLoop(YES); //在这里会陷入回圈.
}
...其他工作
if actionB()
{
doLoop(NO); //应该永远到不了这里.
}
}
所以,如果你要解决目前的困境, 请再看看下面的文章:
1.
http://0rz.tw/fe41v Threading Programming Guide
2.
http://0rz.tw/c240q Timers
3.
http://0rz.tw/b23Zk Run Loop
详细的做法,请自己再想想.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.84.219.98
※ 编辑: atst 来自: 219.84.219.98 (05/05 20:18)
1F:推 andrew43:好文! 05/05 21:03
2F:推 Dannier:不好意思没有很了解GUI 说明的真清楚 谢谢 05/05 23:34