Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


797 / 2272 ツリー ←次へ | 前へ→

【10021】処理方法について やすじ 07/11/26(月) 15:08 質問[未読]
【10022】Re:処理方法について VBWASURETA 07/11/28(水) 9:30 発言[未読]
【10025】Re:処理方法について やすじ 07/11/29(木) 11:58 発言[未読]
【10028】Re:処理方法について VBWASURETA 07/11/29(木) 16:12 発言[未読]
【10055】Re:処理方法について やすじ 07/12/5(水) 9:33 質問[未読]
【10058】Re:処理方法について VBWASURETA 07/12/5(水) 11:01 回答[未読]
【10063】Re:処理方法について VBWASURETA 07/12/6(木) 9:22 発言[未読]
【10064】Re:処理方法について やすじ 07/12/6(木) 11:05 お礼[未読]
【10068】Re:処理方法について VBWASURETA 07/12/6(木) 13:36 発言[未読]
【10073】Re:処理方法について やすじ 07/12/6(木) 15:28 発言[未読]

【10021】処理方法について
質問  やすじ  - 07/11/26(月) 15:08 -

引用なし
パスワード
   お世話になります。

今、外部から受け取ったデータ(DLLなど)を受け取っています。
そのデータをACCESSのフォーム内(常に表示)に配置したテキストボックスにデータが変化したら何もせずテキスト内のデータを同じように変化させたい。

今試してるのは、フォーム自体のイベント項目としてタイマーがあったのでそこにプログラム(DLLのプログラム)を突っ込んでいますが、表示に時差(タイマー分)が発生するのと、数値が0が入ってくることがあり正直見辛い状態になっています。
複数同じようなフォームを立ち上げているとさらに表示がひどい状態になりさらに見辛い状態になります。

上手い方法でリアルタイムに変化に合わせてテキストボックスの値も変化させる方法はないでしょうか?

良い案お持ちの方いらっしゃればお教えください。

【10022】Re:処理方法について
発言  VBWASURETA  - 07/11/28(水) 9:30 -

引用なし
パスワード
   ▼やすじ さん:

こんにちは。

後輩がAccessのタイマーイベントを使っての処理をしていましたが、
あまりよい結果ではありませんでした。

あまりどいう仕様かわかりませんが、長時間常駐型のプログラムでしょうか?
あまり負荷が大きい処理を常住で動かすと.net C#でもあるのですが、
複数スレッドを動かすイメージで、デッドロック状態となるようです。

不要な処理は止め、処理途中である場合は待機させる仕組みがいるのかも知れません。

【10025】Re:処理方法について
発言  やすじ  - 07/11/29(木) 11:58 -

引用なし
パスワード
   ▼VBWASURETA さん:

こんにちは。


>後輩がAccessのタイマーイベントを使っての処理をしていましたが、
>あまりよい結果ではありませんでした。

↑やはりそうですか・・・


>あまりどいう仕様かわかりませんが、長時間常駐型のプログラムでしょうか?

↑ある特定のフォームが立ち上がってる最中だけ動かすプログラムが作りたいです。


>あまり負荷が大きい処理を常住で動かすと.net C#でもあるのですが、

↑本音で言うと.net使えば融通が利くような気がするんですが、ソフトのメンテするのが大変そうなのと、自分以外理解できなくなりそうなので極力使いたくないです。


>複数スレッドを動かすイメージで、デッドロック状態となるようです。

↑デッドロック状態?ごめんなさい、勉強不足で分かりません^^;


投稿後もいろいろ試しては見たのですがやはり上手くいかなかったです。
プロシージャは今の自分のレベルだとまともに作れなさそうなのであまり試してはいません。
DLLプログラムは正常に動作しているのできっと上手いことプロシージャが組めればいけそうな気もするけど・・・アイデアが出ないっす

【10028】Re:処理方法について
発言  VBWASURETA  - 07/11/29(木) 16:12 -

引用なし
パスワード
   ▼やすじ さん:
こんにちは。

できればもう少し詳細を書いていただけるとわかり易いですが・・・。

例えば

