এনএসআরনলুপ বোঝা যাচ্ছে


108

কেউ কি কি জন্য ব্যাখ্যা করতে পারেন NSRunLoop? সুতরাং আমি যেমন NSRunLoopকিছু NSThreadডান সঙ্গে সংযুক্ত কি জানেন ? সুতরাং ধরে নিন আমি একটি থ্রেড তৈরি করি

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

-(void) someMethod
{
    NSLog(@"operation");
}

সুতরাং এই থ্রেড তার কাজ সঠিকভাবে শেষ করার পরে? কেন ব্যবহার করবেন RunLoopsবা কোথায় ব্যবহার করবেন? অ্যাপল ডক্স থেকে আমি কিছু পড়েছি তবে এটি আমার পক্ষে পরিষ্কার নয়, সুতরাং দয়া করে যতটা সম্ভব সহজ ব্যাখ্যা করুন


এই প্রশ্নটি সুযোগে খুব বিস্তৃত। আপনার প্রশ্নটি আরও নির্দিষ্ট কিছুতে পরিমার্জন করুন।
জোডি হ্যাগিনস

3
প্রথমে আমি জানতে চাই জেনারেল এনএসআরনলুপে কী করে এবং এটি থ্রেডের সাথে কীভাবে সংযুক্ত
tafarel

উত্তর:


211

একটি রান লুপ একটি বিমূর্ততা যা (অন্যান্য জিনিসের মধ্যে) সিস্টেম ইনপুট উত্সগুলি পরিচালনা করার জন্য একটি ব্যবস্থা সরবরাহ করে (সকেট, পোর্ট, ফাইল, কীবোর্ড, মাউস, টাইমারস ইত্যাদি)।

প্রতিটি এনএসথ্রেডের নিজস্ব রান লুপ থাকে, যা বর্তমানরুনলুপ পদ্ধতিতে অ্যাক্সেস করা যায়।

সাধারণভাবে, আপনাকে সরাসরি রান লুপটি অ্যাক্সেস করতে হবে না, যদিও এমন কিছু (নেটওয়ার্কিং) উপাদান রয়েছে যা আপনাকে I / O প্রসেসিংয়ের জন্য কোন রান লুপ ব্যবহার করবে তা নির্দিষ্ট করতে দেয়।

প্রদত্ত থ্রেডের জন্য একটি রান লুপ তার এক বা একাধিক ইনপুট উত্সগুলিতে কিছু ডেটা বা ইভেন্ট না হওয়া পর্যন্ত অপেক্ষা করবে, তারপরে "প্রস্তুত" প্রতিটি ইনপুট উত্স প্রক্রিয়া করতে উপযুক্ত ইনপুট হ্যান্ডলার (গুলি) ফায়ার করবে।

এটি করার পরে এটি তার লুপটিতে ফিরে আসবে, বিভিন্ন উত্স থেকে ইনপুট প্রক্রিয়াকরণ করবে এবং যদি কোনও কাজ না করে থাকে তবে "ঘুম"।

এটি একটি সুন্দর উচ্চ স্তরের বর্ণনা (অনেকগুলি বিবরণ এড়াতে চেষ্টা করা)।

সম্পাদনা

মন্তব্যটি সম্বোধনের চেষ্টা attempt আমি এটিকে টুকরো টুকরো করলাম।

  • এর অর্থ হল যে আমি কেবল থ্রেডের ভিতরে লুপ চালাতে অ্যাক্সেস / চালাতে পারি?

প্রকৃতপক্ষে. এনএসআরুনলুপ থ্রেড নিরাপদ নয়, এবং কেবল থ্রেডের প্রসঙ্গ থেকে অ্যাক্সেস করা উচিত যা লুপটি চলছে।

  • লুপ চালাতে কীভাবে ইভেন্ট যুক্ত করবেন তার কোনও সাধারণ উদাহরণ নেই?

আপনি যদি কোনও বন্দর পর্যবেক্ষণ করতে চান, আপনি কেবল রান লুপটিতে সেই পোর্টটি যুক্ত করবেন এবং তারপরে রান লুপ ক্রিয়াকলাপের জন্য সেই পোর্টটি দেখবে।

- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode

আপনি স্পষ্টভাবে একটি টাইমার যোগ করতে পারেন

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
  • এর অর্থ কী এরপরে আবার ফিরে আসবে?

রান লুপটি প্রতিটি পুনরাবৃত্তির (তার মোড অনুযায়ী) সমস্ত প্রস্তুত ইভেন্টগুলি প্রক্রিয়া করবে। রান মোডগুলি আবিষ্কার করার জন্য আপনাকে ডকুমেন্টেশনটি দেখতে হবে কারণ এটি একটি সাধারণ উত্তরের ক্ষেত্রের বাইরে কিছুটা।

  • আমি থ্রেড শুরু করি তখন লুপটি নিষ্ক্রিয় হয়?

