2009-10-12 38 views
14

Tôi có một sợi nhân viên mà tôi muốn làm một chút nhiệm vụ của mình, sau đó tạm dừng & chờ đợi cho "ok, tiếp tục" lệnh từ chủ đề khác, sau đó tạm dừng & chờ vvLàm thế nào để tạm dừng một NSThread cho đến khi được thông báo?

Các trường hợp sử dụng là: đối tượng điều khiển là một khung nhìn mà tôi muốn hiển thị thông tin về những gì đang xảy ra bên trong luồng công nhân, và cho phép tôi "một bước" thông qua người lao động vì nó làm điều đó.

Điều khá xấu xí và vụng về mà tôi có trong nhân của tôi là thế này:

NSLog(@"paused"); 
paused = YES; 

while (paused) 
{ 
    [NSThread sleepForTimeInterval:0.25]; 
} 
NSLog(@".. continuing"); 

... Nhưng tôi không thể không nghĩ rằng phải có một cách đẹp hơn, có lẽ liên quan đến NSLocks hoặc một số thứ như vậy.

Nhận xét, gợi ý gợi ý?

Cảm ơn!

Trả lời

25

Nhìn vào NSCondition và phần Conditions trong hướng dẫn Luồng. Mã sẽ trông giống như sau:

NSCondition* condition; // initialize and release this is your app requires. 

//Worker thread: 
while([NSThread currentThread] isCancelled] == NO) 
{ 
    [condition lock]; 
    while(partySuppliesAvailable == NO) 
    { 
     [condition wait]; 
    } 

    // party! 

    partySuppliesAvailable = NO; 
    [condition unlock]; 
} 

//Main thread: 
[condition lock]; 
// Get party supplies 
partySuppliesAvailable = YES; 
[condition signal]; 
[condition unlock]; 
+0

Chính xác những gì tôi cần. Cảm ơn. – Olie

+2

Cũng lưu ý, đối với những người say mê trong tương lai: 'NSConditionLock', nơi bạn làm điều gì đó như' [condition lockWhenCondition: suppliesAvailable]; mySupplies = [nội dung supplyQueue]; [supplyQueue removeAllSupplies]; [condition unlockWithCondition: noSuppliesAvailable]; // chi tiêu mySupplies như mong muốn' là một mẫu rất hữu ích. Trong trường hợp của tôi, thay vì đảngSupplies, tôi có nó như dữ liệu cần xử lý. QED. – Olie

+0

+1 để bắt đầu bữa tiệc. : D Sử dụng tuyệt vời của partySuppliesAvailable và // party! – Alexandru

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