NSOperationQueue
을 사용하여 스레드 풀링을 구현했습니다. 나는 maxConcurrentOperationCount
을 25
으로 설정했다. 즉, 동시에 25 개의 스레드가 동시에 실행됩니다.NSOperationQueue 일시 중지 및 다시 시작 하시겠습니까?
나는이 NSOperationQueue
을 사용하여 청크를 서버에 업로드하고 있습니다. 따라서 청크는 처음 25 개의 스레드에 할당됩니다. NSOperationQueue
이 꽉 차면 청킹 읽기 부분을 일시 중지하고 대기열의 스레드가 완료 될 때마다 청크 부분을 다시 시작하여 완료된 스레드를 대체하기 위해 NSOperationQueue
에 새 스레드를 할당합니다.
내 코드 :
NSOperationQueue *operationQueue = [NSOperationQueue new];
operationQueue.maxConcurrentOperationCount=5;
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(upload:) object:f_objChunkDetails->FileStream];
NSUInteger oprCnt=operationQueue.operationCount;
if(oprCnt >= 5) {
// wait till queue has a free slot
} else {
[operationQueue addOperation:operation];
}
어떻게 일시 중지 및 재개 NSOperationQueue
에 사용되는
ManualResetEvent
을 구현하는 방법은 무엇입니까?
현재 NSOperationQueue를 사용하여 업로드 부분을 달성하고 있으므로 서버에 데이터를 업로드하는 데 시간이 필요합니다. 업로드 할 데이터는 빠르게 실행되는 ReadData 클래스에서 발생합니다. 따라서 NSOperationQueue에 공간이있을 때까지 ReadData를 일시 중지하고 싶습니다. if 대기열에 공간이 있습니다. ReadData가 작동하고 다음 데이터가 NSOperationQueue에 할당됩니다. C#에서는 ManualResetEvent 클래스를 사용하여 처리합니다. objective-c를위한 가능한 솔루션은 무엇입니까? ManualResetEvent를 여러 스레드에서 구현하는 방법은 무엇입니까? – Snehal
위의 해결책을 싫어하면'NSConditionLock'을 사용할 수 있습니다. – Wain
나는 당신의 해결책을 좋아하지만 이것을 수행하는 다른 방법은 .. 나는 실현 가능한 해결책을 원한다. NSConditionLock 또는 NSLock은 리소스를 공유했습니다 ... 일시 중지하고 각 스레드를 개별적으로 다시 시작하고 싶습니다. 내 지식에 따라 NSConditionLock이이를 수행하지 못합니다. NSConditionLock이 더 나은 옵션이라고 생각하면 샘플 코드를 제공해주세요. .. C와 마찬가지로 우리는 ManualResetEvent 클래스를 사용하여 set, Reset, waitOne 메소드를 일시 중지하고 다시 시작합니다 ... objective-c (MAC)에 적합한 옵션은 무엇입니까? 귀하의 소중한 제안을주십시오 ... – Snehal