而(1)阻止我的recv线程

时间:2010-04-15 15:12:29

标签: iphone objective-c multithreading recv

我的代码有问题。 正如您可以看到使用内部线程recv启动,以便程序在给定的情况下被阻止,但将继续执行,让任务锁定线程。 我的程序将继续接收recv数据套接字new_sd,因此我进入了一个无限循环(注释代码)。 问题是通过在recv之前输入while(1)我的程序块,但是没有正确插入它会收到一个字符串,但是在那之后停止。 有人可以帮我让我的recv总是在等待信息吗? 在此先感谢您的帮助。

- (IBAction为)聊天{

      [NSThread detachNewThreadSelector:@selector(riceviDatiServer) toTarget:self withObject:nil];  

}

- (无效)riceviDatiServer {

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

 labelRicevuti.text = [[NSString alloc] initWithFormat:@"In attesa di ricevere i dati"];

 char datiRicevuti[500];
 int ricevuti;

    //while(1){
 ricevuti = recv(new_sd, &datiRicevuti, 500, 0);

 labelRicevuti.text = [[NSString alloc] initWithFormat:@"%s", datiRicevuti];
    //}

 [pool release];

}

2 个答案:

答案 0 :(得分:1)

你不应该使用while(1)循环,因为它会阻止你的线程接收信息 你应该看一下NSRunLoop类。

[编辑]
根据要求,这是一个使用运行循环的基本Obj-C程序的示例。 :)

#import <Cocoa/Cocoa.h>

BOOL loopShoudRun = YES;

int main( void )
{
    NSAutoreleasePool * pool;
    NSRunLoop         * loop;

    pool = [ [ NSAutoreleasePool alloc ] init ];
    loop = [ NSRunLoop currentRunLoop ];

    while( loopShoudRun == YES && [ loop runMode: NSDefaultRunLoopMode beforeDate: [ NSDate distantFuture ] ] );

    [ pool release ]
    return 0;
}

答案 1 :(得分:0)

labelRicevuti.text = [[NSString alloc] initWithFormat:@"In attesa di ricevere i dati"];

除非labelRicevuti是普通的C结构,否则此行会泄漏您分配的字符串。

char datiRicevuti[500];
int ricevuti;

//while(1){
ricevuti = recv(new_sd, &datiRicevuti, 500, 0);

你永远不会检查ricevuti,看看它是否为-1。

labelRicevuti.text = [[NSString alloc] initWithFormat:@"%s", datiRicevuti];

这一行可能会出现故障,因为datiRicevuti几乎肯定不是一个空终止的字符序列。首先,在使用之前,您永远不会将缓冲区归零。其次,如果有500个或更多可用字节,则允许recv完全填充它,因此没有空间用于终止nul。

此外,您泄漏已分配的字符串,除非labelRicevuti是普通的C结构,在这种情况下,您会泄漏在上一次迭代中分配的字符串或函数顶部的字符串。