2011-11-07 29 views
6

Tôi hiện đang lập trình một ứng dụng trích xuất khung từ một movie clip. Tôi đã thiết kế nó để quá trình chiết sẽ được thực hiện trên một sợi riêng biệt để ngăn ứng dụng bị đóng băng. Quá trình khai thác chính nó đang lấy rất nhiều tài nguyên, nhưng hoạt động tốt khi được sử dụng trong trình mô phỏng. Tuy nhiên, có vấn đề khi xây dựng nó cho iPad. Khi tôi thực hiện một hành động khác (tôi đang nói với trình phát AV của mình để phát trong khi tôi trích xuất khung), chuỗi bất ngờ ngừng hoạt động và tôi tin rằng nó bị giết.Chủ đề đang bị hệ điều hành cắt

Tôi cho rằng đó là becauase Tôi đang sử dụng rất nhiều tài nguyên, nhưng không hoàn toàn chắc chắn.

Đây là câu hỏi của tôi: 1. Làm cách nào để biết liệu tại sao chuỗi của tôi dừng lại? 2. Nếu nó thực sự là do quá trình xử lý thì tôi nên làm gì? Tôi thực sự cần hành động này để được thực hiện.

Heres một số mã im sử dụng: Để tạo thread:

[NSThread detachNewThreadSelector:@selector(startReading) toTarget:self withObject:nil];

tôi sẽ đăng bất kỳ thông tin nào bạn cần, Cảm ơn rất nhiều!

Cập nhật Tôi đang sử dụng GCD ngay bây giờ và nó điền chủ đề cho tôi. Tuy nhiên hệ điều hành vẫn giết chết các chủ đề.

Tôi biết chính xác khi nào nó diễn ra. khi tôi nói với [AVplayer play] của tôi; nó giết chết sợi chỉ.

Vấn đề này chỉ xảy ra trong iPad thực tế và không phải trên giả lập

+0

Nếu bạn phải hỏi, hãy thử sử dụng trừu tượng mức cao hơn thay thế, như hàng đợi công văn (GCD) hoặc hàng đợi hoạt động (NSOperationQueue).Xem [Di chuyển khỏi Chủ đề] (http://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/ConcurrencyandApplicationDesign/ConcurrencyandApplicationDesign.html#//apple_ref/doc/uid/TP40008091-CH100- SW8) cho một cuộc thảo luận mở rộng, hoặc tìm một ví dụ [GCD] (http://stackoverflow.com/questions/7941860/#7941898) hoặc [NSOperationQueue] (http://stackoverflow.com/questions/830218/). Đó là công cụ rất hữu ích. – Jano

+1

ứng dụng của bạn có gặp sự cố không? nếu vậy báo cáo sự cố nói gì? bạn có chắc AVPlayer là chủ đề an toàn không? bởi vì nếu bạn đang gọi [AVplayer play] và truy cập nó cùng một lúc trong một chủ đề nền, đó có thể là vấn đề. – JeanLuc

+0

Chủ đề trích xuất của bạn có đang chạy dưới dạng chuỗi nền không? Tôi đang học Objective-C nhưng, nếu bạn có thể chạy nó như là một chủ đề nền có thể giúp không bị giết bởi hệ điều hành. –

Trả lời

0

Khi một cái gì đó hoạt động trong mô phỏng và không hoạt động trên một thiết bị, một lời giải thích rõ ràng là một vấn đề khó khăn tài nguyên cho chắc chắn. Nhưng đôi khi giả lập không mô phỏng chính xác các khía cạnh khác của hoạt động của thiết bị. Vì vậy, tôi tự hỏi nếu có thể có bất kỳ giải thích khác cho tình hình. Một khả năng xảy ra với tôi rằng nó có thể là sự cạnh tranh cho một tài sản hạn chế - truy cập vào Tài sản AV — có nghĩa là khi bạn bắt đầu chơi nó, nó không còn khả dụng để xử lý nữa (và vì lý do nào đó, lỗi trong trình mô phỏng không hiển thị hạn chế này)

Trong AV Foundation Programming Guide, under "Playing Assets" bang Apple:.

Mặc dù cuối cùng bạn muốn chơi một tài sản, bạn không cung cấp tài sản trực tiếp đến một đối tượng AVPlayer. Thay vào đó, bạn cung cấp một thể hiện của AVPlayerItem. Một mục người chơi quản lý trạng thái bản trình bày của nội dung được liên kết. Một mục trình phát chứa các bản nhạc của mục trình phát — các bản sao của AVPlayerItemTrack — tương ứng với các bản nhạc trong nội dung.

Sự trừu tượng này có nghĩa là bạn có thể phát một nội dung cụ thể bằng cách sử dụng các trình phát khác nhau cùng một lúc, nhưng được hiển thị theo nhiều cách khác nhau cho mỗi người chơi. Sử dụng các bản nhạc mục, bạn có thể, ví dụ, vô hiệu hóa một bản nhạc cụ thể trong khi phát lại (bạn có thể không muốn phát thành phần âm thanh).

Vì vậy, tôi tự hỏi — bạn có đang sử dụng AVPlayerItems để truy cập vào nội dung của bạn, điều đó có thể cho phép cả hai hoạt động diễn ra cùng một lúc không? Nếu vậy, ít nhất là hướng cụ thể đó sẽ bị loại trừ. Nhưng nếu không, có thể là giá trị điều tra để xem nếu nó sửa chữa vấn đề.

Có thể nắm bắt được ở ống hút. Nhưng có thể dẫn đến đâu đó.

+0

Bây giờ tôi biết thực tế là khi tôi đọc khung từ nội dung sau khi tôi bắt đầu một AVPlayer với nội dung này, chuỗi đang dừng nhưng làm cách nào tôi có thể bỏ qua? –

+0

Nếu bạn không truy cập nội dung thông qua một AVPlayerItem, bạn nên cung cấp một cá thể AVPlayerItem để phát nội dung đó và một cá thể AVPlayerItem thứ hai để đọc khung từ nội dung. Điều này sẽ cho phép cả hai xảy ra đồng thời. –

+0

Tôi đang sử dụng tài sản AVPlayer để phát nội dung nhưng không đọc các khung hình. Đối với im đó bằng cách sử dụng AVAssetReader được bắt đầu với bản thân tài sản. Làm thế nào u sẽ đề nghị làm điều đó? –

0

Trong phần 'Điêu chỉnh kích thước ngăn xếp của một thread' của Programming Guide Threading của Apple, trang 27 cho biết:

Trong iOS và Mac OS X v10.5 và sau đó, phân bổ và khởi tạo một đối tượng NSThread (không sử dụng detachNewThreadSelector: toTarget: withObject: phương pháp)

Mặc dù trong trang 22 nói detachNewThreadSelector là một trong những cách để tạo chủ đề sử dụng NSThread.

Và nó mang lại cho ví dụ này trong trang 23 của làm thế nào để bắt đầu chủ đề của bạn:

NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil]; 
[myThread start]; 

