ক্রোম: ব্যাকগ্রাউন্ড ট্যাবগুলিতে টাইমআউট / বিরতি স্থগিত?


130

আমি এই পরীক্ষাটিsetTimeout ব্যবহারের নির্ভুলতা পরীক্ষা করছিলাম । এখন আমি লক্ষ্য করেছি যে (প্রত্যাশিত হিসাবে) খুব নির্ভুল নয় তবে বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য নাটকীয়ভাবে ভুল নয়। এখন যদি আমি Chrome এ পরীক্ষাটি চালাই এবং এটি একটি পটভূমির ট্যাবে চালিত হতে দেয় (সুতরাং, অন্য ট্যাবে স্যুইচ করে সেখানে ব্রাউজ করুন), পরীক্ষায় ফিরে এসে টে ফলাফলগুলি পরীক্ষা করে (যদি পরীক্ষা শেষ হয়) সেগুলি নাটকীয়ভাবে পরিবর্তিত হয়েছে। দেখে মনে হচ্ছে টাইমআউটগুলি অনেক ধীর গতিতে চলেছে। FF4 বা IE9 তে পরীক্ষিত এটি ঘটে নি didn'tsetTimeout

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

কেউ কি এর মুখোমুখি হয়েছেন? এই সাসপেনশন / গতি কমিয়ে দেওয়ার জন্য কি কোনও উপায় আছে? আপনি কি এটি একটি বাগ বলবেন এবং আমি কি এটির মতো ফাইল করব?


মজাদার! আপনি কী ট্যাবটি পুনরায় অ্যাক্সেস করার পরে Chrome কি টাইমর থামিয়ে আবার টাইমার পুনরায় চালু করছে বা পুনরায় চালু করছে? নাকি আচরণ এলোমেলো? ক্রোম স্বাধীন প্রক্রিয়াগুলিতে ট্যাব চালায় এই সত্যের সাথে কি কিছু থাকতে পারে?
হায়দারA

@ গ্যামবুকা: @ পিমভডিবি এর উত্তর একবার দেখুন। এটি সম্ভবত প্রতি সেকেন্ডে সর্বাধিক একবারে ধীর হয়ে যায়।
KooiInc

4 বছর পরে এবং এই সমস্যা এখনও বিদ্যমান। আমার সাথে একটি ডিভ্সের জন্য একটি সেটটাইমআউট আছে transition, সুতরাং একই সাথে সমস্ত ডিভস ট্রানজিশন হয় না, তবে বাস্তবে প্রত্যেকের পরে 15 মিমি থাকে, কিছু ঘূর্ণায়মান প্রভাব তৈরি করে। আমি যখন অন্য ট্যাবে যাই এবং কিছুক্ষণ পরে ফিরে আসি, একই সাথে সমস্ত ডিভস রূপান্তর হয় এবং এটি setTimeOutসম্পূর্ণ উপেক্ষা করা হয়। এটি আমার প্রকল্পের জন্য কোনও বড় সমস্যা নয়, তবে এটি একটি অদ্ভুত এবং অযাচিত সংযোজন।
রাভারভুর্ট

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

উত্তর:


88

আমি সম্প্রতি এটি সম্পর্কে জিজ্ঞাসা করেছি এবং এটি নকশা অনুসারে আচরণ। যখন কোনও ট্যাব নিষ্ক্রিয় থাকে তখন কেবলমাত্র সেকেন্ডে সর্বোচ্চ একবারে ফাংশনটি ডাকা হয়। এখানে কোড পরিবর্তন

সম্ভবত এটি সহায়তা করবে: Chrome এ যখন কোনও ট্যাব নিষ্ক্রিয় থাকে তখন আমি কীভাবে সেটআইন্টারওয়াল কাজ করতে পারি?

টিএল; ডিআর: ওয়েব ওয়ার্কার্স ব্যবহার করুন ।


3
ধন্যবাদ, আমার 'নিষ্ক্রিয় ট্যাব' দিয়ে দেখা উচিত ছিল। নেটিভ ইংলিশ স্পিকার না হওয়া কখনও কখনও কখনও প্রতিবন্ধক হয়।
KooiInc

