質問

自動保存機能を追加するために、Xournalのコードをハッキングしています。私の最初の実装は非常に愚かでした:60秒ごとに保存します。この機能は表面上機能します。

ただし、しばらく試してみたところ、自動保存を実行すると、アプリケーションが一時的にフリーズすることに気付きました。これを修正する方法を見つけようとしています。

私が考えた可能性の1つは、自動保存の前に、ペンが画面に触れているかどうかを自動保存することです。タッチされている場合は、ペンが持ち上げられてから1秒間だけのコールバックを1秒間だけ添付します。 (同じことが起こったら、繰り返します)。別の可能性は、ギャップが生じないように保存機能を十分に最適化することです(ありそうもないようです)。

これに関する提案はありますか? XournalはGnome / GTKツールキットを使用し、Cで記述されています。

更新:アンチクラバーロジックを実装しました。結果として得られる自動保存の粒度とパフォーマンスに非常に満足しています。スレッドの1つは(ありがたいことに)不要です!ご提案いただきありがとうございます。

役に立ちましたか?

解決

UIが目立った期間フリーズした場合は、おそらく別のスレッドが方法です。 UIのフリーズに気づいている唯一の理由が、その時点で書いていることが原因であり、中断が非常に短いだけである場合、メソッドは機能する可能性があります。あなたの修正はおそらく別のスレッドを作成するよりもずっと簡単なので、まずそれを試してください。

最終的にスレッドを使用する場合は、GTK +を使用しているため、pthreadではなくg_threadsを使用します。よりポータブルになります。

他のヒント

スレッドを使用することは「正しい」ことです。テキストボックスの答え、それは常にあなたが物事をしなければならない方法ではありません。注意を怠ると、マルチスレッドは多くの問題を引き起こす傾向があります。ここでの主な問題は、おそらく自動保存中にデータへのアクセスをロックすることです。次に、メインスレッドがデータにアクセスするために待機状態に入った場合、開始した場所に戻ります。そのため、保留中の変更などのキューを作成すると、何が起こっているのか追跡できなくなります。基礎となるデータ構造の複雑さによっては、コピーを作成するとメインスレッドがフリーズする可能性もあります。

とにかく要点は、最初のオプションを試すことです。それは迅速、簡単、そして要点であり、なぜそれが機能しないのかわかりません。

(注:Xournalの内部を見たことがないので、これを塩の粒で取ります。または塩入れ。または何か)

自動保存機能を別のスレッドにプッシュできますか? 2番目のスレッドで実行することにより、GUIと並行して保存を実行でき、フリーズウィンドウを回避できます。

cの経験はほとんどありませんが、このサイト助けることができます。

過去にも同様の状況がありましたが、ここでそれを解決しました(.Net):

  1. バックグラウンドタイマーはx秒間隔でティックします
  2. ティックで、タイマーを無効にし、適切なイベントを処理します。
  3. イベントハンドラーで、タイマーを保存して有効にします。

実際に発生した唯一の欠陥は、イベントハンドラーが呼び出される前に誰かがアプリを強制終了し、1分間の作業を失うことです。

これはどうですか?

コールバックアイデアを使用しますが、60秒ごとに加えて10入力ごとに実行します。時間ベースの自動保存では、失われるものの量がユーザーの作業速度に比例するという問題があります。

さらに先に進みたい場合は、完全な保存に加えて、変更のたびに部分的な取り消しログをディスクに保存します。そうすれば、クラッシュから起こりうる最悪の事態は最後の入力ストロークを失うことです。

変更イベントでN秒ごとにファイルの内容をハッシュアルゴリズムを介して比較するハイパーバイザースレッドを使用し、親スレッドに通知して自動保存機能をコールバックすることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top