![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
よろしくお願いします!
ある常駐プログラムを作成し、操作者があらかじめ指定した時間ごとに
画像を保存するという設定にしています。
Timerコントロールで直接時間間隔を指定するとIntervalが最大60000くらい
らしいので、まずLabel1にInterval1000で時計を表示して、次にLabel2に
もLabel2.caption=timeで時刻を表示します。
操作者が仮に2分ごとに画像を取ると指定した場合は、
Label2の時刻にDateAddで("s",120,TimeValue(label2.caption))した時刻と
Label1の時刻が同じになったら画像を取るというコードにしてます。
で、画像を取ると同時にLabel2.caption=timeでLabel2の値を現在時刻に
し、また繰り返し2分足したものとLabel1.captionが同じになるのを
待って画像を取ります。
これを繰り返して指定した時間間隔で画像を取るようにしていまして、
ちゃんと動作するのですが、なぜか時計が23:59:57くらいで
Label2の方の表示が止まってしまうのです。
Label1の方はTimerで1秒ごとにちゃんと時計を表示し続けている
のですが、Label2だけ0時直前で必ず止まってしまいます。
何か日付が変わると表示ができなくなるような決まりがあるのでしょうか。
色々と試したのですが、ここだけが分かりません。
ご教授お願いいたします!
また、私のやり方以外に何か時間間隔を指定する良いコードが
ございましたら教えていただけますでしょうか?
例えばTimerコントロールを1分ごとに起動して、3分なら3回カウント
させるような方法もどこかで目にしたのですが、操作者が指定する
時間間隔は秒単位にしているので、3秒であったり、120秒(2分)で
あったり様々です。
その場合の方法がよく分からないので、最初に書いた方法でコードを
書いています。
よろしくお願いします!!!
No.1ベストアンサー
- 回答日時:
できるだけ正確な2分を取得したいなら、別プロセスにすることが望ましいと思います。
VBは(基本的に)シングルスレッドのみ対応しています。
2分後のタイミングで、フォームをドラッグされたりしたら、その間はタイマーコントロールのイベントは発生しません。ですので、2分間隔でタイマーイベントが発生するとも限りません。
他プロセスにして、割り込みの様に発生させると、これらの症状を回避することができます。
別EXEがいやなら、同様なロジックのActiveXにするとよいと思います。
サンプルは二つのプロジェクトです。
※割り込みタイマープロジェクト
Project1.exe
└Module1
※メインのEXE
Project2.exe
└Form1
├Command1
└Text1
ソースを、各プロジェクトの適した場所に貼り付けてEXEにしてください。
それで同じフォルダにおいて、Project2.exeを起動してみてください。
------Project1.exe
Option Explicit
'秒間隔
Private Const DEF_INTERVAL As Single = 2 '←ここを120にしたら2分
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Const WM_COMMAND = &H111
Private Const BN_CLICKED = &H0&
Private Const API_FALSE = &H0&
Sub Main()
Dim sngStart As Single
Dim sngWork As Single
Dim cmdPara As String
Dim lngWinWnd As Long
Dim lngBtnWnd As Long
'タスク一覧に追加しない
App.TaskVisible = False
'引数を受け取る
cmdPara = Command$()
If Not IsNumeric(cmdPara) Then
GoTo PGMEND
End If
'ハンドルを保持
lngBtnWnd = CLng(cmdPara)
lngWinWnd = GetParent(lngBtnWnd)
'タイマー開始時間の設定
sngStart = Timer
Do Until IsWindow(lngBtnWnd) = API_FALSE
'経過時間を取得
sngWork = Timer - sngStart
'インターバル時間を超えるようなら
If sngWork >= DEF_INTERVAL Then
'ボタンを押す処理をする
Call PostMessage(lngWinWnd, WM_COMMAND, BN_CLICKED, ByVal lngBtnWnd)
'タイマー開始時間の再設定
sngStart = sngStart + DEF_INTERVAL
End If
DoEvents
Loop
PGMEND:
End Sub
------Project2.exe
Option Explicit
Private Sub Command1_Click()
Text1.Text = Now()
End Sub
Private Sub Form_Load()
Me.Command1.Visible = False
Call Shell(App.Path & "\Project1.exe " & Me.Command1.hWnd)
Call Command1_Click
End Sub
突っ込み野郎が現れる前に一言!
App.Pathは、時には「\」がいらないなどの、しょーもない反論は却下!
あくまでこれは考え方のサンプルです。
ご回答ありがとうございます。
詳細なコードまで書いていただきまして、ありがとうございます。
こちらのサンプルを2つのEXEファイルにして起動してみましたが、
表示は23:59:59くらいで止まってしまいます。
やはり日付が変わる時間は何か表示ができない要因があるようです。
No.3
- 回答日時:
DateAdd("s",120,TimeValue("23:59:59"))
が期待した値でないのでは?
>Label2.caption=time
timeではなくnowにすれば動くと思います。
ご回答ありがとうございます。
DateAddでも一応ちゃんと動作はするのですが、何故か日付がかわる
あたりで止まってしまうのです。
Interval=1000で表示している方はちゃんと時計が表示されているのですが、
もう一方が止まります。
Nowで試してみましたが、やはり同じでした。
No.2
- 回答日時:
まちがいでした
Timerイベントは発生しました。
さっきのレスを気にしないでください。
でも、何らかのタイミングでタイマーイベントが発生しなくなる場合があるのは本当です。
そのために、私が時間間隔を使用するときは、いつも割り込みで発生させています。
どういうときにそうなるかをわすれちゃったけど。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- その他(Microsoft Office) 勤務表のエクセル作成で数式を教えてください。 1 2023/01/17 03:27
- プリンタ・スキャナー テプラ(PCからプリント)で先端に余白を作りたい 2 2023/03/21 13:38
- Excel(エクセル) 出退勤管理の遅刻・早退時間について 3 2023/08/10 15:33
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- その他(プログラミング・Web制作) seleniumbasic chrome操作について 1 2023/03/29 15:40
- Excel(エクセル) 至急 Excel日付表示設定教えてください Excelの日付表示ですが、他者から送られてくるExce 6 2023/02/03 11:01
- Excel(エクセル) Excelシフト表 固定シフトの自動変換化 1 2022/04/14 16:10
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
USJでの割り込み
-
VB6でSendKeyを利用したTab移動...
-
マイコン C言語 割り込み処理...
-
駅のトイレでナイチンに邪魔さ...
-
CPU負荷率の安全な上限と計...
-
(H8マイコン)タイマ割込で変更...
-
デュアルCPUのパソコンでCPUを1...
-
【組込み】割り込み中のstatic...
-
電車で待機列の割り込みについ...
-
ゲームプログラマーは優秀なの?
-
H8マイコンでの割り込み(シリ...
-
C-Builder OnChangeをマスク
-
ウォッチドッグタイマ(WDT)の...
-
スーパーのレジで並んでいたら...
-
sleep関数の原理について
-
アセンブラのタイマー割り込み
-
逆コンパイルと逆アセンブルの...
-
Macターミナルで実行中のプログ...
-
これて逆じゃないですか?
-
C言語で、メモリを解放しないで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
このレジの並び方は間違ってま...
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
ショッピング
-
CPUの処理量を減らすコーデ...
-
一定時間操作がなかったら、と...
-
CPU負荷率の安全な上限と計...
-
pic 複数の割り込み関数 切り分...
-
Amazonfireタブレットにわから...
-
【組込み】割り込み中のstatic...
-
マイコン C言語 割り込み処理...
-
USB機器からのデータ受信による...
-
駅のトイレでナイチンに邪魔さ...
-
インバウンドで迷惑している人...
-
PICのSleepからの復帰に関して
-
PICでのプログラムによるチャタ...
-
実行した後、どうしてもフリー...
-
PICで内部タイマーを使わずカウ...
-
SH2のタイマ出力
-
割り込み中に例外異常
おすすめ情報