2010-04-15 1 views
0

У меня проблема с этим кодом. Как вы можете видеть запуск с внутренним обратным потоком, чтобы программа была заблокирована в ожидании заданного, но продолжит выполнение, оставив задачу заблокировать поток. Моя программа будет продолжать получать recv-порт данных new_sd, поэтому я ввел бесконечный цикл (прокомментированный код). Проблема заключается в том, что, введя while (1) мой программный блок перед recv, но не вставляя его правильно, получает строку, но после этого останавливается. Кто-то может помочь мне сделать мой recv всегда ожидающим информации? Заранее благодарим за помощь.while (1) заблокировать мою обратную связь

- (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.

[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; 
} 
+0

Вы покажите мне небольшой пример кода? THANKS – zp26

+0

Я предназначался для моего кода XP – zp26

+0

Ну, просто сохраните часть времени ... – Macmade

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.

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

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

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

+0

ok. несовершенства - все верно, но моя проблема - бесконечный цикл. Спасибо за разъяснения. – zp26

+0

Ваша петля, как изначально написано, не заканчивалась. У вас было истинное состояние цикла. Кроме того, recv блокирует, пока не будут доступны данные. Он будет висеть в этом syscall, пока другой конец соединения не отправит вам что-то. – JeremyP