বেশিরভাগ অ্যাপ্লিকেশনগুলিতে, প্রধান রান লুপটি স্বয়ংক্রিয়ভাবে চলবে। তবে রান লুপটি শুরু করার জন্য এবং আপনার ঘূর্ণিত থ্রেডগুলির জন্য আগত ইভেন্টগুলির প্রতিক্রিয়া জানানোর জন্য আপনি দায়বদ্ধ।

  • থ্রেডের বাইরে থ্রেড রান লুপে কিছু ইভেন্ট যুক্ত করা সম্ভব?

আপনি এখানে কী বলতে চাইছেন তা আমি নিশ্চিত নই। আপনি রান লুপে ইভেন্টগুলি যুক্ত করবেন না। আপনি ইনপুট উত্স এবং টাইমার উত্সগুলি যোগ করুন (রান লুপের মালিকানাযুক্ত থ্রেড থেকে)। রান লুপটি তাদের ক্রিয়াকলাপের জন্য লক্ষ্য করে। আপনি অবশ্যই অন্যান্য থ্রেড এবং প্রক্রিয়াগুলি থেকে ডেটা ইনপুট সরবরাহ করতে পারেন তবে রান লুপ দ্বারা ইনপুট প্রক্রিয়া করা হবে যা রান লুপটি চালাচ্ছে এমন থ্রেডের সেই উত্সগুলি পর্যবেক্ষণ করছে।

  • এর অর্থ কি কখনও কখনও আমি থ্রেডকে সময়ের জন্য ব্লক করতে রান লুপ ব্যবহার করতে পারি

প্রকৃতপক্ষে. প্রকৃতপক্ষে, একটি রান লুপ ইভেন্ট হ্যান্ডলারটিতে "থাকার" থাকবে যতক্ষণ না ইভেন্ট ইভেন্ট হ্যান্ডলারটি ফিরে না আসে। আপনি কেবল যেকোন অ্যাপে এটি দেখতে পারবেন। ঘুমায় এমন কোনও আইও ক্রিয়া (যেমন, বোতাম টিপুন) এর জন্য একটি হ্যান্ডলার ইনস্টল করুন। এই পদ্ধতিটি শেষ না হওয়া পর্যন্ত আপনি প্রধান রান লুপটি (এবং পুরো ইউআই) ব্লক করবেন।

এটি কোনও রান লুপের ক্ষেত্রে প্রযোজ্য।

আমি আপনাকে রান লুপগুলিতে নিম্নলিখিত ডকুমেন্টেশন পড়ার পরামর্শ দিচ্ছি:

https://developer.apple.com/documentation/foundation/nsrunloop

এবং তারা থ্রেডের মধ্যে কীভাবে ব্যবহৃত হয়:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1


2
এর অর্থ হল যে আমি কেবল থ্রেডের ভিতরে লুপ চালাতে অ্যাক্সেস / চালাতে পারি? লুপ চালাতে কীভাবে ইভেন্ট যুক্ত করবেন তার কোনও সাধারণ উদাহরণ নেই? এর অর্থ কী এরপরে আবার ফিরে আসবে? আমি থ্রেড শুরু করি তখন লুপটি নিষ্ক্রিয় হয়? থ্রেডের বাইরে থ্রেড রান লুপে কিছু ইভেন্ট যুক্ত করা সম্ভব? এর অর্থ কি কখনও কখনও থ্রেডকে ব্লক করতে রান লুপ ব্যবহার করতে পারি?
tafarel

"ঘুমায় এমন কোনও আইও ক্রিয়া (যেমন, বোতাম টিপুন) এর জন্য একটি হ্যান্ডলার ইনস্টল করুন" " আপনি যদি বলতে চান যে আমি যদি বোতামটি টিপতে থাকি তবে এটি কিছুক্ষণের জন্য থ্রেডটি অবরুদ্ধ করতে থাকবে ?!
মধু

না। আমি যা বলতে চাইছি হ্যান্ডলারটি শেষ না হওয়া অবধি রানলুপ নতুন ইভেন্টগুলি প্রক্রিয়াকরণ করে না। আপনি যদি হ্যান্ডলারে ঘুমেন (বা এমন কিছু অপারেশন করেন যা বেশ দীর্ঘ সময় নেয়), তবে হ্যান্ডলারের কাজ শেষ না হওয়া পর্যন্ত রান লুপটি ব্লক হয়ে যাবে।
জোডি হ্যাগিনস

