Türkiye Online Medya Araştırması

İçeriğin rss beslemesi kullanımda değil Soru - Cevap Bölümü / Kategori: Programlama

07/02/2010 - 06:59:17 cevap (11) Okunma : 516 Bu yazıyı 0 kişi tuttu.

as3 - MovieClipleri silmek (ama tamamen) (ACİL)

etiketler : as3 hafıza memory

arkadaşlar selam, adobe as3 de removeChild(mc) ile ekrandan silinen moviecliplerin ya da display objelerin aslında hafızadan silinmediğini flash'ın help'inde söylüyor. ancak tamamen silmek için ne yapılmasını gerektiğini ise söylemiyor :D

delete operatörü ile silmeye kalktığınızda hata alıyorsunuz, e silmezseniz üstüste biniyor hafıza doluyor ve sorun çıkarıyor.

bunu nasıl aşacaz arkadaşlar? unload yapıp, ardından removeChild() edip onun ardından da mc=null desek yeter mi? çözüm nedir?

adres frrat profilini göster
hakan kayhan 18.11.2009 12:48:46
En iyi cevap mı ?
Faydalı cevap

b_btn isimli bir buton m_mc isimli bir movie clip oluşturmamız gerekiyor. İlk frame e aşağıdaki kodları yazıyoruz. AS 2.0 dan tek farkı fscommand'ı import etmek zorundayız.





import flash.system.fscommand;

m_mc.addEventListener(MouseEvent.MOUSE_DOWN, kapatFNC);
b_btn.addEventListener(MouseEvent.MOUSE_DOWN, kapatFNC);

