過去の桐井戸端BBS (桐ver.9)
19098 イベントで遅延コマンドの代用としてタイマーを使ったのだけどあまりスマートでない 良平 2003/02/25-16:07
複数端末で同時に表を更新する処理をしています。

遅延コマンドはイベントで使えないので、過去の書き込みで話題になったタイマーで1秒で閉じる遅延フォームを作成し、
表が開けたら、以降の処理を行い、開けなかったらフォーム呼び出しで遅延フォームを開いて、
1秒で閉じて5回繰り返すような処理を作りました。
(悲しげさん、ONnojiさん、他の投稿を参考にしました)

遅延フォームは見えないように(小さくして)開いていますが
遅延フォームが開いた時 元のフォームが非アクティブになり
閉じたら、またアクティブになってなにか見苦しい感じです。
(ピコッ、ピコッ...て感じです)

フォームを使わずに表が開けるまでループしたら
CPU使用率が100%で止まってしまいました。

もっと、スマートな感じで
一括処理で遅延を使うようにイベントで同様にできないものか
考えておりますが、良いアイディアがあったらご紹介ください。

--- 一括処理記入例 ----
loop
&繰り返し数=&繰り返し数+1
if(&繰り返し数>5)
確認 "ファイルが開けません"
break
else
if(#ファイル使用(&TBL,2)=1)
表 &TBL,表番号=1,モード=専有

.... 処理....

break
else
遅延 10
end
end
end

--- イベント記入例 ----
loop
&繰り返し数=&繰り返し数+1
if(&繰り返し数>5)
確認 "ファイルが開けません"
break
else
if(#ファイル使用(&TBL,2)=1)
表 &TBL,表番号=1,モード=専有

.... 処理....

break
else
フォーム呼び出し "遅延.wfm"
end
end
end

注)遅延フォームは1秒経ったら自分で閉じます。(タイマーイベント)
19099 Re:イベントで遅延コマンドの代用 通りすがり 2003/02/25-18:17
記事番号19098へのコメント
>複数端末で同時に表を更新する処理をしています。
>表 &TBL,表番号=1,モード=専有

解決編ではないけど、素直に表を「共有」させられないのでしょうか?
共有すれば、いちいち表が開けるかどうかなんて調べなくても良いし。

5回ループが抜けて「開けません!」って出るけど、表の更新って(この表に対する作業)5秒+αで終わるくらいなんでしょうか?
クライアントの表を開く時間をいれても、8秒?
4回目で開けたとして、その間4秒+α待たされてはクライアントもイライラしますよね。

素直に共有にして表を開くか、最初のトライで「開けなかった」場合には、
クライアントが再度手動でトライさせた方が精神衛生上良いのではないかと・・・・。

根本的な解決にはなっていませんが・・・・。
19100 Re:イベントで遅延コマンドの代用 良平 2003/02/25-19:33
記事番号19099へのコメント
通りすがりさん

>解決編ではないけど、素直に表を「共有」させられないのでしょうか?
>共有すれば、いちいち表が開けるかどうかなんて調べなくても良いし。
>
コメントありがとうございます。

処理のところを省略しましたが,書き出しとか併合とかをやるんです。
確か、共有だとできなかったと思います。

少し詳しくご説明しますと、クライアントで作業表を1行編集したら
サーバーの実表に追加書き出しや修正の場合は併合をしています。
共有は制限が多かったり処理スピードの問題で採用しておりません。
大きい表を共有更新で何人かで編集た時、カーソル移動でさえ遅くなって
使用に耐えないことがありました。

専有でもファイルが大きいと開いて併合などすると2,3秒かかりますので
その間待っているようにしています。

イベントではタイマーが遅延の代わりだと思いますが、使い方がイマイチです。
19101 Re:タイマイベントの意味 通りすがり 2003/02/25-20:03
記事番号19100へのコメント
>処理のところを省略しましたが,書き出しとか併合とかをやるんです。
>確か、共有だとできなかったと思います。

事情があるんですね。仕方ないか。
まあ、この作業は、訂正自体をいれても、少なくとも10秒以上かかると思いますので、
開けなかったら素直に諦める方が無難かと思うんですが?


>イベントではタイマーが遅延の代わりだと思いますが

ちょっとニュアンスが違うと思います。
「遅延」としても使えるかも? であって、本来の使い方は一定時間ごとに生ずるイベントです。

別の解決方法というわけではないですが、思いつくままに・・・・。

フォームのある場所に「システムメッセージ欄」を作り、そこに「&メッセージ」なんて変数を設定しておきます。

それこそ、「編集」用のコマンドボタンなどでこれらの「表を専有で開くイベント」を実行する際に、
タイマイベントをONにします。このコマンドボタンでは、
下記のカウンタ値をリセットし、タイマイベントをONにするだけです。

さて、
タイマイベントでは(時間間隔を1秒として)
表を開く作業をさせます。
この時、メッセージ欄には「○回目のりトライだよ〜ん。誰かが使ってるから、
ちょっと待ってね」なんて常時表示させて起きます。もちろん、カウンタ値をセットします。
カウンタをイベント内にもって(固有で宣言しておけばいい)、
5回リトライしたら「あきらめましょう」なんてメッセージボックを開かせます。
その時に、タイマイベントをOFFにします。

めでたく表を開けたら、タイマイベントをOFFにして「イベントの終了」。


まあ、確かにタイマイベントが発生中は他の操作も行えますが、
ループをかませるよりもCPUに対する負担は少ないと思います。
見かけ上、手動で「表」を開く操作を1秒おきに5回繰り返したのと同じ効果だと思いますので。
ループで強制的に待たせるのも良いですが、クライアントにメッセージを読ませている間に
桐自体が「何もせず」に時間を稼ぐ!

・・・・が? どうでしょうか?

クライアントを待たせる・・・・は「イライラ」のもとだと思いますけど。

意味が伝わりますかどうか・・・・。

19102 Re:タイマイベントの意味 通りすがり 2003/02/25-20:06
記事番号19101へのコメント
表をめでたく開けても、その開く動作に1秒以上かかれば???
マシンの性能とかによっても変わってきますよね。
1秒ではなく、1.5秒とか2秒とか・・・・が適当?

19103 Re:タイマイベントの意味 良平 2003/02/25-20:19
記事番号19101へのコメント
通りすがりさん
>意味が伝わりますかどうか・・・・。
>
タイマーイベントの中で表を開くわけですね....
今日は時間がなくなってしまいましたので明日チャレンジしてみます。
また結果をご報告します。

ありがとうございました。
19104 Re:タイマイベントの意味 良平 2003/02/25-20:35
記事番号19103へのコメント
テスト的に作ってみたらできました。
思っていた結果が得られました。
あとは実際の流れの中に組み込んでみてご報告します。

19106 Re:タイマイベントの意味 通りすがり 2003/02/25-22:15
記事番号19104へのコメント
今後の資産として、イベントも報告願いますね。

19108 Re:タイマイベントの開始時期 通りすがり 2003/02/26-00:32
記事番号19106へのコメント
今まで気が付かなかったけど、
 オブジェクト操作 @フォーム.タイマー値1 = "2" /* 2秒間隔 */
 オブジェクト操作 @フォーム.タイマー1 = "1"
でタイマイベントを有効にしたとき、最初のタイマイベントは有効直後でなく、
有効にしてからインタバル後(上記なら2秒後)に最初が発生するんだ!!
今までこんなに長いインタバルを取ったことなかったから気がつかなかった。(^^ゞ

であれば、コマンドボタンで「一度表を開く」アクションを起こし、
失敗したらタイマイベントでリトライ・・・・がいいと思います。
全て、タイマイベントから開こうとすれば、このイベント発生までのタイムラグが生じますね。

19109 Re:タイマイベントの開始時期 hidetake 2003/02/26-01:37
記事番号19108へのコメント
>全て、タイマイベントから開こうとすれば、このイベント発生までのタイムラグが
>生じますね。

何かの後に,最初のタイマーイベントを即座に(最初の秒数待たずに)
実行したい場合は,フォーム::タイマー1() を call してはいかがでしょう?

オブジェクト操作 @フォーム.タイマー値1 = "2" /* 2秒間隔 */
オブジェクト操作 @フォーム.タイマー1 = "1"
call フォーム::タイマー1()

と言うように?


あと,ちょっと外れるけどボタンからイベントを手続き実行したい場合は

機能名:手続き実行
機能パラメータリスト:"フォーム::タイマー1"

で,イベントを呼び出せます。ただ,イベントの引数が配列変数を使っている場合は,
コマンドボタンから呼び出す方法はできないようです。

19110 Re:タイマイベントの開始時期 通りすがり 2003/02/26-10:58
記事番号19109へのコメント
>オブジェクト操作 @フォーム.タイマー値1 = "2" /* 2秒間隔 */
>オブジェクト操作 @フォーム.タイマー1 = "1"
>call フォーム::タイマー1()
>と言うように?

な〜るほどね。これですっきりしますね。
さすがhidetakeさんです!(^^ゞ

19113 Re:タイマイベントの開始時期 良平 2003/02/26-13:12
記事番号19110へのコメント
皆さんありがとうございます。

19114 Re:タイマイベントの開始時期 良平 2003/02/26-13:14
記事番号19113へのコメント
今、出先なので明日報告します。
いろいろ勉強になります。
今回は、目から鱗が2枚ほど落ちました。


戻る