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

标签 objective-c multithreading cocoa

我有一个应用程序,用户在其中输入应用程序应重复某个操作的次数。用户输入的值被获取并用于 while 循环,该循环重复用户指定的操作次数。这个过程可能会很长,我希望有一个按钮可以让用户结束这个过程。我已将重复进程移至辅助线程 (NSThread),以便用户可以在进程运行时继续与用户界面交互。当用户按下“停止”按钮时,我无法停止重复过程。允许我的主线程与它需要停止在其中运行的 while 循环的辅助线程通信的最佳方法是什么?任何帮助将不胜感激。

谢谢,

山姆

这似乎对我不起作用......我使用@property(原子,保留)声明了两个原子NSNumbers。它们都设置为整数值 0。这是我在辅助线程中运行的方法中运行的循环:

 int i = 0;

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

我的停止按钮调用一个方法,将 numberTwo 的整数值更改为“1”。出于某种原因,这并没有停止循环。我做错了什么吗?

编辑:谢谢大家的帮助。经过反复试验,我终于找到了解决问题的办法。我只是创建了一个 .strings 文件,该文件除了文本“NO”外都是空的。我在加载应用程序时将文本设置为“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 循环的对象上添加一个原子属性,并在循环的每次迭代中检查该属性。

使属性成为原子属性将使其成为线程安全的,这样您就可以在一个线程中更改它,并在另一个线程中读取它。

关于objective-c - 结束在辅助线程中运行的 while 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7127111/

相关文章:

java - 在java中的一个可运行线程中调用不同的方法

cocoa - 如何在 Cocoa 应用程序中读取来电显示信息?

ios - UICollectionView - 将 Storyboard 项目移植到无 IB 项目

ios - 如何在 iOS 上监听 View 的框架属性

c# - 如何告诉调试器不要停止一些关键线程?

cocoa - 如何从 NSScriptCommand 子类的 PerformDefaultImplementation 返回对象列表?

objective-c - 使用绑定(bind)将图像插入 NSTableView

ios - 原因: 'An NSManagedObject of class ' NSManagedObject' must have a valid NSEntityDescription?

objective-c - 为什么 DTrace 有时但不总是给我无效地址错误?

c++ - Linux Ubuntu 14.04, boost 库和线程编译