function kapatFNC(event:MouseEvent):void
{
fscommand("quit";
adres eerku profilini göster
Ercan ERKÜ 18.11.2009 22:36:49
En iyi cevap mı ?
Faydalı cevap

merhaba sanırım sorun yanlış anlaşıldı, ayrıntılı anlatayım:

Sorun şu:

Proje ürettiğim bir firmanın Csharp ile geliştirilmiş bir uygulaması var.

Uygulama sizin seçtiğiniz dosyaları sırası ile lcd ekranlarda yine sizin belirleyeceğiniz sürelerle gösterilmesini sağlıyor. Şöyleki

Bir avi reklam videosu var onu gösteriyor, bitince wmv video oynatıyor bitince bir flash swf gösteriyor Flashı da her 45 snde bir kapatıyor ve tekrar avi reklam videosunu oynatıyor. Bu döngü sonsuza kadar yani uygulama açık olduğu sürece devam ediyor. Tam bu noktada flash swf'i ben yapıyorum ancak flash'ı dışarıdan kendi flash player'ı ile çalıştırdığınızda hiçbir sorun yokken, bu CSHarp ile yazılmış uygulama içine koyduğunuzda belirsiz sürelerde donma yapıyor. Flash takılı kalıyor yani ta ki siz Csharp uygulamasını kapatıp açıncaya kadar. 45 sn sonra videolara geçiyor, ama tekrar swf'e geldiğinde yine takılı kalıyor. Ama bu hemen olmuyor, genelde 15-16 saat sonra oluyor. Bu nedenle bir memory leak sorunu mu var diye araştırma yaptım ancak flash player içindeyken istediğiniz kadar çalıştırın flash'ı herhangi bir ram kullanımında ya da cpu kullanımında artış olmuyor. Csharp içinden activex denetimleri ile flash gösteriliyor. 2 haftadır bu sorunla uğraşıyoruz, ancak halen çözmüş değiliz. Bu sorunu neden yapar?, nasıl çözeriz?

Benim çözüm önerim Csharpda flash'ın açılıp kapanma değilde visible = false edilmesi ile ekrandan alınması oldu. Ancak burda da şöyle bir sıkıntı var: flash visible=false iken dahi arkaplanda çalışmaya devam edecek. Bu istenmiyor çünkü flash'ın kendi içinde göstermesi gerekli olan içeriğin bir sıralaması var. Bu sıralama ile ekranda flash bazı şeyleri göstermek zorunda. Yani flash'ı visible=false ettikten sonra stop ile durdurup zamanı gelince yeniden play etmek lazım. Böyle bir şey mümkün mü? Tabii bu benim bulduğum çözüm?

İlginiz için tekrar teşekkürler,

adres enginco profilini göster
engin özer 20.11.2009 10:31:55
En iyi cevap mı ?
Faydalı cevap

Anladığım kadarıyla c#'tan bahsediyoruz.

Genelde sürekli açık bir objeyle çalışmak sorun yaratır, işletim sistemleri bile arada bir restart ister :)

10 saat sonra object'i kapatıp yeniden create etmeyi deneyebilirsiniz. Veya her seferinde yeniden:

C# içinden çağrılan object'ler managed kod ise Disposable patterni kullanarak objelerin kapatıldığında memory'den silinmesini ve GC ile memory'nin temizlenmesini sağlamış olursunuz. Unmanaged kod ile yazılmışsa (Allocation ve Deallocation) dile göre siz manuel olarak temizlemeniz gerekir. Artık null'a mı set edilir neyse...

bir image örneği vereyim:


Image img = new Image("path");
picturebox.image = img;
//...
//işleriniz bittiğinde:
img.dispose();

çok sayıda image dispose ettiyseniz, GC'yi beklemeden kendiniz çağırabilirsiniz (GC.Collect()).

Class yazmışsanız IDisposable'dan türeterek Destuctor'da dispose edebilirsiniz. Birçok yöntem mevcut. Sizin nasıl bir koda sahip olduğunuzu bilemediğim için şu anda söyleyebileceklerim bunlar...

adres flashtr profilini göster
Ahmet Yılmaz 20.11.2009 16:08:03
En iyi cevap mı ?

selam engin,

konuyu biraz daha detaylandırabilir misin?

adres enginco profilini göster
engin özer 21.11.2009 19:55:32
En iyi cevap mı ?

Hangi konuda detay istiyorsunuz? Ercan beyin konusuyla mı ilgili, GC mi, yoksa disposable pattern ile mi ilgili?

adres eerku profilini göster
Ercan ERKÜ 21.11.2009 22:37:47
En iyi cevap mı ?
Faydalı cevap

arkadaşlar selam, son olarak flash acaba gerçekte bir hata veriyor mu diye merak edip debugger ile baktım, 36 saat düzgün çalıştıktan sonra flash,


Error: Error #1502: A script has executed for longer than the default timeout period of 15 seconds.
    at flash.utils::Timer/tick()
Error: Error #1503: A script failed to exit after 30 seconds and was terminated.
    at fl.managers::FocusManager/removedHandler()
Error: Error #1502: A script has executed for longer than the default timeout period of 15 seconds.
    at KCekmeceBelediyesi_SonrakindenDevam_tweensiz_fla::MainTimeline/akisaGoreGit()
    at KCekmeceBelediyesi_SonrakindenDevam_tweensiz_fla::MainTimeline/akisaGoreGit()
    at KCekmeceBelediyesi_SonrakindenDevam_tweensiz_fla::MainTimeline/sonrakiAkisaGececekHaber()
    at flash.utils::Timer/_timerDispatch()
    at flash.utils::Timer/tick()

hatası verdi...bu ne anlama gelir? neden 36 saat sonra?

adres enginco profilini göster
engin özer 22.11.2009 23:47:37
En iyi cevap mı ?
Faydalı cevap

Aklıma 2 sebep geliyor:

1. script timeout kısa

2. error 1502'yi almadan önce aşağıdakini almışsınız:

Error #1503: .... at fl.managers::FocusManager/removedHandler()

removedHandler hata vermiş gibi...

1502 - A script has executed for longer than the default timeout period of 15 seconds.

A script executed after the timeout period. (The default timeout period is 15 seconds.) After this error occurs, the script can continue to execute for 15 seconds more, after which the script terminates and throws run-time error number 1503 (A script failed to exit after 30 seconds and was terminated.)

1503 - A script failed to exit after 30 seconds and was terminated.

The script was still executing after 30 seconds. Flash Player first throws run-time error number 1502 (A script has executed for longer than the default timeout period of 15 seconds.) if the script executed more than 15 seconds, which is the default timeout period. This error occurs 15 seconds after Error 1502 occurs.

Bir de eğer sürekli değişen bir veriyi okuyup kullanıyorsanız, bi yerlerden null veri girişi olduğunda anlamsız patlamalar olabilir bu tarz projelerde.

adres eerku profilini göster
Ercan ERKÜ 23.11.2009 11:07:43
En iyi cevap mı ?

merhaba,

removedHandler 'da nerde neden hata olmuş olabilir? yani removedHandler durduk yerde ne hatası verir?

adres enginco profilini göster
engin özer 23.11.2009 15:25:04
En iyi cevap mı ?

Durduk yere mi bilmem ama gayet güzel bir şekilde hata vermiş :)

Öncelikle belirtmeliyim ki, kodunuzu bilmediğim için tamamen varsayımlara dayalı fikir yürütüyorum.

removeHandler metodunun ne yaptığı önemli: Eğer ki bu removeHandler() metodu framework'un bir parçası ve siz yazmadıysanız o zaman methodun aldığı parametreleri ve nerde hataya düştüğünü debug etmeniz gerekir.

Siz yazdıysanız ve tahmin ettiğim işi yapmaya çalışıyorsa; olmayan bir handler'ı remove etmeye çalışıyor olabilirsiniz (veya ikinci defa) ve bu, hataya sebep olabilir.

Tahmin etmediğim bir şey varsa; misal, windows file sistemden aklıma gelen bir şey, açık bir dosyayı remove etmeye kalktıysa file system'den çok geç yanıt dönebilir. Ya da çok fazla file varsa ve folder'ın içindeki dosyaların listesini çekiyorsanız uzun süreli timeout olabilir ve 1502/1503'e sebep olabilir.

Bundan başka yavaş çalışan herşey timeout verebilir, diskiniz dolu olabilir, bozuk olabilir, çok fazla yazma işlemi yapıyorsa cevap süresi uzayabilir. Yani herşey memory ile ilgili olmak zorunda değil.