フォームタイマーイベントを10秒単位で呼び、
form1のテキスト1にApi_Test(Me.hWnd, "テスト")の戻り値を入れる。
そのフォームのコードと同じようにフォーム2にもApi_Test(Me.hWnd, "テスト")
を呼ぶコードがあり、フォーム1とフォーム2を同時にロードさせると
フォーム2で0の戻り値で返ってくる場合があるとか
あればわかり易いと思いますよ。

【10055】Re:処理方法について
質問  やすじ  - 07/12/5(水) 9:33 -

引用なし
パスワード
   ▼VBWASURETA さん:
こんにちは

すみません。もう少し詳細に書きます。

フォーム1〜5があり、この五つは同時に起動するフォームです。
(5個のフォームが開くマクロを起動)
5つすべてがフォームタイマーイベントを設定しています。
設定は以下の通り
フォーム1:200ms (ミリ秒)
フォーム2:300ms
フォーム3:1000ms
フォーム4:500ms
フォーム5:400ms

といった具合です

各フォームのVBAは下記のように記入

Private Sub Form_Timer()

  Dim rData1 As Integer

  lErr = ReadDevice16("KML", "D10WORD", rData1, 1)
  ’↑簡易DLLのプログラム。データの読み込みを行っている。
  ’KMLは設定データの名前で、D10WORDはデータが入っている場所で、
  ’rData1は読み出したデータを格納する場所、最後の1はデータの数となっている

  text1 = rData1
  ’↑テキスト1に呼び出したデータを格納する

End Sub

というプログラムで動作しています。
他の部分も基本構造は一緒です。
(変数、データの場所、データ数、格納場所だけ変わります)

データのタイマー間隔をいろいろ調整してなるべく重ならないよう設定しました。
(実際はフォームの開くタイミングが微小にずれている為コンマ何秒の設定までなら表示が時間はかぶらない)

問題としては、データが変動しているときはフォームで表示しているデータがコマとび状態になる。
(タイマーの間隔でVBが走っているから当然といえば当然なんですが・・・)

このデータの変動がリアルタイムで追従し表示できるようなやり方があれば教えてください。
(タイマー設定値1msも試したんですが正しい数値を表示したり0を表示しっぱなしだったりすることがあったため)

【10058】Re:処理方法について
回答  VBWASURETA  - 07/12/5(水) 11:01 -

引用なし
パスワード
   ▼やすじ さん:
こんにちは。

あまり参考にならないかもしれませんが、

>  lErr = ReadDevice16("KML", "D10WORD", rData1, 1)

ですが、この処理を1本化(関数)にしてみては?
フォームのタイマーは表示させるだけにして、
必要なdllは一定に一括で取得するといったような感じではいかがでしょうか?

【10063】Re:処理方法について
発言  VBWASURETA  - 07/12/6(木) 9:22 -

引用なし
パスワード
   ▼やすじ さん:
こんにちは。

追記なのですが、同時起動してもdllの読み込むレスポンス差等で
重なる場合があります。

上記にも記載しましたが、1本化つまり、1フォーム内で一括に
dll値を取得して変数に格納する。
他のフォームは格納された変数から取得するようなイメージです。

この方法によりdll取得が重なることを考慮する必要はないはずです。
もしうまくいくようでしたら重なっているような気がします。

ご参考までに。

【10064】Re:処理方法について
お礼  やすじ  - 07/12/6(木) 11:05 -

引用なし
パスワード
   ▼VBWASURETA さん:
こんにちわ

>上記にも記載しましたが、1本化つまり、1フォーム内で一括に
>dll値を取得して変数に格納する。
>他のフォームは格納された変数から取得するようなイメージです。

↑実はこの方法は最初の段階で確認しました。
同じフォームで5つのデータを表示しようとすると表示が上手く入ってこなくなりすべて0が表示されるようになってしまいます。(ずっと)
(実際2個のデータを同一フォームで表示しても0になってしまう)

表示がタイマー時間で更新されるのでその時にちらつきが発生しますがとりあえず我慢するしかなさそうですね・・・

すみません。ありがとうございました

【10068】Re:処理方法について
発言  VBWASURETA  - 07/12/6(木) 13:36 -

引用なし
パスワード
   ▼やすじ さん:
こんにちは。

すみませんもう少し確認したいのですが、

