連休なのに更新ができないままです。
しかたがない、Comipoli Gjs 版で行き詰まっているままですので。
何故こんなに遅いのかまだ解明できていない。
とりあえず他の部分だけでも仕上げておくか。
とやっていたらヒント?かもしれないことを発見。
g_idle_add でバックグラウンド動作ができない場合があった。
その部分だけ抜き出ししてサンプルコード。
PATH 定数は手持ちな巨大サイズの CBZ ファイルに書き換えてね。
const Lang = imports.lang;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const GdkPixbuf = imports.gi.GdkPixbuf;
const PATH = "/home/sasakima-nao/doc/comic/bigfile.cbz";
const SIZE = 120;
const NewArchive = new Lang.Class({
Name: 'NewArchive',
_init: function(path) {
this.namelist = [];
this.path = path;
let l = path.split('.');
let ext = l[l.length-1].toLowerCase();
//
if (ext == "cbz") {
let sp = Gio.Subprocess.new(["unzip", "-Z", path], Gio.SubprocessFlags.STDOUT_PIPE);
let istream = sp.get_stdout_pipe();
let dstream = new Gio.DataInputStream({
base_stream: istream
});
for (;;) {
let [line, len] = dstream.read_line_utf8(null);
if (line == null) break;
if (line.startsWith('-')) {
let name = line.slice(53);
if (GLib.Regex.match_simple("\.(jpe?g|png|gif)$", name, GLib.RegexCompileFlags.CASELESS, 0)) {
this.namelist.push(name);
}
}
}
this.namelist.sort();
}
},
get_item: function(num) {
let sp = Gio.Subprocess.new(["unzip", "-p", this.path, this.namelist[num]], Gio.SubprocessFlags.STDOUT_PIPE);
let stream = sp.get_stdout_pipe();
try {
var pixbuf = GdkPixbuf.Pixbuf.new_from_stream(stream, null);
}
catch(e) {
print(this.namelist[num]);
print(e);
}
stream.close(null);
return pixbuf;
},
get_length: function() {
return this.namelist.length;
}
});
const ThumbnailWindow = new Lang.Class({
Name: 'ThumbnailDialog',
Extends: Gtk.Window,
_init: function() {
this.parent();
this.archive = new NewArchive(PATH);
this.fbox = new Gtk.FlowBox({
valign: Gtk.Align.START,
max_children_per_line: 10,
homogeneous: true,
selection_mode: Gtk.SelectionMode.BROWSE
});
let scroll = new Gtk.ScrolledWindow();
scroll.add(this.fbox);
this.add(scroll);
this.resize(1024, 480);
this.show_all();
// idle
this.gen_func = this.read_zipfile();
//
// not G_PRIORITY_DEFAULT or G_PRIORITY_HIGH_IDLE
//
//GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
GLib.idle_add(GLib.PRIORITY_LOW, Lang.bind(this, function() {
try {
this.gen_func.next();
return true;
} catch(e) {
return false;
}
}));
},
read_zipfile: function() {
let l = this.archive.get_length();
for (let i=0; i<l; i++) {
let pixbuf = this.archive.get_item(i);
this.append_data(pixbuf, i);
yield 1;
}
},
append_data: function(pixbuf, num) {
if (pixbuf.get_width() > pixbuf.get_height()) {
var pix_w = SIZE;
var pix_h = Math.round(SIZE * pixbuf.get_height() / pixbuf.get_width());
} else {
var pix_w = Math.round(SIZE * pixbuf.get_width() / pixbuf.get_height());
var pix_h = SIZE;
}
let minp = pixbuf.scale_simple(pix_w, pix_h, GdkPixbuf.InterpType.TILES);
let image = new Gtk.Image({
pixbuf: minp,
visible: true
});
this.fbox.add(image);
},
vfunc_hide: function() {
Gtk.main_quit();
}
});
Gtk.init(null);
new ThumbnailWindow();
Gtk.main();
抜き出したのに長い…
最初は何も考えずに G_PRIORITY_DEFAULT 指定。
すると for 文で回した時のように全部展開されるまで表示されない。
これじゃ g_idle_add の意味が無い。
バックグラウンド動作させるための関数に何故こんな機能を付けたのだ?
てか、原因がコレだと解るのに一日使ったってばさ。
ということで、皆さん DEFAULT という定数名は疑ったほうがいいかも。
もしかして遅い原因もコレ関係かと探しているけど見当たらない。
this.read_zipfile = function(){}
みたく指定していたのを上記で書き換えたら少し早くなった、気がする…
明日から筆者は仕事だ!
そんなこんなで連休では完成できませんでした。

苗ちゃんフルマカロンまであと一つ、炭酸はギリギリ足りそうだ。
元浜公園に行ったらポケストップが無くなっていてしょんぼり。
いや、息抜きですよ。