2014-04-29 232 views
2

我想獲得某種持久性與emscripten工作...Emscripten和持久性

我試圖做(作爲一個概念證明)是每一個頁面被擊中時的時間添加到文件的末尾

目前似乎每次創建該文件的運行...

這裏的代碼的相關位

EM_ASM(
    FS.mkdir('/IDBFS'); 
    FS.mount(IDBFS, {}, '/IDBFS'); 
    FS.syncfs(true, function (err) { 
     assert(!err); 
    }); // sync FROM backing store 
); 

int c; 
FILE *file; 
file = fopen("/IDBFS/test.txt", "a"); 

if (file) { 
    time_t rawtime; 
    struct tm * timeinfo; 

    time (&rawtime); 
    timeinfo = localtime (&rawtime); 
    fprintf (file, "time:%s\n", asctime (timeinfo)); 

    fclose(file); 

    EM_ASM(  
     FS.syncfs(function (err) { // sync TO backing store 
      assert(!err); 
     }); 
    ); 

    file = fopen("/IDBFS/test.txt", "r"); 
    while ((c = getc(file)) != EOF) 
     printf("%c",c); 
    fclose(file); 
} 
+0

作爲一個完整性檢查,我刪除了所有emscripten特定的東西,並作爲本地應用程序運行。它的行爲如我所料 - 每次運行都會將時間添加到文件中,並且不會重新創建文件 –

回答

2

這裏的問題似乎是那syncfs是一個異步操作,但你把它當作同步處理。

您必須等到syncfs的回調被觸發(從後備存儲進行同步時)才能打開並從文件讀取。

作爲一個例子,參見:https://github.com/kripken/emscripten/blob/master/tests/fs/test_idbfs_sync.c

它使用ccall()一旦回調完成後調用成C函數。此外,請注意使用emscripten_exit_with_live_runtime即使在main已返回時仍可使程序保持活動狀態。

+0

感謝您抽出寶貴時間幫助我更好地理解這一點 - 我相當確信(我相信我可以使其工作)現在。 - 我確實參考了你在編碼時提出的示例,但ccall的重要性和原因也許可以在代碼中做出評論! –