Tôi từng nghĩ tôi là một người thông minh hợp lý.
"hướng dẫn lập trình luồng" của Apple, đã phá vỡ bản ngã của tôi để duy trì sự lừa dối bản thân.Vòng lặp Objective-C để dừng và khởi động lại phương thức?
Tôi có một phương pháp tôi muốn chạy liên tục trên chuỗi phụ, trong ví dụ bên dưới, tôi đã gọi đây là doStuff:
Tôi muốn có thể dừng liên tục và bắt đầu gọi lặp lại phương thức này.
mã bắt đầu chuỗi.
nếu giá trị stuffToDo boolean là đúng,
sau đó nó gọi doStuff:
khác
nó có một chút nghỉ ngơi.
sau đó nó lặp lại cho đến khi tôi yêu cầu dừng lại
Mã hiện tại của tôi dường như lãng phí, vì nó luôn kiểm tra 'stuffToDo' ngay cả khi không có gì để làm.
Tôi có thể loại bỏ stuffToDo và chỉ sinh đẻ và hủy chuỗi khi cần.
Điều này cũng có vẻ lãng phí, và có nghĩa là tôi sẽ cần phải cẩn thận không vô tình đẻ trứng một sợi mới khi tôi đã có một chạy.
Tôi chắc chắn rằng câu trả lời cho việc giải quyết có hiệu quả tình trạng khó khăn của tôi có thể được tìm thấy ở đâu đó trong "quản lý vòng lặp chạy" trong phần "Các luồng hướng dẫn lập trình" của Apple
có lẽ nó liên quan đến các nguồn đầu vào tùy chỉnh
Nhưng tôi thực sự tìm tài liệu này đầy thử thách.
Nó giống như là tài liệu này đang sinh ra quá nhiều luồng trong não và việc tính toán sẽ dừng lại.
enum eRenderThreadMode
{
render_not_started,
render_run,
render_cancel,
render_finished
};
- (IBAction) startThread:(id)sender
{
self.renderThreadMode = render_run;
label.text = @"doing stuff";
[NSThread detachNewThreadSelector:@selector(keepDoingStuff) toTarget:self withObject:nil];
}
- (void)keepDoingStuff
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
while (renderThreadMode == render_run)
{
if(stuffToDo)
{
[self doStuff];
}
else
{
[NSThread sleepForTimeInterval:kLittleRest];
}
}
self.renderThreadMode = render_finished;
[pool release];
}
- (IBAction)stopThread:(id)sender
{
self.renderThreadMode = render_stop;
while (self.renderThreadMode == render_cancel)
{
[NSThread sleepForTimeInterval:kLittleRest];
}
}
Đồng ý. Sử dụng NSConditionLock. Đây là một cấu trúc luồng chuẩn. –
cảm ơn bạn, điều này có vẻ như nó sẽ làm chính xác những gì tôi muốn –
Tôi đã sử dụng NSCondition, như aem được đề xuất, thay vì NSConditionLock. Bạn có thực sự có nghĩa là ConditionLock thay vì điều kiện đó? Nếu có, bạn sẽ hình dung ra điều này bằng cách sử dụng NSConditionLock như thế nào. Tôi đã không làm việc với các chủ đề c mục tiêu trước đây và tôi thích nghe về các cách tiếp cận khác nhau. –