注册 登录
编程论坛 VB6论坛

请教各位高手,在xp系统下,开机运行一个程序的问题。谢谢。

HVB6 发布于 2015-07-30 19:11, 1197 次点击
已经能实现此功能,但是,此程序(vb6的exe)只运行一次,如何使其在不人工关闭的情况下,一直不停地运行?
17 回复
#2
HVB62015-07-30 20:12
用以下代码可以持续一段时间,但不能持续多久:
For i = 0 To 9999999999999999999
 原代码
Next
此法也太笨了。

[ 本帖最后由 HVB6 于 2015-7-30 20:13 编辑 ]
#3
HVB62015-07-30 21:07
2楼的笨代码也不能实现,开机只运行一次。
#4
风吹过b2015-07-30 21:38
你是提供什么服务吗?

vb写的程序,没有错误的情况下,可以做到 7*24 的运行的。我写过这种的情况的程序,包括使用任务管理器都无法一次性杀死。但能被 taskkill /f /im 干掉。

使用的是双进程互相监控,每 100ms检测一次对方,如何没检测到,就启动对方。其中一个进程负责提供网络的服务。
#5
HVB62015-07-30 22:45
回复 4楼 风吹过b
能实现1楼要求的代码如何写?
#6
风吹过b2015-07-31 10:49
你程序提供什么功能, 提供完了这个功能后你在做什么?

如,提供网络连接功能,不使用时,等待。
这种程序,你按你的实际去写就OK了。不存在自动退出情况。

如,后台监控,写日志文件。
这也可以按实际去,进入程序后,就自动进入工作状态,也不存在自动退出情况。

一般情况下,只要你没有指定任务结束后程序退出,VB写的EXE在没有报错的情况下,不会自动退出的。
关键就是你的程序要写的健壮。
如错误处理,做的到位,而不是满篇都是 on error resume next ,这样才能尽可能的做到程序健壮。
#7
HVB62015-07-31 11:59
回复 6楼 风吹过b
1楼的代码如下:
sub test()
     s="d:\数据文件\*.*"
  do while s<>""
      i=i+1
    if i=12 then
      s1="d:\数据文件\*.*"
      set fs=createobject("scripting.filesystemobject")
      fs.copyfile s1,"d:\数据文件备份\",true
      set fs=nothing
      exit do
    end if
     s=dir
  loop
end sub
代码的功能,就是时刻检查“d:\数据文件\”文件夹下的文件个数达到12个,就复制到"d:\数据文件备份\"文件夹中。
要求每天开机就一直运行此代码。此代码复制文件后自动退出。

     
#8
风吹过b2015-07-31 15:42
代码未经任何测试。
窗体上放一个定时器(timer1),一个文件列表框(file1)

代码如下:
程序代码:
Option Explicit
Const S1 = "d:\数据文件\"
Const S2 = "d:\数据文件备份\"

Dim FileJsOld As Long

Private Sub Form_Load()

FileJsOld = ReadFileCount(S2)       '备份目录里文件个数
Timer1.Interval = 10000             '10秒
Timer1.Enabled = True               '开定时器

End Sub

Private Sub Timer1_Timer()

Dim FileJs As Long
Dim i As Long

FileJs = ReadFileCount(S1)          '新目录里文件个数,同时这样读取后,file 控件中是数据文件的路径

If FileJs - FileJsOld >= 12 Then    '大于或等于12个
    For i = 0 To FileJs - 1
        Call Filebak(File1.List(i))
    Next i
    FileJsOld = ReadFileCount(S2)       '如果进行了备份,那么需要重新读备份目录里的文件个数
'
如果还要继续监视,那就代码到此为止。
'
如果你要结束程序,就再这里再写 end 命令或 unload me 命令
End If

End Sub

Public Sub Filebak(s As String)

If Dir(S1 & s) <> "" Then   '源文件存在
    If Dir(S2 & s) = "" Then        '文件不存在
        FileCopy S1 & s, S2 & s     '复制文件
    Else                    '备份文件存在
        If FileLen(S1 & s) <> FileLen(S2 & s) Then      '仅简单比较文件长度
            Kill S2 & s                                 '不相同则删备份文件
            FileCopy S1 & s, S2 & s                     '复制文件
        End If
    End If
End If
DoEvents                    '前一个是慢速操作
End Sub

Public Function ReadFileCount(s As String) As Long

If Dir(s) = "" Then Exit Function   '目录不存在,直接退出
   
    File1.Path = s                  '文件目录
    File1.Refresh                   '刷新一下
    DoEvents                        '磁盘操作是慢速操作
    ReadFileCount = File1.ListCount     '记录备份文件个数
    DoEvents

End Function


初步判断可以稳定 7*24 小时运行。
有一种错误没处理:磁盘错误,这个你要自己想办法补上。
这个可以使用 on error resume next 进行错误跳过的

[ 本帖最后由 风吹过b 于 2015-7-31 16:47 编辑 ]
#9
风吹过b2015-07-31 15:47
为什么不使用 目录监控 触发来运行呢?

主要是稳定性方面的问题。VB 调用API,没什么问题,回调也没什么问题。
但是,如果长期运行,越是复杂的系统,就越容易出问题,代码越简单越好。
能用VB自己的基本代码解决问题,就尽量使用 VB 自己的代码去解决问题。

检测时间间隔,0.1秒到32秒之间可调。数据是一个 整数,不能超过 32768 的,定时器最小精度是 0.1秒 。
因为磁盘操作是一个慢速操作,为了不影响 系统,所以要多使用 DoEvents 。
#10
wmf20142015-07-31 15:48
按楼主的题意只需要一个定时扫描目录的功能就够了,用定时器。
#11
HVB62015-07-31 17:05
回复 8楼 风吹过b
1楼的代码是已经实现隐蔽运行,所以不需要任何控件。
#12
HVB62015-07-31 17:09
回复 10楼 wmf2014
计划任务已经会做。只是希望一开机1楼的代码就可不停地运行。
#13
风吹过b2015-07-31 20:39
隐藏运行,那你把窗体放到屏幕之外去就可以了。
需要使用定时器,那么定时器,就必须要的窗体。

当然,你使用 API 定时器 函数回调也行,如果打算使用 API 函数,就倒不如直接使用 目录监控 更好。

一句话, 如果你不需要窗体,那么你必须 使用 API 函数。这种情况下,DEBUG起来会很烦。
稳定性与精通度有关,我做不到。

这样的话,你百度 目录监控吧。这方面 的介绍有的。不要使用 循环去写。这样会拖累整个系统速度的。

实在用循环的话,那也要在循环里加入 线程挂起 API,每运行一次,挂起 10秒以上。sleep

希望你能成功。
#14
HVB62015-08-01 07:47
回复 13楼 风吹过b
感谢您的祝福,的确成功了,但不是用您的方法,而此方法也太简单了,真没想到,
即:xp系统→启动→自编的vb6程序→打开1楼的程序。
#15
zrf12982015-09-23 14:37
可以在 “C:\Documents and Settings\Administrator\「开始」菜单\程序\启动 ”下添加一个快捷方式,这样每次开机就能运行了,是这意思吗?
#16
HVB62015-09-23 15:24
回复 15楼 zrf1298
是的。
#17
zrf12982015-09-27 20:20
还有一个修改注册表的方法:

Dim WSHShell
Dim fi1 As String
Set WSHShell = CreateObject("wscript.shell")
fi1="程序全路径+程序名.exe"
WSHShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\tsqcic", fi1
#18
沉默的痞子2015-10-08 09:35
太高端了,看不懂
1