Tôi đang cố gắng hiển thị một trang tính trên cửa sổ chứa một thanh tiến trình, để hiển thị tiến trình của một số chức năng dài chạy không đồng bộ bằng cách sử dụng Grand Central Dispatch. Tôi đã gần như có nó, nhưng không thể có được tờ để xuất hiện để được tập trung, có lẽ bởi vì tôi đã không sử dụng runModalForWindow:
hoặc tương tự.Làm thế nào để hiển thị chính xác bảng "tiến bộ" trong khi sử dụng Grand Central Dispatch để xử lý nội dung nào đó?
Đây là khoảng những gì tôi đang làm vào lúc này, nó sẽ xảy ra như là kết quả của một nút bấm trên cửa sổ chính:
// Prepare sheet and show it...
[NSApp beginSheet:progressSheet modalForWindow:window modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
[progressSheet makeKeyAndOrderFront:self];
[progressBar setIndeterminate:NO];
[progressBar setDoubleValue:0.f];
[progressBar startAnimation:self];
// Start computation using GCD...
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 1000; i ++) {
// Do some large computation here
// ...
// Update the progress bar which is in the sheet:
dispatch_async(dispatch_get_main_queue(), ^{
[progressBar setDoubleValue:(double)i];
});
}
// Calculation finished, remove sheet on main thread
dispatch_async(dispatch_get_main_queue(), ^{
[progressBar setIndeterminate:YES];
[NSApp endSheet:progressSheet];
[progressSheet orderOut:self];
});
});
này hoạt động, ngoại trừ cửa sổ chính vẫn là ở tập trung, các trang tính nằm ngoài tiêu điểm và thanh tiến trình không hoạt ảnh (trừ khi tôi sử dụng setUsesThreadedAnimation:YES
trên đó).
Sự cố tôi nghĩ là tôi không chắc chắn cách chạy trang tính một cách hợp lý mà không chặn luồng chính trước khi tôi bắt đầu tính toán không đồng bộ?
Chạy trang tính theo phương thức cho cửa sổ sẽ không chặn luồng chính (nếu không thì không có gì sau bit '-beginSheet:' của bạn ở đầu phương thức sẽ thực thi). Tôi sử dụng một cái gì đó gần như giống hệt với điều này (tờ phương thức trình bày như bạn làm, với một thanh tiến trình trên nó) trong ứng dụng của tôi ở đây, và nó cập nhật tốt từ một khối GCD chạy trong nền. Các điều khiển trên cửa sổ tờ giấy trượt xuống được chuyển sang màu xám, cho biết cửa sổ đã mất tập trung vào trang tính, vì vậy điều đó có vẻ bình thường. Có thể có cái gì khác xếp hàng lên rất nhiều hành động trên các chủ đề chính? –
@BradLarson Điều duy nhất tôi có thể nghĩ rằng có thể gây ra vấn đề là một 'dispatch_apply' như là một phần của tính toán chính, nhưng thay thế nó bằng một vòng lặp tiêu chuẩn không tạo ra bất kỳ sự khác biệt nào. Nếu không, có khá nhiều thứ khác không chạy trên luồng chính. Tôi vẫn có thể chủ yếu tương tác với các điều khiển trên cửa sổ chính, phía sau trang tính và chúng vẫn xuất hiện trong tiêu điểm (nghĩa là, không chuyển sang màu xám). Một hộp văn bản trên cửa sổ chính chẳng hạn, trong khi trang tính đang được hiển thị, xuất hiện với một vòng lấy nét và tôi vẫn có thể nhập văn bản vào nó (mặc dù tôi không thể chọn văn bản bằng chuột). – Robert