2010-04-15 37 views
0

我有這個代碼的問題。 正如你所看到的一個內部線程recv的啓動,以便程序在給定的時候被阻塞,但會繼續它的執行,讓任務鎖定線程。 我的程序會繼續收到recv數據套接字new_sd,所以我進入了一個無限循環(註釋代碼)。 問題是,通過在recv之前輸入while(1)我的程序塊,但沒有正確插入它會收到一個字符串,但在此之後停止。 有人可以幫助我讓我的recv始終等待信息? 在此先感謝您的幫助。而(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]; 

} 

回答

1

你不應該使用一段時間(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; 
} 
+0

你告訴我的代碼,一個小例子?感謝 – zp26 2010-04-15 16:02:41

+0

我的意思是我的代碼XP – zp26 2010-04-15 18:32:50

+0

好了,只保留部分的同時... – Macmade 2010-04-15 18:35:30

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]; 

這行可能seg錯誤,因爲datiRicevuti幾乎肯定不是一個以空字符結尾的字符序列。首先,在使用之前,您從未清零緩衝區。其次,如果recv有500個或更多字節可用,則允許recv完全填充它,因此沒有空間用於終止nul。

另外,你漏分配的字符串,除非labelRicevuti是一個普通的C結構,在這種情況下,你漏在先前迭代或一個在函數的頂部分配的字符串。

+0

好。不完美的情況都是如此,但我的問題是無盡的循環。感謝您的澄清。 – zp26 2010-04-16 16:38:16

+0

你原本寫的循環沒有終止。你已經成爲循環條件。此外,recv阻塞,直到有數據可用。它會掛在系統調用中,直到連接的另一端發送給你一些東西。 – JeremyP 2010-04-16 19:00:08