コンテンツにスキップ

前回残った Office の確認(起動時)

扱うこと: 起動時に、前回のインデックス作成が起動したまま残った Office を確認して終了する流れ・対象の選び方・出すタイミング・記録の置き方。扱わないこと: インデックス作成の実行そのもの(インデックス作成の実行)。先に読むページ: 画面。

インデックス作成を中断したときなどに、tebunko が起動した Excel・Word・PowerPoint が画面の無いまま残ることがある。これを、画面の起動時に 1 回だけ確認し、利用者が選んだときだけ終了する。専用のタブや常時の一覧は持たない。

止めてよいものの条件

プロセスの名前だけでは、利用者が開いている Office と見分けられない。そのため、インデックス作成が起動したときに PID の記録を書き(記録)、記録のあるものだけを対象にする。次の 4 つをすべて満たしたものを「残り物」とする。

条件 見るもの
記録がある この PC の鍵の記録(office_pids\<PC の鍵>\<PID>.txt)。ほかの PC の鍵のフォルダは読まない
記録と今のプロセスが同じ PID のプロセスの名前(EXCEL / WINWORD / POWERPNT)と起動時刻が記録と同じ。起動時刻が読めないものは同じとみなさない
窓を持たない MainWindowHandle が 0
起動した側がもう動いていない 記録に書いた「持ち主」(起動した画面・インデックス作成のプロセス)が、今の画面ではなく、ほかにも生きていない(PID が無い、または起動時刻が違う)

利用者が自分で開いた Office には記録が無いため、一覧にも出ず、止める対象にならない。

出すタイミング

起動時の読み込み(loadStartupData)の終わりに、記録の読み取りを画面の裏の仕事(startJob)で行い、結果が分かったら次の表で出すかを決める。上から見て最初に当てはまったものにする(getLeftoverPromptTiming)。

順 状況 結果
1 残り物が 0 件 出さない
2 ウィンドウを閉じている途中 出さない
3 インデックス作成中(そのインデックス作成の Office を止めないため) 出さない
4 起動時のお知らせがまだ閉じていない 閉じたあとに、もう一度この表で決める
5 ほかのダイアログが開いている 出さない
6 上のどれでもない 出す

出さなかったときは何も止めず、記録も消さない。次の起動でもう一度確認する。

確認ダイアログ

確認ダイアログ(確認ダイアログ)で聞く。文言は判断層の getLeftoverPrompt が返す。

部品 内容
タイトル Office の終了
見出し 前回の更新で起動した Office が N 件、残ったまま動いています。終了しますか?(数え方は「件」)
説明(✓) 編集中のファイルは閉じません(終了するのは、tebunko がバックグラウンドで起動した Excel 2 件・Word 1 件だけです。0 件のアプリは出さない)
説明(✓) 保存していない作業が失われることはありません(残っているのは、更新のために起動したものです)
一覧 アプリ・PID・起動した時刻
補足 [今回は終了しない]を選んだときは、次に起動したときにもう一度お聞きします。(ボタンの真上に置く。本文の下に離して置かない)
ボタン [今回は終了しない](既定の取り消し)・[終了する](主ボタン。赤にしない)

終了と結果

[終了する]を選ぶと、確認を出した時点の PID のうち、今も残り物であるものだけを読み直して選び(getLeftoverTargets)、stopOfficeProcesses で終了する。確認の後に増えた残り物は、確認していないため止めない。

stopOfficeProcesses は、止める直前に PID が今も同じプロセスか(名前・起動時刻)をもう一度照らし直す。

結果 内容
止めた Stop-Process -Force で終了し、記録を消す
もう無い 止めず、記録を消す。止めた件数にも理由にも入れない
別のプロセスに変わった 名前か起動時刻が違う・今の起動時刻が読めない。止めない
失敗 理由を返す。記録は残す

結果はステータスに出す(getLeftoverResultText)。

状況 表示
すべて止めた Office を 3 件終了しました。
一部が変わっていた Office を 2 件終了しました。PID 9316 は確認の後に別のプロセスに変わったため、終了しませんでした。(複数なら PID 9316・9320 は…)
1 件も止めず、変わったものがある 件数の文を出さず、PID 9316 は確認の後に別のプロセスに変わったため、終了しませんでした。 だけ
失敗があった 末尾に PID <N> を終了できませんでした:<理由>
何も止めず、言うことも無い ステータスは変えない
裏の仕事そのものが失敗した(起動時の確認・[終了する]のあと) getLeftoverFailureText。Office を終了できませんでした(<理由の 1 行目>)。残った Office は、次に tebunko を起動したときにもう一度確認できます。(確認の失敗は 前回残った Office を確認できませんでした(<理由>)。)

