2010-04-04 62 views
1

我有一个threadMethod,它每隔0.5秒在控制台robotMotorsStatus中显示。但是,当我尝试更改robotMotorsStatuschangeRobotStatus方法时,我收到一个异常。我需要把锁放在那个程序中。可可多线程,锁不起作用

#import "AppController.h" 

@implementation AppController 
extern char *robotMotorsStatus; 

- (IBAction)runThread:(id)sender 
{ 
[self performSelectorInBackground:@selector(threadMethod) withObject:nil]; 
} 

- (void)threadMethod 
{ 
char string_to_send[]="QFF001100\r"; //String prepared to the port sending (first inintialization) 
string_to_send[7] = robotMotorsStatus[0]; 
string_to_send[8] = robotMotorsStatus[1]; 
while(1){ 
    [theLock lock]; 
    usleep(500000); 
    NSLog (@"Robot status %s", robotMotorsStatus); 
    [theLock unlock]; 
} 

} 

- (IBAction)changeRobotStatus:(id)sender 
{ 
robotMotorsStatus[0]='1'; 
} 
+2

只要确定:您是否在某处定义了robotMotorsStatus?你有什么异常? – Yuji 2010-04-04 22:44:12

+0

您是否阅读过文档? http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1 – 2010-04-04 22:53:23

+0

什么样的对象是“theLock” ; NSLock? – 2010-04-04 23:21:41

回答

0
extern char *robotMotorsStatus; 

您还没有在任何代码,您已经证明,设置这个指针指向任何地方。 (您是否使用了一些机器人包,将初始化这个变量为你的SDK?如果是这样,您可以显示配置设置,告诉它这是初始化变量?)

string_to_send[7] = robotMotorsStatus[0]; 
string_to_send[8] = robotMotorsStatus[1]; 

如果robotMotorsStatus尚未由SDK或代码未显示进行初始化,则这些内存将以随机地址访问。如果这使你崩溃,这并不会让我感到惊讶,如果这是你提到的但没有提到的“例外”。

robotMotorsStatus[0]='1'; 
这里

同潜在的问题。

NSLog (@"Robot status %s", robotMotorsStatus); 

这假定robotMotorsStatus包含至少一个字符,并且所述最后一个是一个零字节(空字符)-i.e。,即robotMotorsStatus指向C字符串。正如我已经注意到的,你没有显示robotMotorsStatus指向任何东西明确的,即使它指向某处,你也没有显示该内存的内容是C字符串。

如果数组的实际范围内没有空字符,则数组不包含C字符串,并试图读取整个C字符串,因为将该数组传递给格式化程序%s会在经过数组末尾后导致崩溃。如果其他两个访问robotMotorsStatus不是你的崩溃,这可能是。

这里的解决方案不仅仅是让指针变量指向某个地方,而是让一个有效的C字符串(包括空字符)完全位于该空间内。

顺便提一下,这些问题与线程无关。