0

このコードに問題があります。ご覧のとおり、内部スレッド recv を使用した起動により、プログラムは特定の保留中ブロックされますが、実行は継続され、タスクはスレッドをロックしたままになります。私のプログラムは引き続き recv データ ソケット new_sd を受信するため、無限ループ (コメント化されたコード) に入りました。問題は、recv の前に while (1) my program block を入力すると、正しく挿入されずに文字列が受信され、その後停止することです。私の recv が常に情報を待つようにするのを手伝ってくれる人はいますか? よろしくお願いします。

-(IBAction)チャット{

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

}

-(void)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];

}
4

2 に答える 2

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;
}
于 2010-04-15T15:17:57.453 に答える
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);

ここで -1 かどうかを確認するために ricevti をチェックすることはありません。

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

ほとんどの場合、datiRicevuti は NULL で終了する文字シーケンスではないため、この行はおそらくセグ フォールトです。まず、バッファを使用する前にバッファをゼロに設定しませんでした。次に、recv が 500 バイト以上使用可能な場合に完全に埋めることができるようにするため、終端の nul のためのスペースがありません。

また、labelRicevuti が通常の C 構造体でない限り、割り当てられた文字列をリークします。その場合、前の反復で割り当てられた文字列または関数の先頭にある文字列がリークします。

于 2010-04-15T21:21:42.850 に答える