一括表示

 浜田OM 久しぶりの質問です
別のプログラムでhdbを参照しているときに、時々インデクスファイルがないとのエラーが出て停止出来なく成ります。
極端な時ですが、別のプログラムで参照中にデータを削除処理すると同様のエラーが出ます。これは、後者の場合、インデックスを再構成中に別のプログラムがインデクスを使用しようとして、インデクスが無いのでこのエラーになるのだと思われます。前者の例ははっきりは分からないのですが、アクセスが衝突し、インデクスファイルにアクセス出来ず、結果として、このエラーを出していると考えています。何か対応方法はないでしょうか。単純には、誰かが使用中は、使えなくする ロック 方式が良いのでしょうが,何か対応策はないでしょうか。

2016/06/01(Wed) 20:10:23  [No.703]


> 別のプログラムでhdbを参照しているときに、時々インデクスファイルがないとのエラーが出て停止出来なく成ります。

自作のプログラムでhdbを参照しているときに、時々HAMLOGでインデクス
ファイルがないとのエラーが出て停止出来なく成ります。
・・・ということでしょうか?
具体的にどんなエラーでしょうか?
インデックスファイルがない、というエラーですか?


> 極端な時ですが、別のプログラムで参照中にデータを削除処理すると同様のエラーが出ます。

極端な時ですが、自作のプログラムでQSOデータを共有中にHAMLOGでデー
タを削除処理すると、自作のプログラムで同様のエラーが出ます。
・・・ということでしょうか?

HAMLOGでQSOデータを1件以上削除したときは、インデックスファイルを
削除してから生成してますので、そうなると思います。


> 何か対応方法はないでしょうか。単純には、誰かが使用中は、使えなくする ロック 方式が良いのでしょうが,何か対応策はないでしょうか。

共有を使わなければファイルはロックされてますので大丈夫です。

2016/06/02(Thu) 21:50:03  [No.704]


> 自作のプログラムでhdbを参照しているときに、時々HAMLOGでインデクス
> ファイルがないとのエラーが出て停止出来なく成ります。
> ・・・ということでしょうか?
その通りです

> 具体的にどんなエラーでしょうか?
> インデックスファイルがない、というエラーですか?
No.5ファイルがオープンできない
(c:Hamlog\Hamlog.dx0)

インデックス構築が出来ません

と出ます。連続で参照中にHamlogデータ入力などを行う時に発生していますので、Hamlogで新データでインデクスファイルを構築するとき、外部からアクセスして、インデクスファイルがないか矛盾があり、外部からのコールでも再構築しようとしてお互いにおかしくなるのだと思います。

>
> > 極端な時ですが、別のプログラムで参照中にデータを削除処理すると同様のエラーが出ます。
>
> 極端な時ですが、自作のプログラムでQSOデータを共有中にHAMLOGでデー
> タを削除処理すると、自作のプログラムで同様のエラーが出ます。
> ・・・ということでしょうか?
その通りです。

>
> HAMLOGでQSOデータを1件以上削除したときは、インデックスファイルを
> 削除してから生成してますので、そうなると思います。

と言う事は、インデックス再構築中は他からのアクセスを待たせる機能は持っていないのですね。
> 共有を使わなければファイルはロックされてますので大丈夫です。
当然ですね。

と言う事で、原因は理解できましたが、困ったな。共有可能と言っても、HDBへのアクセスが衝突した場合の処理はしてないと言う事ですよね。
「インデックス再構築中は他からのアクセスを待たせる機能」自体は、HDB操作開始時にフラグを上げ、終了時にフラグを下げるようにし、HDB操作はこのフラグが下がっているときのみ可能にすれば、対応出来るのでしょうが。これは私の所だけでは対処出来ないし、DLLをいじると、何が起きるか予測もつかないし(待ち時間の問題、デッド・ロックの問題 無いかもしれないが、あったら大変)。別バージョンをお願いしても常に2バージョンあるのも困るし。困ったな。何か良いアイデアありませんか。

2016/06/03(Fri) 08:12:19  [No.705]


HAMLOGW.EXEでは、QSOデータを書き込む瞬間の直前にHAMLOGW.share
という一時ファイルを作成してます。
これは、「データを登録してよろしいですか?」というMessageBox()
が表示されている間です。

HAMLOGW.shareが作成できなかったら、他のHAMLOGで共有して書き込み中
なので書き込みが終わるのを待ちます。

HAMLOGW.shareが作成できたら書き込み可能ということなので、.
HDB .DX0 .DX1ファイルを閉じ、再度オープンしてから書き込みます。

この、書き込む瞬間にいったんクローズし、再オープンしてから書き込む、
というのがミソではないかと思いますが。
DLL内の関数は、そこまで自動的にはやってません。

インデックス再構築中の時までは考えてませんでした。
はたしてそこまで必要かどうか。

2016/06/03(Fri) 22:37:16  [No.706]


> HAMLOGW.shareが作成できたら書き込み可能ということなので、.
> HDB .DX0 .DX1ファイルを閉じ、再度オープンしてから書き込みます。
>
> この、書き込む瞬間にいったんクローズし、再オープンしてから書き込む、
> というのがミソではないかと思いますが。
> DLL内の関数は、そこまで自動的にはやってません。
>
> インデックス再構築中の時までは考えてませんでした。
> はたしてそこまで必要かどうか。

普通の状態では、衝突する事はほとんど無かった様ですね。このエラーが出るとの相談も見たことなかった気がします。たまたま、数分置きに、10から15秒間Hamlogに検索アクセスをする処理(アクセスしっぱなしではないですが、多件数の内部処理をして検索して居るので長時間になる)をしてしまったので、衝突の確率が増えたのだと思います。私も最初は気がつかなかったのですが、検索条件件数を増やしたら、この現象(インデックスが開けないエラー)が多発するように成ってしまいました。現在、DLLやMST・HDBのみを別フォルダーにコピーして運用出来ないか、はたまた、2重HDBの逆側にアクセス出来ないか等思考錯誤してみていますが、解決策に至って居ません。出来ますれば、根本策が可能なら、お願い出来るとありがたいのですが。

2016/06/04(Sat) 05:56:07  [No.707]


古い投稿への遅いレスで済みません.

私も同様な問題に遭遇しました.
私の場合のとりあえずの解決策です.

1). Hamlog入力ウィンドウののCall欄を250msとか500msとか定期的に
監視して,文字列ありからなしに変化したかをチェックします.
同時に.hdbのタイムスタンプを取得します.
変化なしなら何もしないでまた定期的に待ち続ける.

2).変化した場合には,.hdbのタイムスタンプが変化するまで待ち続け,
タイムスタンプが変化したら,こちらのプログラムの本来の処理に移る.
タイミング的に,変わらない場合もある(最初のタイムスタンプの
取得時点で変化していた場合)ので,タイムアウトを設定しておきます.
実ファイルの更新タイミングは,システムに依存するようで,
私のPCの場合は,MAX20秒位でしたので,タイムアウト時間も20秒に
設定してあります.

とこんな感じです.

2016/08/06(Sat) 09:00:26  [No.714]