@ টাফেরেল থ্রেডের বাইরে থ্রেড রান লুপে কিছু ইভেন্ট যুক্ত করা সম্ভব? যদি এর অর্থ যদি "আমি ইচ্ছামত অন্য থ্রেডের রানলুপে কোড রান করতে পারি" তবে উত্তরটি অবশ্যই হ্যাঁ। কেবল কল করুন performSelector:onThread:withObject:waitUntilDone:, কোনও NSThreadবস্তুর পাস এবং আপনার নির্বাচকটি সেই থ্রেডের রানলুপের জন্য নির্ধারিত হবে।
মক্কি

12

কমান্ড-লাইন সরঞ্জামগুলি থেকে ইন্টারঅ্যাকটিভ অ্যাপ্লিকেশনগুলিকে আলাদা করে সেগুলি রান লুপগুলি ।

  • কমান্ড-লাইন সরঞ্জামগুলি পরামিতিগুলির সাথে চালু করা হয়, তাদের কমান্ড কার্যকর করে তারপরে প্রস্থান করুন।
  • ইন্টারেক্টিভ অ্যাপ্লিকেশনগুলি ব্যবহারকারী ইনপুটটির জন্য অপেক্ষা করে , প্রতিক্রিয়া জানায়, তারপরে অপেক্ষা শুরু করে res

থেকে এখানে

তারা আপনাকে ব্যবহারকারীর ট্যাপ না হওয়া পর্যন্ত অপেক্ষা করতে এবং সেই অনুযায়ী প্রতিক্রিয়া জানাতে, আপনি একটি সমাপ্তি হ্যান্ডলার এবং তার ফলাফলগুলি প্রয়োগ না করা পর্যন্ত অপেক্ষা করুন, আপনি টাইমার না পাওয়া পর্যন্ত এবং কোনও ফাংশন সম্পাদন না করা পর্যন্ত অপেক্ষা করুন। আপনার যদি রানলুপ না থাকে তবে আপনি শুনতে পাচ্ছেন না / ব্যবহারকারীর কলগুলির জন্য অপেক্ষা করছেন, কোনও নেটওয়ার্ক কল না হওয়া পর্যন্ত আপনি অপেক্ষা করতে পারবেন না, আপনি x মিনিটে জেগে উঠতে পারবেন না আপনি যদি না ব্যবহার করেনDispatchSourceTimer বাDispatchWorkItem

এছাড়াও এই মন্তব্য থেকে :

পটভূমি থ্রেডগুলির নিজস্ব রানলুপ নেই, তবে আপনি কেবল একটি যুক্ত করতে পারেন। যেমন এএফ নেট নেটওয়ার্কিং ২.x এটি করেছে। ব্যাকগ্রাউন্ড থ্রেডগুলিতে এটি এনএসআরএল সংযোগ বা এনএসটিমিকার জন্য সত্য চেষ্টা করা হয়েছিল, তবে আমরা নতুনভাবে এগুলি করি না, কারণ নতুন নতুন এপিআইগুলি এটি করার প্রয়োজনীয়তা বাদ দেয়। তবে এটি প্রদর্শিত হয় যে ইউআরএলসেশনটি এখানে সাধারণ অনুরোধ , চলমান [চিত্রের বাম প্যানেলটি] মূল কাতারে সম্পূর্ণ হওয়া হ্যান্ডলারগুলি দেখায় এবং আপনি দেখতে পাচ্ছেন যে এটি ব্যাকগ্রাউন্ড থ্রেডে একটি রান লুপ রয়েছে can


বিশেষত: "ব্যাকগ্রাউন্ড থ্রেডগুলির নিজস্ব রানলুপ নেই"। নিম্নলিখিত টাইমারটি অ্যাসিঙ্ক প্রেরণের জন্য ব্যর্থ হয় :

class T {
    var timer: Timer?

    func fireWithoutAnyQueue() {
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false, block: { _ in
            print("without any queue") // success. It's being ran on main thread, since playgrounds begin running from main thread
        })
    }

    func fireFromQueueAsnyc() {
        let queue = DispatchQueue(label: "whatever")
        queue.async {
            self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false, block: { (_) in
                print("from a queue — async") // failed to print
            })
        }
    }

    func fireFromQueueSnyc() {
        let queue = DispatchQueue(label: "whatever")
        queue.sync {
            timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false, block: { (_) in
                print("from a queue — sync") // success. Weird. Read my possible explanation below
            })
        }
    }

    func fireFromMain() {
        DispatchQueue.main.async {
            self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false, block: { (_) in
                print("from main queue — sync") //success
            })
        }
    }
}

