objective-c - 结束在辅助线程中运行的while循环?

原文 标签 objective-c multithreading cocoa

我有一个应用程序,其中用户输入应用程序应该重复一次动作的次数。在一个while循环中获取并使用用户输入值,该循环重复用户指定的次数。这个过程可以很长,我希望有一个按钮,允许用户结束这个过程。我已经将重复进程移动到一个辅助线程(NSt线程),以便用户可以在进程运行时继续与用户界面交互。当用户按下“停止”按钮时,我很难停止重复过程。什么是允许我的主线程与次要线程通信的最好方法,它需要在其中运行一个while循环?任何帮助都将不胜感激。
谢谢,
山姆
这似乎对我不起作用…我用@属性(原子,保留)声明两个原子NSLATE。它们都被设置为整数值为0。这里是我的循环,它运行在次级线程中运行的方法中:

 int i = 0;

 while (i < timesToRun && [numberOne intValue] == 0) { 
 [self doSomething]; 
 numberOne = numberTwo;
 i++; 
 }'

我的停止按钮调用一个将numbertwo的整数值更改为“1”的方法。出于某种原因,这并没有停止循环。我做错什么了吗?
编辑:谢谢大家的帮助。经过一番反复试验,我终于找到了解决问题的办法。我只是简单地创建了一个.strings文件,除了文本“no”之外都是空的。加载应用程序时,我将文本设置为“否”。在新的while循环中,我使用nsstring stringwithcontentsoffile检查文件的值是否已更改。当我想结束循环时,我调用一个方法来写入文件并将值更改为“yes”。这是我的新循环:
NSString* path = [[NSBundle mainBundle] pathForResource:@"StopFile" ofType:@"strings"];

NSString *theString = [[NSString alloc] initWithContentsOfFile:path];
NSLog(@"TheString: %@", theString);

int i;

for (i = 0; i < timesToRunScript && theString == [NSString stringWithFormat:@"NO"]; i++) {
    [scriptToRun executeAndReturnError:nil];
   NSString *theString = [[NSString alloc] initWithContentsOfFile:path];
    NSLog(@"string: %@", theString);
    if (theString == [NSString stringWithFormat:@"Yes"]) {
        break;
    }

如果你看到有什么可以改进的,请告诉我。谢谢。

最佳答案

可以在执行while循环的对象上添加原子属性,并在循环的每次迭代中检查该属性。
使属性原子化将使它成为线程安全的,因此您可以在一个线程中更改它,并在另一个线程中读取它。

相关文章:

swift - 使用App部分捆绑领域

c - libevent 2.0.19-奇怪的evbuffer_copyout最终符号

ios - 在UILabel中更改表情符号的alpha

objective-c - 如何轮播三个广告网络-iAd和Admob和OAS标签?

ios - 如何检测用户何时在iOS中点击Shift键和Shift模式?

c# - Directory.CreateDirectory可以使文件夹可以从一个线程访问,但不能从其他线程访问吗?

objective-c - 核心数据:如何计算具有特定属性值的一对多关系中的实体?

objective-c - UIPopoverController顶部的按钮

.net - .NET ReaderWriterLockSlim问题

wcf - 为什么在单个WCF TCP通道(使用ConcurrencyMode.Reentrant)上无法按顺序处理我的消息?