0

NSOperationQueue을 사용하여 스레드 풀링을 구현했습니다. 나는 maxConcurrentOperationCount25으로 설정했다. 즉, 동시에 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에 사용되는

? Objective-C에 ManualResetEvent을 구현하는 방법은 무엇입니까?

답변

0

기다리거나 일시 중지하지 마십시오. 대신 직장 만들기 (및 확인)를 새로운 방법으로 옮기십시오. 이 메소드는 사용 가능한 한계까지 작업을 작성한 다음 리턴해야합니다. 생성 된 각 작업에는 작업 생성 방법을 호출하는 completionBlock이 추가되어야합니다.

이렇게하면 차단하는 대신 이벤트가 트리거됩니다.

일반적으로 completionBlock은 작업 생성 방법을 호출하기 전에 주 스레드로 변경해야합니다.

+0

현재 NSOperationQueue를 사용하여 업로드 부분을 달성하고 있으므로 서버에 데이터를 업로드하는 데 시간이 필요합니다. 업로드 할 데이터는 빠르게 실행되는 ReadData 클래스에서 발생합니다. 따라서 NSOperationQueue에 공간이있을 때까지 ReadData를 일시 중지하고 싶습니다. if 대기열에 공간이 있습니다. ReadData가 작동하고 다음 데이터가 NSOperationQueue에 할당됩니다. C#에서는 ManualResetEvent 클래스를 사용하여 처리합니다. objective-c를위한 가능한 솔루션은 무엇입니까? ManualResetEvent를 여러 스레드에서 구현하는 방법은 무엇입니까? – Snehal

+0

위의 해결책을 싫어하면'NSConditionLock'을 사용할 수 있습니다. – Wain

+0

나는 당신의 해결책을 좋아하지만 이것을 수행하는 다른 방법은 .. 나는 실현 가능한 해결책을 원한다. NSConditionLock 또는 NSLock은 리소스를 공유했습니다 ... 일시 중지하고 각 스레드를 개별적으로 다시 시작하고 싶습니다. 내 지식에 따라 NSConditionLock이이를 수행하지 못합니다. NSConditionLock이 더 나은 옵션이라고 생각하면 샘플 코드를 제공해주세요. .. C와 마찬가지로 우리는 ManualResetEvent 클래스를 사용하여 set, Reset, waitOne 메소드를 일시 중지하고 다시 시작합니다 ... objective-c (MAC)에 적합한 옵션은 무엇입니까? 귀하의 소중한 제안을주십시오 ... – Snehal