Klasörlerin belli limitleri var, uzun dosya isimleri kullanıyorsanız ve çok sayıda dosya barındırıyorsanız bir klasörde bu sıkıntı yaratabilir... Liste uzatılabilir.

Bir de yukarıdaki error'de gözüme birşey takıldı:


the default timeout period of 15 seconds.
    at KCekmeceBelediyesi_SonrakindenDevam_tweensiz_fla::MainTimeline/akisaGoreGit()
    at KCekmeceBelediyesi_SonrakindenDevam_tweensiz_fla::MainTimeline/akisaGoreGit()
    at 

MainTimeline/akisaGoreGit() metodu peş peşe iki defa çağrılmış gibi, burayı da bir kontrol edebilirsiniz...

adres eerku profilini göster
Ercan ERKÜ 24.11.2009 22:35:59
En iyi cevap mı ?
Faydalı cevap

Engin bey teşekkür ediyorum ilginiz için,

1) Kullandığım Tweenlite komutlarının tamamını sildim ve tamamını timeline animasyona dönüştürdüm.

2) Uygulama da birden fazla timer'ım var. Bunlardan biri ve en uzun sürede tekrar edeni tüm dosyaları yeniden yüklemesini (xmlleri) sağlayan bir timer. Diğerlerinden biri de belli zaman aralıklarında ekrandaki bir yeri değiştiriyor ama bu xmllerden alınan veriler ile...Tam da bu arada xmlleri değiştirirken bu ikinci timer stoplanmamış. Bu da tamamen değişik zaman aralıklarında xmller yüklenirken xmlden veri almaya çalışıyor timer bu sırada xmlde henüz boş iken hata veriyor tabii ki ve duruyor. Sanırım sorun bundan kaynaklandı. Peki neden 24 saat sonra ya da 36 saat sonra ya da 11 saat sonra diyecek olursak... Aslında burda da tam manasıyla bir matematik söz konusu :D ana timer ile diğer timer artık ne zaman çakışırsa o zaman sorun çıkarıyordu uygulama. xmlleri yükleme 0.5 sn sürüyor ve bu kadar zamanda varsa ikinci timer'ın süresinin bitmesine sorun çıkarmıyordu. ama yoksa çakışma oluyor ve sorun çıkarıyordu. (bütün bunlar aslında halen bir muamma daha testler devam ediyor.ama sanırım sebep bu...)

3) xmlleri yükleme esnasında sorun olursa diye bir başka fonksiyon yapıldı.

adres enginco profilini göster
engin özer 25.11.2009 20:55:28
En iyi cevap mı ?

Eskiden "Bozuk saat bile günde iki defa doğruyu gösterir" derlerdi, sizinki tam tersini yapıyor galiba; günde iki defa doğru saati bozuyor. :)

aç-kapa Bu Yazıyı Tutanlar

bu yazıyı tutan kimse yok.

aç-kapa İlşkili Sorular

yeni üyelik | şifremi unuttum

aç-kapa Konferans XII. Akademik Bilisim Konferansı

XII. Akademik Bilisim Konferansı

II. AB'10 XII. Akademik Bilisim Konferansı 10-12 Şubat Mugla Üniversitesi Üniversitelerde bilgi teknolojileri konusunda ilgili grupları biraraya ...
Kategori: Konferans

aç-kapa Yarışma 3. Uluslararası Ekslibris Yarışması: İstanbul 2010

3. Uluslararası Ekslibris Yarışması: İstanbul 2010

İstanbul Ekslibris Dernegi, Feyziye Mektepleri Vakfı ve Işık Üniversitesi, kitaplar için mülkiyet işareti olarak kabul edilen ve üzerinde estetik dege...
Kategori: Yarışma

aç-kapa Konferans Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Generally speaking, the term "New" brought about debates. We try to open up and elucidate the term "New" along with "Interact...
Kategori: Konferans

aç-kapa Konferans 3. Uluslararası Gelecek İçin Öğrenme Alanında Yenilikler Konferansı 2010: e-Öğrenme

3. Uluslararası Gelecek İçin Öğrenme Alanında Yenilikler Konferansı 2010: e-Öğrenme

Konferans ile ilgili ayrıntılı bilgiye aşağıdaki bağlantıdan ulaşabilirsiniz: http://www.futurelearning.org.tr/katilim_cagrisitr.pdf ...
Kategori: Konferans

üyeler Son Kahramanlar...

stats Kimler Burada? web stats

Son 1 dakika içinde MMIstanbul' da 64 (50 kayıtlı, 14 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:

srkndmrc ...

Blog Bölümü Blogevi.com'a Taşınıyor

Selam arkadaşlar MMIstanbul'da , tasarımcı ve programcıların blog yazılarını "feedleyerek" MMIstanbul okurlarını MMIstanbul dışın ...

7.500'üncü üyemiz Cem Koç!

Neler Yapılabilir?

500 Hatası Hakkında!

Reklam, MMIstanbul ve Yeni Projeler (Durumumuz Bu Tarzında)

coldfusion mysql ubuntu
 
sponsor adobe istanbul