VB6を使用してプログラムを作成しているのですが、使用するPCによって変数が変化することがあり困っています。
プログラムはタイマー処理で外部ポートを常に監視しておき、外部ポートからの入力をトリガーとしてメインプログラムを走らせるといったものです。
その外部入力値をローカル変数で監視していて、そのローカル変数をグローバル変数に置き換え、タイマーの周期でグローバル変数とローカル変数の変化を見比べてトリガーとしています。
ソースとしては以下の感じです。
Module1プログラム
public PreData As Integer
Mainプログラム
Private Sub Main()
Timer1.Enable = False
'処理内容〜〜〜〜〜
Timer1.Enable = True
End Sub
Private Sub Timer1_Timer()
Dim NowData As Integer
NowData = '外部入力値読取りの関数
If NowData <> PreData Then
Call Main()
End If
PreData = NowData
End Sub
こんな感じのプログラムですが、作成しているPCでは異常が見つからないのですが、コンパイルをして実行ファイルを作成し他のPCで動作させると、タイマー関数内でMain関数を実行した際に、NowData変数とPreData変数が勝手にいろいろな値に変化してしまいます。(固定値に変化するのではなく、毎回違う値がでてきます)
少なくともグローバル設定をしたPreData変数は変化しないだろうと思っていたのですが、こちらも変化してしまいます。
ちなみに、動作としてはTimer1のMain関数を呼び出した際にはMain関数が実行され、Main関数のすべての処理が終わるとTimer1のMain関数を呼び出した次の行(End If)に戻り処理が続けられているようです。
このため、Main関数で設定しているTimer1のEnable設定は意味がないような指定です。
この内容から何かおかしな点や推測できることはありますでしょうか?
現状はTimer1でMain関数を呼び出したあとに、NowDataおよびPreDataを固定値に書き換えてEnd Ifとしているため、異常は回避できているのですが、原因がはっきりしなくてもやもやがあります。
よろしくお願いします。
変数の値が勝手に変わったりはしないはずです。
「誰か」が書き換えているはずですので、その「誰か」を探すのが先決ですね。
パット思いつくのは・・・
・別のイベントが用意されていて、予定外のタイミングでそのイベントが動作してしまっている。
・タイマーの間隔より、「外部入力値読取りの関数」の実行時間の方が長く、
読み取りが終わる前に次のタイマーイベントが走ってしまう。
ぐらいですね・・・
とりあえず、
・「外部入力値読取りの関数」の実行時間を確認してみる。
・変数「PreData」を書き換える処理が他に無いか確認してみる。
とか。
大吉末吉さま、回答ありがとうございます。
思い当たる点としては、〜次のタイマーイベントが発生する〜の部分です。
PreDataを書き換える処理は他にないので、外部入力の読み取りの間に
次のタイマーイベントが発生しているのかなぁと思っています。
そうだとすると、PC間の性能の差も確かに納得できる面がありますからね。
このタイマーイベントの間隔やその他の時間設定など詳細に見てみたいと思います。
検証に時間がかかるところもあるので、結果はまたご報告する予定です。
設備の関係で完全な検証ができないのですが、mainの処理途中で
タイマーイベントが発生しているような感じも見受けられました。
このため、タイマーイベントの間隔などをもう少し詰めていきたいと
思います。
ありがとうございました。
ツイート | ![]() |