Theo hướng dẫn rằng sẽ tạo ra một sợi tách ra trong ứng dụng của bạn. Hãy thử tạo chủ đề của bạn theo cách này và xem liệu hệ điều hành có ngừng giết chủ đề của bạn hay không.

Để tham khảo ở đây là liên kết để hướng dẫn

http://developer.apple.com/library/ios/iPad/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html#//apple_ref/doc/uid/10000057i-CH15-SW2

Nó cũng đề cập ở trang 29 rằng nếu ứng dụng của bạn sử dụng mô hình bộ nhớ được quản lý, mà dường như bạn đang có, tạo ra một hồ bơi autorelease trong chủ đề của bạn thói quen nhập cảnh nên là điều đầu tiên bạn làm và phá hủy tương tự nó điều cuối cùng mà luồng của bạn làm. Không chắc chắn không có điều này sẽ gây ra sự giết chết của chủ đề của bạn nhưng xác minh bạn làm điều này.

Có khối try/catch trong tiến trình nhập chuỗi của bạn có thể không giải quyết được sự cố giết nhưng sẽ tránh ứng dụng của bạn thoát nếu xảy ra lỗi trong chuỗi của bạn.

Tôi quên đề cập đến mẹo thiết kế khác có thể giúp bạn với các ràng buộc tài nguyên, như Duncan đã đề cập. Theo hướng dẫn trang 18:

Tránh Cấu trúc dữ liệu được chia sẻ

Cách đơn giản nhất và dễ nhất để tránh chủ đề liên quan đến tài nguyên xung đột là để cung cấp cho mỗi chủ đề trong chương trình của bạn sao chép riêng của mình bất cứ dữ liệu mà nó nhu cầu. Mã song song hoạt động tốt nhất khi bạn thu nhỏ sự giao tiếp giữa tài nguyên và giao tiếp giữa các chuỗi của bạn.

Tôi nghĩ bạn có thể làm điều đó trong ứng dụng của mình. Ngoài việc làm những gì Duncan đề cập "không cung cấp tài sản trực tiếp cho đối tượng AVPlayer mà thay vào đó cung cấp một thể hiện của AVPlayerItem", hãy tạo ra các cá thể riêng biệt cho mỗi chủ đề của bạn, một cá thể AVPlayerItem cho chuỗi trình phát và một cá thể AVPlayerItem cho các chủ đề khai thác.

1

Nghe có vẻ như tôi đang cố gắng giải mã hai video clip cùng một lúc. Do tính chất giải mã dựa trên phần cứng của iPad, nó chỉ có thể hỗ trợ một quá trình giải mã tại một thời điểm. Khi bạn chơi một mục mới, mục cũ sẽ bị hủy. Điều này sẽ giải thích lý do tại sao nó hoạt động trong trình giả lập, nhưng không hoạt động trên thiết bị.

Đối với giải pháp, bạn có thể chuyển sang bộ giải mã phần mềm thuần túy như libav (GPL) hoặc CoreAVC SDK (thương mại). Bằng cách đó bạn sẽ không can thiệp vào bộ giải mã HW để phát lại.

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