2017-03-01 1 views
0

Ich erstelle eine Fotoanwendung, die alle x-Sekunden neue Fotos (online) zeigt. Aber die Anwendung stürzt nach einiger Zeit in zufälligen Momenten ab. Erstellt eine Testanwendung (Hinweis: hässlich/schmutzig und nicht optimierten Code), um die Abstürze zu reproduzieren, siehe Code unten.Elm_image zufällige Abstürze

#include <Elementary.h> 
// gcc -g main.c -o main `pkg-config --cflags --libs elementary` 

// @url https://www.enlightenment.org/docs/efl/start 
Evas_Object *win; 
int curIndex = 0; 
int numposters = 1022; 
int showXImages = 4; 
int showYImages = 2; 
int widthImage = 200; 
int heightImage = 300; 
int padding = 20; 
Evas_Object* curImages[8] = {NULL}; // showXImages * showYImages 

static void getImage(Evas_Object *win) { 
    int x, y; 
    for (y=0; y<showYImages; ++y) { 
     for (x=0; x<showXImages; ++x) { 
      // Destroy previous one 
      int index = y*showXImages + x; 
      if (curImages[index] != NULL) { 
       evas_object_del(curImages[index]); 
       curImages[index] = NULL; 
      } 

      // Create new image url 
      char result[1024] = ""; 
      sprintf(result, "http://unsplash.it/200/300?image=%d", curIndex + index); 

      // Add new image 
      Evas_Object* img = elm_image_add(win); 
      elm_image_file_set(img, result, NULL); 
      evas_object_move(img, x * (widthImage + padding), y * (heightImage + padding)); 
      evas_object_resize(img, widthImage, heightImage); 
      evas_object_show(img); 

      // Set image 
      curImages[index] = img; 
     } 
    } 
} 

Eina_Bool sCheckCallback(void *data) { 
    // Increase index 
    curIndex = curIndex + (showYImages*showXImages); 
    curIndex = curIndex % numposters; 

    // Get and set new images 
    getImage(win); 

    return ECORE_CALLBACK_RENEW; 
} 

EAPI_MAIN int elm_main(int argc, char **argv) { 
    // Create window 
    elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); 
    win = elm_win_util_standard_add("Main", "Hello, World!"); 
    elm_win_autodel_set(win, EINA_TRUE); 
    evas_object_resize(win, 1280, 720); 
    evas_object_show(win); 

    // Add callback 
    Ecore_Timer* timer = ecore_timer_add(1.0f, sCheckCallback, NULL); 

    elm_run(); 

    return 0; 
} 
ELM_MAIN() 

Um zu überprüfen, ob es ich aktualisiert, um auch EFL-1.19.0-Beta2 aber die Abstürze sind immer noch vorhanden nicht nur in EFL 17.1 war. Siehe auch 1, 2, 3 für einige Screenshots des StackTrace.

Antwort

0

Es sieht ein bisschen aus wie Speicher wird durchgesickert. Mein erster Gedanke wäre, das elm_image-Grid beim Laden der Anwendung einzurichten - dann können Sie einfach das elm_image_file_set aufrufen, das weitaus effizienter ist, als die Widgets zu zerstören und neu zu erstellen.

Ich änderte das hier und die App schien viel länger zu laufen ...

Verwandte Themen