記録

インデックス作成が Office を 1 つ起動し、新しいプロセスがちょうど 1 つ増えたと確かめられたときに、記録を 1 つ書く(shared/office/office_app.ps1 の getApp)。

項目 内容
置き場所 <ワークスペース>\office_pids\<PC の鍵>\<PID>.txt(getOfficePidDir)。共有のワークスペースで、ほかの PC の PID と混ざらないよう PC ごとに分ける
中身 1 行・タブ区切り: プロセス名・起動時刻(UTC の Ticks)・持ち主の PID・持ち主の起動時刻(UTC の Ticks)
書き方 <PID>.tmp に書いてから <PID>.txt に名前を変える(書きかけを読ませない)
書かないとき 起動時刻が読めない・利用者の Office に接続した(新しいプロセスが増えない)・プロセスが複数増えた(どれが自分のか分からない)・置き場所が決まっていない。書けなくても更新は続け、その Office は止める対象にならない
消すとき 終了を確かめたとき(stopApp)。終わらなかったときは残す。利用者がファイルを開いていて止めなかったときは、利用者に渡したものとして消す
読むとき PID のプロセスが無い・名前が違う・読めた起動時刻が違う記録は消す。起動時刻が読めないものは残し、止める対象にしない。形の違う記録は使わず、消さない。1 時間より古い .tmp は消す

記録は、ワークスペースの中だけに書く(書き込み・削除する場所)。画面のスレッドでは読まない。

実装

部品 場所
記録の書き込み・読み込み・一覧・終了 scripts/shared/office/office_process.ps1(addOfficeRecord・readOfficeRecords・getOfficeProcesses・stopOfficeProcesses)。プロセスの強制終了はここの 1 か所だけ
記録の書き込み・削除の呼び出し scripts/shared/office/office_app.ps1(getApp・stopApp)。置き場所は indexer_run.ps1 が getOfficePidDir で決めて渡す
文言・出すかどうか・対象の選び方 scripts/tebunko/ui/leftover_view.ps1(判断層。getLeftoverPrompt・getLeftoverResultText・getLeftoverPromptTiming・getLeftoverTargets・getLeftoverFailureText。詳細の時刻・開け閉めの文字・偽の行の変換もここ)
ダイアログと起動時の呼び出し scripts/tebunko/ui/leftover_dialog.ps1(画面層)・scripts/tebunko/xaml/dialog_leftover.xaml

画面の実装

画面側は scripts/tebunko/ui/leftover_dialog.ps1(画面層)と scripts/tebunko/xaml/dialog_leftover.xaml。

  • 起動時の読み込み(loadStartupData)の終わりに startLeftoverCheck を呼ぶ。読み取りは startJob で行い、結果を decideLeftoverPrompt に渡す。
  • 起動時のお知らせ(Add_Loaded で出すメッセージ)が開いている間は、お知らせの状態を getLeftoverPromptTiming に渡して「待つ」にし、閉じたあとに resumeLeftoverPrompt でもう一度決める。
  • ダイアログは showOwnedDialog で出す(.ShowDialog( は直接呼ばない)。既定の取り消しは[今回は終了しない]で、うっかり Enter で終了しない。
  • [終了する]のあと、確認に出した PID を読み直して選び(getLeftoverTargets)、stopOfficeProcesses で終了する。名前で探して終了することはしない。
  • 結果の文は、ステータスの欄に出す(setStatus。ステータス欄の枠は変えない)。

偽の行の継ぎ目(写真・画面のテスト用)

本物の Office を残さずに確認の画面を出せるよう、環境変数 TEBUNKO_GUI_LEFTOVER_FILE(JSON のファイル)を leftover_dialog.ps1 だけが読む。設定されているときは、記録の代わりにその JSON の行(Id・ProcessName・StartTime・StopStatus)を使い、終了も結果の文を作るだけでプロセスには触れない。設定されていなければ本物の動きになる(既定は本物)。tests/meta/leftover_seam.Tests.ps1 が、読むファイルが 1 つだけであること・プロセスを止める呼び出しが無いことを確かめる。

記録は共有のワークスペースにも置かれるため、置き場所がネットワークのときは、読み取りを専用の列(tebunko/core/workspace.ps1 の getWorkspaceJobQueue が network を返す)の仕事で行い、届かない共有で画面を止めない。