>  lErr = ReadDevice16("KML", "D10WORD", rData1, 1)
>  ’↑簡易DLLのプログラム。データの読み込みを行っている。
>  ’KMLは設定データの名前で、D10WORDはデータが入っている場所で、
>  ’rData1は読み出したデータを格納する場所、最後の1はデータの数となっている


このDLLで何のデータを読んでいるのでしょうか?
CSV・テーブル・Iniファイルとか色々あるかと思いますが。
後、dllからのレスポンスがどれぐらいとか見られてますか?

それと一括取得は試されたということですがこんな感じの
取得でしょうか?


サンプル例:

'格納するグローバル変数
Public m_dlldata() As Integer
'読み込み中ロック
Public m_DllLock As Boolean

Sub form1のタイマーイベント()
  Dim getdata As Integer
  
  If dll_Read_Process = True Then
    '読み込み中ロック解除
    m_DllLock = False
    getdata = Get_dll_data( 1 ) 'フォーム1のデータを取り出す
  End If
End Sub

'/**dllの一括に読み込む処理**/
Function dll_Read_Process() As Boolean
  On Error GoTo dll_Read_Error
  dll_Read_Process = False
  Const maxdata As Integer = 5
  Dim i As Integer
  Dim lErr As Integer
  
  '読み込み中ロック
  m_DllLock = True
  
  '格納データ動的配列定義
  ReDim m_dlldata(maxdata)

  For i = 1 To UBound(m_dlldata)
    lErr = ReadDevice16("KML", "D10WORD", m_dlldata(i), 1)
    If lErr <> 0 Then
      m_dlldata(i) = -1 'サンプルとしてエラー戻り値を-1にする
    End If
  Next i
  
  dll_Read_Process = True
Exit Function
'エラー処理
dll_Read_Error:
  dll_Read_Process = False
  MsgBox Err.Number & ":" & Err.Description, vbCritical + vbOKOnly, "dll読み込みエラー"
End Function

'/**変数に代入された内容を取り出す処理**/
Function Get_dll_data(FormIndex As Integer) As Integer
  On Error GoTo Get_dll_data_Error
  Dim m_getdata As Integer

  If (m_DllLock = True) Then
    m_getdata = -1 '読み込み中の場合エラー
  ElseIf (FormIndex <= UBound(m_dlldata)) Then '必要データ分配列が用意されているか判定
    m_getdata = m_dlldata(FormIndex) '正常の場合
  Else
    m_getdata = -1 'エラーの場合
  End If
  '結果を代入
  Get_dll_data = m_getdata
Exit Function
'エラー処理
Get_dll_data_Error:
  m_getdata = -1
  Get_dll_data = m_getdata
End Function

【10073】Re:処理方法について
発言  やすじ  - 07/12/6(木) 15:28 -

引用なし
パスワード
   ▼VBWASURETA さん:

こんにちわ

たびたびすみません。

>このDLLで何のデータを読んでいるのでしょうか?
>CSV・テーブル・Iniファイルとか色々あるかと思いますが。
>後、dllからのレスポンスがどれぐらいとか見られてますか?

↑測定器(計測器)から直接RS−232CケーブルをPCに&#32363;いでデータを読んでいます。
レスポンスは・・・たぶん10msだと思います。


>それと一括取得は試されたということですがこんな感じの
>取得でしょうか?

↑前回記入したものをただ羅列しただけです。(下に表記)
サンプルプログラム例を参照して試して見ます。


Private Sub Form_Timer()

  Dim rData1 As Integer
  Dim rData2 As Integer
  Dim rData3 As Integer
  Dim rData4 As Integer
  Dim rData5 As Integer

  lErr = ReadDevice16("KML", "D10WORD", rData1, 1)
  lErr = ReadDevice16("KML", "D11WORD", rData2, 1)
  lErr = ReadDevice16("KML", "D12WORD", rData3, 1)
  lErr = ReadDevice16("KML", "D13WORD", rData4, 1)
  lErr = ReadDevice16("KML", "D14WORD", rData5, 1)
  
  text1 = rData1
  text2 = rData2
  text3 = rData3
  text4 = rData4
  text5 = rData5

End Sub

797 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free