V.B.6 多重Call用スプール作成等について

このQ&Aのポイント
  • V.B.6 多重Call用スプール作成などについての資源の取り扱いに関するヘルプファイルの内容を知りたい
  • 複数のタイマー割り込みが存在する場合に、各割り込みルーチンから共通のライブラリ Eesasa を使用する方法について悩んでいます
  • Eesasa の処理中に別の割り込みが起こった場合、後から発生した割り込みが Eesasa を参照する問題について解決策を知りたい
回答を見る
  • ベストアンサー

V.B.6 多重Call用スプール作成等について。

複数のタイマー割り込み(A,B,C,...)が存在する時 各割り込みルーチンから共通のライブラリ Eesasa を使用する場合 Visual Basic 6.0 SP5 内部ルーチンにおける資源の取り扱いに関する ヘルプファイルの内容を読みたいのですが、検索語がわかりません。 対応するヘルプファイル名又は適切なシソーラスをお教えください。 想定するルーチンは以下のとおりです。 ファイル a.frm, b.frm, c.frm,... Private Sub Form_load Timer1.Enabled=True end sub Private Sub Timer1_Timer() IF (適当な条件) then call Eesasa end sub ファイル EesasaSub.Bas sub Eesasa  (適当な処理) end sub A.frm,...と EesasaSUB.bas は同一プロジェクトに属します。 Eesasa の処理中に別の割り込みがかかった場合後から発生した割り込みがEesasaを参照することについて Eesasa 内で待ちループをかけるか Eesasa の入り口ではじき各Frmファイル内で待ちループをかけるか Eesasa とは別名の短時間処理ルーチンを作成しフラグを返す。各Frmファイル内で待ちループをかけるか Eesasa 処理中のフラグを EsasaSub.bas 内にもてるか レジストリ等外部資源に保存する必要があるか 別タスクにして EEsasa.exe を起動する(http://oshiete1.goo.ne.jp/kotaeru.php3?q=727770等)必要があるか。 ユーザー側が上記のような資源の占有・解放を宣言し待ちルーチンを作成するか Visual Basic 6.0 SP5 が  資源関係を意識しないで済むような処理になっているか  専用の資源占有開放命令を持っているか がわからないのです。 Eesasa の処理終了まで割り込みを禁止する方法は使えません。 Eesasa の処理に1回あたり短いもので1-3秒・長いもので3-8時間かかります。 しかも中断処理が存在します(10分以上長い処理に付き合いきれないので処理を中断して待ち行列の最後につなぎたい)。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

質問の中にある「sub Eesasa」の実行中に、タイマー等の要因により再度「sub Eesasa」が呼び出されるようなことがあるかどうか、あるとすればどのような条件か、回避するための仕組みがVB6に備わっているかどうか、備わっているとすればドキュメンテーションがどこにあるのか、をお尋ねと理解しました。(間違っている場合にはご指摘ください。) まず「sub Eesasa」への再入の可能性ですが、「sub Eesasa」の中でDoEventsを実行すると発生します。逆に言えば、DoEventsを実行しなければ再入の可能性はありません。 DoEventsを実行すると、その時点でアプリケーションのイベント処理が行われる可能性が生じます。このイベント処理(タイマーイベントもその中の1つです)によって「sub Eesasa」が呼び出されると再入が起きることになります。 このような再入を回避したい場合、そのための専用の仕組みや自動的に再入を回避する仕組みはVB6に備わっていませんので、自前で再入を回避するコードを作成する必要があります。

aramananto
質問者

補足

ご回答の内容の理解に時間がかかりました。 優先度の最も低い待ちタスクとして「sub Eesasa」を考えています。すべての割り込みが発生しないときに「sub Eesasa」を実行したい(割り込みが発生した時点で無条件に処理を中断する)のですがそれらしき内容がみつかりません。 >回避するコードを作成する する場合に「sub Eesasa」の実行状態を保存するフラグをどこに保存するか.このフラグの参照ルーチンをどこに保存するか.共通化できるかできないか。 実行中の変数をどこに保存するか.「Call Eesasa」の実行により破壊される変数があるか. sub Eesasa if (現在処理中のフラグが立っている) then exit sub (適当な処理) end sub Sub tekito 'このルーチンを「sub Eesasa」と同じ*.basに保存するか.a.frm,...に保存するか if not (現在処理中のフラグが立っている) then call Eesasa end sub フラグをグローバル変数として保存するか. 各局所ファイル(*.bas)に保存するか. iniファイルやレジストリのような外部ファイルに保存するか どの時点で宣言された変数が初期化されるかがよくわからないのです。*.frm ですといろいろ書いてあるのですが*.basに関しての記載が見つかりません。

その他の回答 (1)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

問題とされている点とVB6との関係が分かりづらいので、VB6で使用されている言葉を使って説明していただけると、またそうでない用語は解説していただけると助かります。 例えば、質問や補足の中で「割り込み」という用語を何度かお使いですが、VB6には「割り込み」と呼ばれるような機能がありませんので、実際のプログラムでは何を使って実現している機能で、どういう問題を感じていらっしゃるのかが、曖昧にしか分かりません。 他のプログラミング言語やプログラム実行環境で一般に「割り込み」と呼ばれる機能に近いものは、VB6では「イベント」と呼びます。 一般的な「割り込み」とVB6の「イベント」の大きな違いは、「割り込み」ではプログラムの実行が自動的に中断されて「割り込み」ルーチンが実行されるのに対して、VB6の「イベント」は自動的に中断されることがない点です。 なお、イベントに関しては   Visual Basicドキュメント     →プログラミング ガイド       →Visual Basicの基本         →プログラミングの基礎           →Visual Basicアプリケーションの構造 以下に記述があります。 また変数の有効期間に関する記述は   Visual Basicドキュメント     →プログラミング ガイド       →Visual Basicの基本         →プログラミングの基礎           →変数、定数、およびデータ型 以下に記述があるようです。

aramananto
質問者

お礼

おかげさまで複数処理機構の仮想同時処理が作成できました。 >VB6で使用されている言葉を使って説明 これができれば自分でHELPメッセージから必要な内容を見つけられるのですが現時点でできません。 >そうでない用語は解説して JIS X001-X0706の内容に準じています(教材コンピュータのマニュアルの内容)がいかがなものでしょうか。 >中断されることがない点です。 ご説明いただきVBの大体の雰囲気がつかめてきました。この方法は事象の発生後特権命令を使用してスプールに登録し割り込みが終了・ユーザーからスプールの実行を指示することで特権命令使うことなくユーザーが各事象に対応した擬似マルチタクスを実行できるシングルタクスプログラムの方法です。学生時代この処理を作成して電算機の先生方に罵倒された思い出がある方法です。マイクロソフトではVB発売当初「新しい方法」と宣伝していましたが少なくとも5年以上前に研究者は各種問題を熟知していたようです。 変数については Visual Basicドキュメント  Visual Basicの使用方法   プログラミング ガイド    Visual Basicの基本     プログラミングの基礎      変数、定数、およびデータ型       静的変数 にそれらしき記載がありました。

関連するQ&A

  • VB6で開発中…標準モジュール間での関数の呼び出し方は?

    Form1.frm内から、標準関数yyy.bas内に記述しているSub yyy()を呼び出したいのですが、コンパイルエラーとなります。 呼び出し方法が間違っているのだと思いますが、お教え下さいませ。 <Form1.frm内> Private Sub xxxxxx()  yyy End Sub <yyy.bas> Sub yyy()  ・・・・ End Sub

  • 並列処理させる方法を教えてください。

    VB6(SP3) OS:Windows200で並列処理させる方法を教えてください。 以下の並列処理を別画面で行いたいのですが、どうしたらよいでしょうか? 並列処理の内容 1.DBへデータのロード(親フォームのボタンで実行) 2.1の処理状況(ログ)を子画面で表示(親フォームのボタンが押されたら、子 フォームとして起動する) ログを表示する画面は、共通部品として使用したいため、 ログの出力を直に書きたくありません。 以下は、当然、動かないんですけど、動かしたいイメージです。 Fom1.frm、Module1.bas、Form2.frmは、同じプロジェクトに 存在します。 =============Form1.frm============= Private Sub Command1_Cpralick() call DataLoad() end sub Public Sub InsertData() Form2.LogOut("XX件目を書き込んでいます。") '・・・データをインサートする処理 end sub =============Module1.bas============= private sub DataLoad() Call Form2.Show(vbModal, Form1) '※1 'DB書込み Call Form1.InsertData() '書込み結果 Form2.LogOut("成功しました。") Form2.hide end sub =============Form2.frm=============== Public Sub LogOut(LogMsg As String) Form2.lbl_Log.Caption = LogMsg End Sub Module1.basの中の※1で処理がForm2に移ってしまい、 Module1.basの※1以下の処理が当然実行されません。 また、前述しました通り、Form2.frmは使いまわししたいので、 Form2.frmにはこれ以上コードを書きたくありません。 Form2は、一応モーダルで起動したいです。 ご教授よろい敷くお願いします。

  • タイマーがうまく動かない

    VB6.0(SP5)で、バッチファイルを実行後、5秒待つようにしたいのですが、うまく動きません。 Dim ping_count As Long Private Sub Command1_Click() Shell ("executeping.bat") Timer1.Interval = 1000 Timer1.Enabled = True Do Text1.Text = "ただいま実行中" Timer1_Timer Loop Until ping_count = 5 Text1.Text = "終了" Timer1.Enabled = False End Sub Private Sub Timer1_Timer() ping_count = ping_count + 1 Text1.Text = "ただいま実行中" End Sub デバックで動かすと、ちゃんとループを5回繰り返してテキストボックスに「終了」と表示するのですが、実行するといきなり「終了」を表示してしまいます。 ループの中のTimer1_Timerをコメントにすると、デバックでは延々ループを続け、実行するとフリーズしてしまいます。 そもそもタイマーの使い方が間違っているのでしょうか? 教えてください。よろしくお願いします。

  • Timer_Tickについて

    Timerイベントについてですが、Interval = 1 に設定し、例えば下記のようなプログラムを動かした場合、 /*-------------------------------------------*/ Private Sub Form_Load(~~)~~     Timer1.Start()     Original() '自作プロシージャ End Sub Private Sub Timer1_Tick(~~)~~     num += 1 'Publicで宣言してある     if num > 100 then Timer1.Stop() End Sub /*-------------------------------------------*/ Original()の処理に移るのは、numが100より大きくなってTimer1がStopしてからでしょうか? それとも、Timer1が動いている最中に、移ってるのでしょうか?

  • VB6でスロットを作成したい

    VB6歴2ヶ月の初心者です。 フォーム上に ラベルコントロールが三つ コマンドボタンが二つ タイマーコントロールが一つ あります。 タイマーのプロパティは Enabled False Interval 10 です。 スロットを作成したいのですが、 ボタン1を一回押すごとに左からスロットが回り、 最後にボタン2で動きを止めたいのです。 一応自分でも書いてみたのですが、ここで行き詰まりました。 ウワァァァァァァヽ(`Д´)ノァァァァァァン! Private Sub Command1_Click() Timer1.Enabled = True End Sub Private Sub Command2_Click() Timer1.Enabled = False End Sub Private Sub Timer1_Timer() Dim slot As Integer slot = Int(Rnd(1) * 9 + 1) Label1.Caption = slot End Sub 思い通りに動かすにはどんなコードにしたらいいですか?

  • Tickイベントについての質問

    1秒間のループ回数を得るために下記のようなコードを記述したのですが、Tickイベントが発生せずループから抜けません。以前はVB6(Timer1_Timerイベント)を使用していたのですが、何の問題もなく使用出来ていました。誰か分る方、ご教授下さい。もちろんInterval=1000です。 '1sec間に繰り返されるループ回数 Private mlng1SecTimeCount As Long '1sec経過フラグ Private msht1SecFlg As Short '(省略) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ディレイタイム設定 DELAY_TIME_SETTING() End Sub Private Sub DELAY_TIME_SETTING() 'ディレイタイム設定 '解説:1sec間に実行されるループ回数の算出。 'ループ回数格納用変数 Dim lngLoopCount As Long 'タイマー1起動 Timer1.Enabled = True Do Until msht1SecFlg = 1 lngLoopCount += 1 Loop 'タイマー1停止 Timer1.Enabled = False 'データ保存 mlng1SecTimeCount = lngLoopCount End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick '解説:1sec経過後にインクリメント。 'インクリメント msht1SecFlg += 1 End Sub 以上よろしくお願い致します。

  • タイマーの使い方

    VB初心者です(6.0を使っています) タイマーの使い方がよく分かっていません。 ボタンを押してからの経過時間をラベルに表示させたいと思っているのですが、 ----------------------------------------------- Private Sub Command1_Click()   Timer1.Interval = 1000   処理1   処理2    ・    ・    ・   Timer1.Interval = 0 End Sub Private Sub Timer1_Timer()   Label1.Caption = [経過時間] End Sub ----------------------------------------------- という感じに書いていると、[処理1]~をしている間はラベルが表示されなくて、 最後の[処理]が終わった直後の[経過時間]のみが表示されます。 こういう形ではタイマーは使用できないのでしょうか? 他のWebサイトなども調べてみたのですが、解決できませんでした。 どなたか教えていただけませんでしょうか?

  • AVRマイコンの割り込みについて

    AVRマイコンの割り込みについて 初心者です。 ・AVRマイコンの割り込みの優先順位ですが、割込みベクターのアドレスが小さい順に優先度が高いでよろしいでしょうか? ・優先低の割り込みルーチンを処理している時に、優先高の割り込みが入った場合、  (1)優先低の割り込みルーチン処理中断→優先高の割り込みルーチンの処理、完了→優先低の割り込みルーチン処理再開(中断ヶ所から)  (2)優先低の割り込みルーチン処理、完了→優先高の割り込みルーチンの処理、完了  (3)その他 (1)、(2)、(3)のどの処理が行われますか? ・優先高の割り込みルーチンを処理している時に、優先高の割り込みを禁止し、ルーチン内で優先低の割り込みが入った場合、優先高の割り込みルーチンから優先低の割り込みルーチンにとばすことは可能でしょうか? 以上、よろしくお願い致します。

  • VB タイマーコントロールをインデックスを使用し130個作成しました。

    VB タイマーコントロールをインデックスを使用し130個作成しました。 タイマーイベントの表記はどのようにするのでしょうか。 Private Sub Timer(0)_Timer()  ~ End Sub とするとエラーになります。タイマーコントロールのインデックスの使い方が分かりません。よろしくお願いします。

  • マクロでフォーム処理の繰り返し

    よろしくお願いします。 マクロでフォームを作成したとき同じような処理がたくさんある時、繰り返し処理は可能でしょうか? 例えば以下のような処理をループ処理できないでしょうか? Private Sub Label1_Click() Label1.BackColor = RGB(255, 0, 0) End Sub Private Sub Label2_Click() Label2.BackColor = RGB(255, 0, 0) End Sub Private Sub Label3_Click() Label3.BackColor = RGB(255, 0, 0) End Sub   ・   ・   ・ Private Sub Label100_Click() Label100.BackColor = RGB(255, 0, 0) End Sub

専門家に質問してみよう