如何停止当前正在执行的线程

时间:2011-11-21 13:22:30

标签: iphone ios4 nsthread

情景就是这样 -

在我的应用程序中有一个滚动视图,其中包含许多

实例

MyCustomImageDownloaderController(包含下载后要分配图像的imageViews)。

根据我们的要求,当我们移动到页面时,必须下载图像。

滚动视图+(MyCustomImageDownloaderController1,MyCustomImageDownloaderController2,MyCustomImageDownloaderController3 ....等)

让我说我正在滚动它,
我到达第1页 - >它的图像应该开始下载
我到达第2页 - >它的图像应该开始下载......等等

如果我在第3页,如果没有下载,则会显示之前页面的图片,他们应该停止下载。

所以我尝试使用线程.. 在API ..

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender{

    Step 1) calculated currentPageNumber

    Step 2) started thread for downloading image with url for this currentPage
    //startBackGroundThreadForPlaceImage:(NSURL *) url

    Step 3)stopped thread for previous page , if that is still running

   }

现在我的MyCustomImageDownloaderController为

-(void) startBackGroundThreadForPlaceImage:(NSURL *) url{

if(isImageDownloaded == NO){

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    //[self performSelectorInBackground:@selector(loadImageInBackground:)       withObject:imageUrl];
    myThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImageInBackground:) object:imageUrl]; 
    //[NSThread detachNewThreadSelector:@selector(loadImageInBackground:) toTarget:self withObject:imageUrl];
    [myThread start]; 
    NSLog(@"The current thread is %@ ", [[NSThread currentThread] name]);
    [pool release]; 
}

}

NOW Here选择器执行加载图像和分配到图像视图的工作

现在停止线程

-(void) stopBackgroundThread{
[myThread cancel];

//[[NSThread currentThread] cancel];

//if([[NSThread currentThread] isCancelled]) {
    //[NSThread exit];
//}
    [NSThread exit];

}

-(BOOL) isThreadRunning{
return [myThread isExecuting];

}

所以我尝试了很多东西,但无法阻止它们之间的线程..

基本上一次使用三种方法中的任何一种实例化线程

1)在BackGround中执行选择器

2)NSThread分离新主题

3)NSThread alloc..init with ..

在前2个方法中如何获取新创建的线程的实例,以便我可以弯腰,

作为NSThread currentThread doest not not that

方法3中的

myThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImageInBackground:) object:imageUrl]; 

当我尝试

[myThread cancel];

它没有取消那个帖子,

当我尝试

[NSThread exit];

它挂在当前屏幕上,,,,我猜它已经停止了主线程

请帮帮我

先谢谢* 强文 *

1 个答案:

答案 0 :(得分:3)

通常最好要求线程停止,而不是强制它,这应该被视为最后的手段。因此,您应经常检查“停止标志”,并在设置此项时终止当前线程(在这种情况下,只需退出方法)。你只需要在线程运行的类上提供一个属性,这样调用者就可以让线程停止。

在C ++或Java中没有什么不同。