while (1) заблокировать мою ветку recv - PullRequest
0 голосов
/ 15 апреля 2010

У меня проблема с этим кодом. Как вы можете видеть запуск с внутренним потоком recv, так что программа блокируется в ожидании заданного, но продолжит свое выполнение, оставляя задачу для блокировки потока. Моя программа продолжала бы получать сокет данных recv new_sd, и поэтому я вошел в бесконечный цикл (закомментированный код). Проблема в том, что при вводе while (1) мой программный блок перед recv, но не вставляя его правильно, получает строку, но после этого останавливается. Кто-нибудь может помочь мне сделать мой 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 ]

1 голос
/ 15 апреля 2010

Вы не должны использовать цикл 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;
}
0 голосов
/ 16 апреля 2010
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 почти наверняка не является последовательностью символов с нулевым символом в конце. Во-первых, вы никогда не обнуляете буфер перед его использованием. Во-вторых, вы позволяете recv заполнять его полностью, если в нем доступно 500 или более байтов, так что нет места для завершающего nul.

Кроме того, вы пропускаете выделенную строку, если только labelRicevuti не является обычной структурой C, в этом случае вы пропускаете строку, выделенную в предыдущей итерации, или строку в верхней части функции.

...