আমি মনে করি যে syncব্লকটি চালানোর কারণ হ'ল:

সিঙ্ক ব্লকগুলি সাধারণত তাদের উত্স সারি থেকে কার্যকর করা হয় । এই উদাহরণে, উত্স সারি প্রধান সারি, যে কোনও সারিই গন্তব্য সারি।

যা পরীক্ষা করার জন্য আমি RunLoop.currentপ্রতিটি প্রেরণের ভিতরে লগইন করেছি ।

সিঙ্ক প্রেরণের মূল সারি হিসাবে একই রানলুপ ছিল । যদিও অ্যাসিঙ্ক ব্লকের মধ্যে রানলুপটি অন্যদের থেকে আলাদা ঘটনা ছিল। আপনি ভাবছেন যে কীভাবে RunLoop.currentআলাদা মানটি আসে return এটি কি ভাগ করা মান নয় !? দুর্দান্ত প্রশ্ন! আরও পড়ুন:

গুরুত্বপূর্ণ তথ্য:

বর্গ সম্পত্তি current একটি বিশ্বব্যাপী পরিবর্তনশীল নয়।

বর্তমান থ্রেডের জন্য রান লুপ প্রদান করে ।

এটি প্রাসঙ্গিক। এটি কেবল থ্রেডের মধ্যে যেমন থ্রেড-লোকাল স্টোরেজতে দৃশ্যমান । এখানে আরও দেখুন ।

এটি টাইমারগুলির সাথে একটি পরিচিত সমস্যা। আপনি যদি ব্যবহার করেন তবে আপনার একই সমস্যা নেইDispatchSourceTimer


8

রানলুপগুলি এমন কিছু বাক্সের মতো যেখানে স্টাফগুলি ঘটে।

মূলত, একটি রানলুপে, আপনি কিছু ইভেন্টগুলি প্রক্রিয়া করতে যান এবং তারপরে ফিরে আসেন। বা টাইমআউট হিট হওয়ার আগে যদি কোনও ইভেন্ট প্রক্রিয়া না করে তবে ফিরে আসুন। আপনি এটিকে অ্যাসিক্রোনাস এনএসআরএল সংযোগগুলির অনুরূপ, আপনার বর্তমান লুপকে হস্তক্ষেপ না করে ব্যাকগ্রাউন্ডে ডেটা প্রসেসিংয়ের অনুরূপ হিসাবে একই সময়ে বলতে পারেন, আপনার একই সাথে ডেঙ্কের প্রয়োজন। যা রানলুপের সাহায্যে করা যেতে পারে যা আপনার অ্যাসিনক্রোনাস NSURLConnectionকরে এবং কলিংয়ের সময় ডেটা সরবরাহ করে। আপনি এটির মতো একটি রানলুপ ব্যবহার করতে পারেন:

NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];

while (YourBoolFlag && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil]) {
    loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
}

এই RunLoop, এটা না হওয়া পর্যন্ত আপনি আপনার অন্য কাজের কিছু সম্পূর্ণ সেট চালানো হবে YourBoolFlag করার মিথ্যা

একইভাবে, আপনি এগুলি থ্রেডে ব্যবহার করতে পারেন।

আশা করি এটি আপনাকে সহায়তা করবে।


0

রান লুপগুলি থ্রেডগুলির সাথে যুক্ত মৌলিক অবকাঠামোর অংশ। রান লুপ একটি ইভেন্ট প্রসেসিং লুপ যা আপনি কাজের সময় নির্ধারণ এবং আগত ইভেন্টগুলির প্রাপ্তি সমন্বয় করতে ব্যবহার করেন। রান লুপের উদ্দেশ্য হ'ল কাজ করার সময় আপনার থ্রেডকে ব্যস্ত রাখা এবং যখন কিছুই নেই তখন আপনার থ্রেডটি ঘুমিয়ে দেওয়া।

এখান থেকে


সিএফআরনলুপের সর্বাধিক গুরুত্বপূর্ণ বৈশিষ্ট্য হ'ল সিএফআরুনলুপমডস। সিএফআরনলুপ "রান লুপ সোর্স" সিস্টেমের সাথে কাজ করে। এক বা একাধিক মোডের জন্য উত্সগুলি রান লুপে নিবন্ধভুক্ত হয় এবং রান লুপ নিজেই একটি প্রদত্ত মোডে চালানোর জন্য তৈরি হয়। কোনও ইভেন্ট যখন কোনও উত্সে আসে, সোর্স মোডটি রান লুপের বর্তমান মোডের সাথে মেলে তবে এটি কেবল রান লুপ দ্বারা পরিচালিত হবে।

এখান থেকে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.