2010-11-21 8 views
0

Ortalama google masaüstü gadget'ınızı alın. ,Bir google masaüstü gadget'ının, temel kod meşgul/engellenirken UI'sini (kullanıcı girdisini ele al) güncellemesi nasıl sağlanır?

debug.trace("go!"); 
for (var i = 0; i < 100000000; i++) { // google desktop stops responding 
     j = 12 * i; 
} 
debug.trace("finished"); 

Tüm google masaüstü gadget kod çalışırken gadget dahil süresince/dondurma kilitlemek (normal çift vardiya kısayolu çalışmıyor şunları yapabilirsiniz: Aşağıdaki kodu ekleyin herhangi bir aracı hareket ettirmeyin veya başka herhangi bir yolla etkileşimde bulunun; systray simgesi yanıt veriyor, ancak hiçbir şey yapmıyor - örneğin kod bitene kadar seçenekler sayfası yüklenmiyor).

Bu genel durumun bir yolunu arıyorum (durumum geri dönmek için uzun zaman alan bir DLL üzerinden harici işlev çağrıları yapıyorum, bkz. gmanifest 'install' öğesi).

SetInterval/setTimeout ile tetiklenen çağrıları (/ kod üstü) herhangi bir fark yaratmıyor gibi görünmüyor ve normalde bir zamanlayıcı tarafından çağrılan herhangi bir kod uzun çağrı yapılırken yürütülmez. '

var wsh = new ActiveXObject("WScript.Shell"); 
wsh.run("cmd.exe",1,true); // true = block until program has exited 
// UI responds in this period 
debug.trace("finished"); // occurs when cmd.exe is closed 

ı don: Bunu tahmin ediyorum

meşgul döngü yerine aşağıdaki kodu deneyin ya benim harici işlev çağrısı engellerken, çünkü hiçbir şey kilitleniyor mümkündür Bu üç durum arasındaki farkın ne olduğunu bilmek. Herhangi bir fikir, ve daha da önemlisi, onun etrafında herhangi bir şekilde?

Düşünceler: hayır, engelliyorsa: meşgul döngü gibi engelleme, ama sadece bu yüzden hiçbir şey dolayısıyla olmuyor her işlemci zamanını kullanmıyor

  • (zor görünüyor) [değiştir temsilcisi değildir ]

  • DLL veya yolu ben bozuk veya hatalı kullanıyorum, sırasıyla (gerekirse ben daha fazla ayrıntı ekleyebilirsiniz, olabilir) [değiştir: sadece normal engelleme çağrısı]

  • , değil gibi görünüyor google gadgets "wipript.shell ve carrie" hakkında bilgi sahibi "koşarken" devam ederken engelleniyor (olası görünmüyor) [değiştir: yanıtlanmamış!]

  • Engelleme kodu için bir çalışan iş parçacığı açıkça üretebilirim (gadget'larda açık iş parçacığı denetiminde hiçbir şey bulamıyorum) [ düzenleme: mümkün değil; JavaScript tek bir iş parçacığı vardır]

cevap

0

JavaScript bir çağrı yığını iplik yürütme tam olarak bir sahiptir (cevaba bakınız) harici bir program blok çağrısı, durum güncellemeleri için anket dosyasını paketle. Bu iş parçacığını park edemez, çağrı yığınını kaydedemez ve daha sonra devam ettirebilirsiniz.

Nesneye duyarlı kalmanın yolu, yürütme hazır olduğunda geri arama aldığınızdan emin olmanızdır. Genel bir kural olarak, hiçbir zaman ipliği çalmayın ve bir şeyler olmasını bekleyin.

Bu nedenle AJAX'te (eşzamansız) bir A var - senkronize XmlHttpRequest yapabilmenize rağmen, genellikle kötü bir fikir olarak kabul edilir.

+0

Teşekkürler; kullanıyorum DLL bir geri arama yok ve DLL üzerinde herhangi bir denetiminiz yoksa? Ben DLL ayrı bir programda çağırıyor sarma mı arıyorsunuz? Ayrıca bu açıklama, yukarıda yazdığım wscript çalıştırma örneğiyle nasıl uyuşuyor? Geriye dönük bir çağrı yok, senkronize görünüyor ve gadget'ın kullanıcı arayüzü ve diğer widget'lar çalışmaya devam ediyor. – Michael

+0

DLL veya WScript.Shell'de uzman değilim, ancak komutu bir kabuk betiğine koydum, belki de sonucu kaydetmek için bir dosya kullanıyorum. Bir şey gibi: 'launch.bat' - engelleme komutunu başlatır ve çıktıyı bir dosyaya yönlendirir. 'poll.bat' - dosyayı çıktı için kontrol eder ve varsa geri verir. Sonra javascript içinde bir setTimeout() 'yapıp, her bir 500 msn'de 'poll.bat' komutunu çalıştırıyorum ve kullanıcıya olan ilerlemeyi gösteririm. Yoğun bir bekleyiş. –

+0

Teşekkürler, başka hiçbir fikir olmadan ben bununla gideceğim (ancak poll.bat ana programda javascript olabilir). Wscript.shell'in diğer tüm engelleme çağrılarını farklı kılan ne olduğunu bilmek isterim. – Michael

İlgili konular