1
@ কিলঙ্ক: সমস্যা নেই :) আমিও স্থানীয় ইংরেজী স্পিকার নই।
pimvdb

22

ওয়েব ওয়ার্কার্স ব্যবহার করার একটি সমাধান রয়েছে, কারণ এগুলি পৃথক প্রক্রিয়াতে চলে এবং ধীর হয়ে যায় না

আমি একটি ছোট স্ক্রিপ্ট লিখেছি যা আপনার কোডের পরিবর্তন ছাড়াই ব্যবহার করা যেতে পারে - এটি কেবল ফাংশন সেটটাইমআউট, ক্লিয়ারটাইমআউট, সেটইন্টারভাল, ক্লিয়ার ইনটারওয়ালকে ওভাররাইড করে

আপনার সমস্ত কোডের আগে এটি অন্তর্ভুক্ত করুন

http://github.com/turuslan/HackTimer


7
এটি দুর্দান্ত এবং সব কিছু সম্পর্কে সচেতন থাকুন: ১. শ্রমিকদের ডিওমে কোনও অ্যাক্সেস নেই, ২. শ্রমিকরা কেবল নিজেরাই কোনও ফাইলের মধ্যে থাকলে তাদের সম্পাদন করা হয়। এটি প্রচুর ক্ষেত্রে সেটটাইমআউটের জন্য ড্রপ-ইন প্রতিস্থাপন নয়
মাদারার ঘোস্ট

