в то время как (1) заблокировать мой поток recv

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

}

person zp26    schedule 15.04.2010    source источник


Ответы (2)


Вы не должны использовать цикл while( 1 ), так как он помешает вашему потоку получать информацию.
Вам следует взглянуть на NSRunLoop.

[EDIT]
В соответствии с запросом, вот пример базовой программы 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;
}
person Macmade    schedule 15.04.2010
comment
Извините, но это не решение моей проблемы. Спасибо, в любом случае - person zp26; 16.04.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);

Вы никогда не проверяете ричевути, чтобы увидеть, равно ли здесь -1.

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

Эта строка, вероятно, содержит ошибки seg, потому что datiRicevuti почти наверняка не является последовательностью символов, заканчивающейся нулем. Во-первых, вы никогда не обнуляли буфер перед его использованием. Во-вторых, вы позволяете recv полностью заполнить его, если в нем доступно 500 или более байтов, так что места для завершающего nul нет.

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

person JeremyP    schedule 15.04.2010
comment
Ok. все несовершенства верны, но моя проблема в бесконечном цикле. Благодарю за разъяснение. - person zp26; 16.04.2010
comment
Ваш цикл, как было написано изначально, не завершился. У вас было true как условие цикла. Кроме того, recv блокируется до тех пор, пока не будут доступны данные. Он будет зависать в этом системном вызове, пока другой конец соединения не отправит вам что-нибудь. - person JeremyP; 16.04.2010