前回のつづき。Gtk::Entry
でEnterキー押下したときファイル書込したかった。
しかし、表題の件で失敗した。
デバッガでの実行時エラー。
exeでの実行時エラー。
入手先
開発環境
- Windows XP Pro SP3 32bit
- VC++ 2010 Express
ライブラリ
症状
fstreamのclose()
時に実行時エラー(アクセス違反)が発生してアプリが強制終了してしまう。
原因
マルチスレッドなGTKフレームワーク上でスレッドセーフではないクラスを使ったからエラーになったと思われる。
試行パターン
GitHubで公開しているコードは以下のパターンである。
Gtk::Entry::on_activate()
時にfstreamを生成→書込→closeする
ほかにも、以下のパターンを試した。 GitHubで公開したコードではコメントアウトしてある。
- Gtk::Window継承クラスのメンバ変数にfstreamをもたせる
- fstream::close()を
Gtk::Window::on_delete_event
時に実行する - fstream::close()を
Gtk::Window::~Window
時に実行する
- fstream::close()を
いずれも実行時エラー(アクセス違反)になった。
コード
MyWindow.h
MyWindow.cpp
対策
- C言語のFILE*を使ってみる
- GTKのgioを使ってみる
- Boostライブラリを使ってみる
fstreamが使えなくとも何とかなると思いたい。 ひとつずつ試してみるしかないか。
Boostは導入が面倒そう。 もしvectorクラスなどほかのSTLも全滅なら試してみる価値はあるかも。
所感
せっかくgtk+からgtkmmにしてC++が使えるようになったのに、fstreamが使えない…。 たぶんgiommで解決できるはずだからC++でできるのだろうけど。
もし他のSTLも使えなかったら残念すぎる。 代用のライブラリがgtkmmに全部あれば楽だけど。
またしても調査が大変な予感。 たかがファイル入出力に、一体いくつものやり方があるのやら。 自力で原因を突き止めて、対処方法をしらべて、環境を用意して、試してみる。 この過程が大変。
環境次第で使えないSTLこと"標準"テンプレートライブラリ。標準とは一体…。 ほかにやり方があるのだろうか。 C#なら一発で解決できるに違いない。
ひとつずつやるしかないか。