1
আপনি ঠিকই বলেছেন, তবে কিছু আধুনিক ব্রাউজারগুলি ব্লবস ( এইচটিএমএল 5 আরকস / এন / টিউটোরিয়ালস / ওয়ার্কার্স / বেসিকস / # টোক-ইনলাইন ওয়ার্কার্স ) ব্যবহার করে তাদের নিজস্ব ফাইল ছাড়াই শ্রমিকদের ব্যবহারের অনুমতি দেয়
রুশলান তুষোভ

1
এমনকি এটির সাথেও, ওয়েব ওয়ার্কাররা প্রচুর কার্যকারিতা (যথা, ডিওএম) হারিয়েছেন যা তাদের সেটটাইমআউট এবং কোয়ের জন্য নিরাপদ প্রতিস্থাপনের সুযোগ দেয়।
মাদারার ঘোস্ট

সামনের প্রান্তে যে কোডটি চালাতে হবে সে সম্পর্কে কী হবে, উদাহরণস্বরূপ, ভারী গ্রাফিক্স প্রসেসিংয়ের কাজগুলি যা আমরা অন্যান্য জিনিসগুলি করার সময় শেষ করতে চাই?
মাইকেল

ভাল, আপনি ওয়ার্কার্স, পরিষেবা কর্মী তৈরি করতে এবং ডেটা-url ব্যবহার করে ক্যানভাস এপিআই ব্যবহার করতে পারেন। new Worker('data:text/javascript,(' + function myWorkerCode () { /*...*/ } + '()')। আপনার আমদানি এক্সপ্রেশন সমর্থন আছে কিনা তা যাচাই করার একটি দুর্দান্ত উপায়:try { eval('import("data:text/javascript,void 0")') } catch (e) { /* no support! */ }
ফ্যাবিও স্যান্টোস

9

একটি খালি শব্দ বাজানো ব্রাউজারটিকে কর্মক্ষমতা ধরে রাখতে বাধ্য করে - আমি এই মন্তব্যটি পড়ে এটি আবিষ্কার করেছি: ট্যাব সক্রিয় না থাকা অবস্থায়ও কীভাবে Chrome এ জাভাস্ক্রিপ্ট চালানো যায়?

ওয়েবসকেটগুলি ব্যবহার করে এমন একটি ব্রাউজার গেমের জন্য আমাদের অন-দাবী অনিয়ম প্রয়োজন need

এখানে, 2 খালি অডিও লুপ আমি এই কাজের জন্য নির্মিত, আপনি তাদের অবাধে ব্যবহার করতে পারেন বাণিজ্যিকভাবে: http://adventure.land/sounds/loops/empty_loop_for_js_performance.ogg http://adventure.land/sounds/loops/empty_loop_for_js_performance.wav

(এগুলিতে -58 ডিবি গোলমাল রয়েছে, -60 ডিবি কাজ করে না)

আমি তাদের হাউলিআরজেএস-এর সাথে, চাহিদা অনুসারে খেলি: https://github.com/goldfire/howler.js

function performance_trick()
{
    if(sounds.empty) return sounds.empty.play();
    sounds.empty = new Howl({
        src: ['/sounds/loops/empty_loop_for_js_performance.ogg','/sounds/loops/empty_loop_for_js_performance.wav'],
        volume:0.5,
        autoplay: true, loop: true,
    });
}

এটি দুঃখজনক যে ডিফল্টরূপে পুরো জাভাস্ক্রিপ্টের পারফরম্যান্স চালু / বন্ধ করার জন্য কোনও অন্তর্নির্মিত পদ্ধতি নেই, তবুও, ক্রিপ্টো মাইনাররা কোনও প্রম্পট ছাড়াই ওয়েব ওয়ার্কার্স ব্যবহার করে আপনার সমস্ত কম্পিউটিং থ্রেড হাইজ্যাক করতে পারে: |


আপনাকে ধন্যবাদ, 58 ডিবি হেডফোনগুলির সাথে খুব শ্রবণযোগ্য তবে সাইটটি নিঃশব্দ করা সমস্যার সমাধান করে
কান সোরাল

1

আমি ওয়ার্কার- ইন্টারভাল এনপিএম প্যাকেজ প্রকাশ করেছি যা ক্রোম, ফায়ারফক্স এবং আইআই এর জন্য নিষ্ক্রিয় ট্যাবগুলিকে চালিত রাখতে এবং চালিয়ে যাওয়ার জন্য ওয়েব-কর্মীদের ব্যবহার করে আন্তঃকালীন এবং ক্লিয়ারইন্টারভাল বাস্তবায়ন সেট করে।

নিষ্ক্রিয় ট্যাবগুলিতে আধুনিক ব্রাউজারগুলির বেশিরভাগ (ক্রোম, ফায়ারফক্স এবং আইই), অন্তরগুলি (উইন্ডো টাইমারস) সেকেন্ডে একবারে সেকেন্ডে একবারে বেশি চাপানো হয়।

আপনি আরও তথ্য পেতে পারেন

https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Timeouts_and_intervals


0

আমি আমার jQuery কোরটি 1.9.1 এ আপডেট করেছি এবং এটি নিষ্ক্রিয় ট্যাবগুলিতে অন্তর্বর্তী তাত্পর্যকে সমাধান করেছে। আমি এটি প্রথমে চেষ্টা করব, তারপরে অন্যান্য কোড ওভাররাইড বিকল্পগুলিতে সন্ধান করব।


আপনি কোন সংস্করণ থেকে আপগ্রেড করেছেন? আমি কিছু সময়সীমা সমস্যা (গ্যালারী স্লাইডার) সংস্করণ সহ
experienced

0

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

<script>

var nowMillisTimeout = [];
var timeout = [];
var nowMillisInterval = [];
var interval = [];

function getCurrentMillis(){
    var d = new Date();
    var now = d.getHours()+""+d.getMinutes()+""+d.getSeconds()+""+d.getMilliseconds();
    return now;
}

function setAccurateTimeout(callbackfunction, millis, id=0){
    nowMillisTimeout[id] = getCurrentMillis();
    timeout[id] = setInterval(function(){ var now = getCurrentMillis(); if(now >= (+nowMillisTimeout[id] + +millis)){callbackfunction.call(); clearInterval(timeout[id]);} }, 10);
}

function setAccurateInterval(callbackfunction, millis, id=0){
    nowMillisInterval[id] = getCurrentMillis();
    interval[id] = setInterval(function(){ var now = getCurrentMillis(); if(now >= (+nowMillisInterval[id] + +millis)){callbackfunction.call(); nowMillisInterval[id] = getCurrentMillis();} }, 10);
}

//usage
setAccurateTimeout(function(){ console.log('test timeout'); }, 1000, 1);

setAccurateInterval(function(){ console.log('test interval'); }, 1000, 1);

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