2009-03-13 27 views
6

Tôi đang làm việc trên một ứng dụng nhỏ được viết bằng mục tiêu-c với sự trợ giúp của khung cacao và tôi đang gặp vấn đề đa luồng. Tôi sẽ thực sự đánh giá cao nếu ai đó có thể giúp tôi với một số hướng dẫn về cách chấm dứt một chủ đề thứ cấp (công nhân) từ chủ đề chính?chấm dứt chuỗi thứ cấp từ chủ đề chính (ca cao)

- (IBAction)startWorking:(id)sender { 
    [NSThread detachNewThreadSelector:@selector(threadMain:) toTarget:self withObject:nil]; 
} 

- (void)threadMain 
{ 
    // do a lot of boring, time consuming I/O here.. 
} 

- (IBAction)stop:(id)sender { 
    // what now? 
} 

Tôi đã tìm thấy một cái gì đó trên apple's docs nhưng những gì là mất tích từ ví dụ này là phần mà nguồn runloop đầu vào thay đổi giá trị exitNow.

Ngoài ra, tôi sẽ không sử dụng nhiều chủ đề trong ứng dụng vì vậy tôi thích giải pháp đơn giản hơn (ít chi phí) hơn là một giải pháp phức tạp hơn. ví dụ. sử dụng ổ khóa có thể (?) thay vì runloops)

Cảm ơn trước

Trả lời

12

tôi nghĩ rằng cách dễ nhất là sử dụng NSThread của -(void)cancel method. Bạn cũng sẽ cần tham chiếu đến chuỗi bạn đã tạo. Mã ví dụ của bạn sẽ trông giống như thế này, nếu bạn có thể thực hiện chuỗi công nhân như một vòng lặp:

- (IBAction)startWorking:(id)sender { 
    myThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadMain:) object:nil]; 
    [myThread start]; 
} 

- (void)threadMain 
{ 
    while(1) 
    { 
     // do IO here 
     if([[NSThread currentThread] isCancelled]) 
      break; 
    } 
} 

- (IBAction)stop:(id)sender { 
    [myThread cancel]; 
    [myThread release]; 
    myThread = nil; 
} 

Tất nhiên, điều này sẽ chỉ hủy chuỗi giữa lặp vòng lặp. Vì vậy, nếu bạn đang thực hiện một số tính toán chặn dài, bạn sẽ phải tìm cách phá vỡ nó thành từng phần để bạn có thể kiểm tra định kỳ theo định kỳ.

+0

Nó hoạt động tuyệt vời! Cảm ơn bạn! Tôi có một vòng lặp trong chuỗi, vì vậy giải pháp của bạn vừa vặn như một chiếc găng tay mà không có bất kỳ ngắt mã bổ sung nào :) – andi

+0

Bạn có thể làm cho ý định của vòng lặp whileMain rõ hơn bằng cách thực hiện trong khi (! [[NSThread currentThread] isCancelled]) trong khi (1) và đặt kiểm tra isCancelled sâu trong mã vòng lặp. –

+0

@Barry Wark Điểm tốt. Tôi đoán tôi đã mong đợi có một điều kiện khác (ví dụ: thực hiện) trong vòng lặp đó. –

2

Ngoài ra, hãy xem các lớp NSOperation và NSOperationQueue. Đó là một tập hợp các lớp luồng khác mà làm cho việc phát triển một mô hình luồng công nhân rất dễ thực hiện.

Các vấn đề liên quan