PDA

View Full Version : NSThread blocks interaction




alvises
Jul 17, 2008, 06:37 PM
Well, about uiview update and nsthread: I want to do an example to show better the BIG problem:

I start a thread with

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

This "mainloop" method is like

-(void)mainloop:(id)object{
while(YES){
NSString *line = [stream readLine];
//console is UITextView object
console.text = line;
}
}

Well, when I start the thread the application continues to work. When i receive the first line (and then when the thread modify for the first time a object of the GUI) the USER interaction is BLOCKED. All the GUI (bottons, tables, not only "console textview") is refreshed ONLY every while loop and (when i receive another line) and then if I want to see the update i have to wait the next line........:mad:
Why ?
I'm getting crazy with this problem.:eek:
Thanks.

Alvise



alvises
Jul 18, 2008, 05:22 AM
Yea. I have founded a solution. Well , I try to explain with my bad english.

this is the pseudocode:

-(IBAction)methodInMainThread:(id)button{
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(separatedThread:) userInfo:nil repeats:YES];
}

-(void)separatedThread:(NSTimer*)timer{
NSString *line = [input readlineWithTimeout:0.01];
if(line == NULL)//timeout
return;

//process the string
}


In this case i write the code of a "readLineWithTimeout:" method. This method waits for a input for 0.01 seconds, after that returns and the gui will be updated.
The POSIX function to use to "select" the input and know if it goes in timeout is "select()" function -> "man select".

I don't know if is the best way to resolv the problem.... a thread looping every 10 millisecs is not the best way i think.... but it works!
Any comment ?

Thanks.

Alvise