VB6(SP3)でWindows200での並列処理方法を教えてください

このQ&Aのポイント
  • VB6(SP3)でWindows200で並列処理を行いたい場合、以下の手順を実行します。
  • 1. 親フォームのボタンをクリックしてデータのロード処理を開始します。
  • 2. ロード処理の進行状況を子画面で表示します。
回答を見る
  • ベストアンサー

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

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は、一応モーダルで起動したいです。 ご教授よろい敷くお願いします。

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

  • ベストアンサー
  • sorarisp
  • ベストアンサー率58% (7/12)
回答No.1

はじめまして、n-sakamotoさん。 ご存知の通り、モーダルで表示しますと、そのフォームが終了するまで処理は中断されてしまいます。 ですが、Form2の役割はDB書き込みの状況を表示するだけのように思えます。 この場合、Form2の必要な条件は常に最前面に表示(Form1の後ろに隠れない)する事ではないでしょうか。 それでしたら、Form2をモードレスで表示し、APIを使って常に最前面み表示するようにしたらどうでしょうか。 SetWindowPos で最前面に表示する事がきたと思います。 ご期待に添えるか分かりませんが。

n-sakamoto
質問者

お礼

ありがとうございます。 問題は解決しました。 おかげで進捗も進みます。

関連するQ&A

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

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

  • 標準モジュールからフォームをコントロールしたい

    こんにちは。 標準モジュールからフォームのリストボックスに文字を追加したいんですが、うまくいきません。 まず、button1をクリックすると、共通モジュールのサブルーチンを呼び出します。そして引数"0"を渡すと、Form1のListBox1に"hello"を追加したいのです。 実行させると、エラーはでないのですが、追加されるはずの"hello"がListBox1に追加されません。 たぶん     frm1.ListBox1.Items.Add("hello") あるいは    Dim frm1 As New Form1() あたりの宣言の仕方がまずいのだと思うんですが... どなたか、ご教授よろしくお願いします。 ■共通モジュール Module Module1 Dim frm1 As New Form1() Sub PC(ByVal PCrecieve As String) If PCrecieve = "0" Then frm1.ListBox1.Items.Add("hello") End If End Sub End Module ■フォーム Public Class Form1 Inherits System.Windows.Forms.Form Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Call PC("0") End Sub End Class

  • フォームのアクティブと非アクティブ表示について

    Form1からForm2を表示するという処理を以下のようにコーディングしてみました。 **Form1.frm*** Private Sub Command1_Click() Form1.Hide Form1.vbModal Form1.Show End Sub **Form2.frm*** Private Sub Command1_Click() Unlaod Me End Sub 画面にエクスプローラ等のウィンドウが表示されているときに、Form2を表示させようとすると非アクティブ状態で表示されてしまいます。 また、Form2をUnloadするとForm1が表示されるのですが、その際に、Form1のタイトルと、タスクバーに表示されているボタンが反転した後非アクティブ状態になってしまいます。 フォームは常にアクティブで表示させたいのですが、どうすればよいのでしょうか?

  • Formオブジェクトについて

    Formオブジェクトに関する質問です。 ある関数にフォームオブジェクトを引数として渡してやりたいのですが、何かよい方法はありますでしょうか? 例) Private Sub cmdTest_Click(Index as Integer) Dim frm as Form If Index = 0 then Load_Test(Form 2) Else Load_Test(Form 3) End if End Sub Private Sub Load_Test(frm as Form) frm.Show frm.Label1.Caption = "TEST” End Sub

  • コマンドボタン名を取得して変数に代入したい。

    OS:windowsXp Access Version:Xp 既出でしたらすみません。 INDEXのフォームにて複数コマンドボタンを作り、それを押すと各登録フォームや集計フォームが開くようにしています。 さて、質問なのですが、コマンドボタンで別のフォームを開く時の処理を(フォーム名が違うだけで後は同じなので)まとめて書きたいのです。 現在は次のようにやっています。 ------------------------------------------------- Private Sub F_メニュー_Click() Call close_form DoCmd.OpenForm "F_メニュー", acNormal, , , acFormEdit, acWindowNormal End Sub Private Sub F_売上伝票_Click() Call close_form DoCmd.OpenForm "F_売上伝票", acNormal, , , acFormEdit, acWindowNormal End Sub      (中略) Private Sub 事業所別集計_Click() Call close_form DoCmd.OpenForm "F_事業所別集計", acNormal, , , acFormEdit, acWindowNormal End Sub Private Sub 消費税変更_Click() Call close_form DoCmd.OpenForm "F_消費税変更", acNormal, , , acFormEdit, acWindowNormal End Sub Private Sub システム終了_Click() Call close_form DoCmd.RunCommand acCmdExit End Sub Private Sub close_form() msgbx = False DoCmd.Close acForm, "index", acSaveYes End Sub ------------------------------------------------- これを  ボタン名_Click() ではなく  frm_open() 押されたボタン名を変数に取得(ボタン名=Form名にします。) DoCmd.OpenForm 押されたボタン名変数 のように共有したいのです。 どうすれば出来ますでしょうか?ご指導よろしくお願いします。

  • 別スレッド上の変数を参照する方法について

    VB2010で、別スレッドの変数をメインフォームが閉じられた時に 表示するプログラムを書いたのですが、変数の中身が空になってしまいます。 色々試してみたのですが、うまく値を参照できません。 別スレッド上の値をどうやったら参照できるのでしょうか? 以下のような感じで記述したのですが、何か特別な書き方があるのでしょうか? わかりにくい質問ですが、ご回答おねがいします。m(_ _)m 簡単なイメージを書きました。 http://www.progoo.com/rental/img_bbs1/img_data/18133_730_30ba642aac.jpg 'メインフォーム Public Class Form1  '★変数testをpublicで宣言   Public test As String=""  '★ロードしたらBackgroundWorker1を動かす   Private Sub Form1_Load() Handles MyBase.Load     BackgroundWorker1.RunWorkerAsync()   End Sub  '★BackgroundWorker1はModule1.test()を動かしてtestに"成功"の文字列を入れる   Private Sub BackgroundWorker1_DoWork() Handles BackgroundWorker1.DoWork     Module1.test()   End Sub  '★フォームを閉じた時に変数testを表示する   Private Sub Form1_closing() Handles MyBase.FormClosing     MsgBox(test)   End Sub End Class '別モジュール Module Module1   Public Sub test()     Form1.test = "成功"   End Sub End Module

  • Access2013 VBA 複数の画面の遷移

    複数の画面のメニューの遷移をスル場合、みなさんは、フォーム名をベタ書きで書いてらっしゃるのでしょうか。それとも、遷移元のフォームの名前を取得して戻るボタンをおした時に、そのフォームをVisible = trueにしたりしているのでしょうか。 私の場合には、ModuleにPublicで宣言した各フォームの階層事の変数に遷移元の名称の場合にだけ、そのフォームの名前を変数に保存して、戻るボタンでそのフォームを表示する処理をしています。 Private Sub Form_Load module.Public変数 = module.Public遷移元の画面名 End Sub Private Sub Cmd戻るボタン Forms(module.Public遷移元の画面名).visible = true DoCmd.Close acForm, Me.Name End Sub しかし、この画面の階層毎に変数をつくり、それに遷移元の画面名をセットするのも面倒くさいやり方で、これよりも何か楽な汎用性のあるやり方はありますでしょうか? よろしくお願いします。

  • 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分以上長い処理に付き合いきれないので処理を中断して待ち行列の最後につなぎたい)。

  • フォームを開く時のイベント処理

    Visual Basic 6.0 あるフォーム読込時イベント[Private Sub Form_Load()]で コマンドボタンにフォーカスを移動しようとしたら、エラーしてしましました。 Private Sub Form_Load() CommandButton.SetFocus ’プロシージャの呼び出し、または引数が不正です End Sub Form_Open や BeforeUpdate ? 開いた後にフォーカスをセット出来る イベント処理は無いでしょうか? ご教授願います。

  • アクセスフォームのサイズの調整について

    一つは全画面表示(Maximize)で開きもう一つは普通の表示(Restore)で開くには? フォーム1とフォーム2があります。画像をご覧ください。 フォーム1は Private Sub Form_Load() DoCmd.Maximize End Sub で、 フォーム2は Private Sub Form_Load() DoCmd.Restore End Sub としてます。 フォーム1にコマンドボタンを設置して、 Private Sub フォーム2を開く_Click() DoCmd.OpenForm "フォーム2" End Sub として、フォーム2を開くのですが、 フォーム2が開くとフォーム1まで、元の大きさに戻ってしまいます。 行いたいことは、 フォーム1は全画面表示、フォーム2は、ノーマルな表示(全画面でも最小化でもない) にしたいのですが、不可能なのでしょうか?

専門家に質問してみよう