最近我写了一个VB小程序,运行时总让系统不流畅,大家帮忙!谢谢!

softworms 2002-01-31 04:57:57
最近我写了一个VB小程序,用来在后台运行,在过一段时间后便运行一次,不会主动结束的。可是我发现这个程序很容易让操作系统运行得相当不流畅,不知道是不是占资源太多,可是我写的是一个很小一个用单模块的程序,连介面都没有,是不是方法不对啊,请大家指教,具体例程进入观看,谢谢!


Dim something(6) As String, i As Integer, cons As String
Declare Function Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Boolean
Sub Main()
App.TaskVisible = False '任务窗口中不可见
Do '一直运行,死循环。
Randomize '随机数初始化
'以下是运行条件满足后要弹出消息窗内的文字,具体哪一条由随机数决定
cons = "我说了,你要这样做,别对我嬉皮笑脸的!DO IT NOW!"
something(0) = "就搞编程吧,你现在是我所见过的最差的人了,既懒惰又白痴,还不快动?游戏有什么好玩的,玩来玩去玩自己,别用脚趾看我,再看我就把把你喝掉...不好,我要腹泻了!"
something(1) = "你编得程序的介面真差的没有话说,没有美术细胞就学学平面设计啊,Photoshop,Flash你有多久没有碰了?没有前途不要紧,自己要加油啊!看看自己的样子,和一条咸鱼有什么分别?"
something(2) = "今天听说你又有许多英语单词和句子搞不清楚,初中时你不是很牛吗?不用心,什么都得不到,还不快温习一下英语,以后看不懂技术书,哭都来不急!当乞丐后,千万别告诉别人我提醒过你。"
something(3) = "你又想上网啊,说是查资料,问问题,谁相信啊,好好看看基础理论书,年青人要脚踏实地,嫌闷就听听音乐,我知道你没有音乐细胞,你告诉过我的,只是我看你不要命时,就会忘记了。"
something(4) = "唉,真不知道你这些日子在干什么,一点成绩也没有,把你的笔记整理一下啊,把它们归纳成自己的东西,抄了又不看,装精,快!记得把字练好,字是面子,别给屁股丢脸!"
something(5) = "你不是说要在互联网上为班同学做个网站的吗?这次又放弃了吗?这可不行,做要有始有终啊,瞧瞧你许诺时候的快乐劲,算了,我不勉强,但我真得很希望能看到你亲手做的站呢。"
something(6) = "今天的天气不错啊,用了这么多的D版了,是不是应该自己学点破解方法,老是靠别人也不是个办法吧,你不是下载了很多破解工具吗?拿出来练练好手也好啊,不会用就找资料看,游戏不少玩为妙!"
i = Int((Rnd * 7)) '生成乱数
ftime = Val(Right(Time, 2))
a: MsgBox "利刃无锋,你该工作了!" + something(i) + cons, vbInformation, "*永远不放弃理想*" ’主代码
stime = Val(Right(Time, 2)) '取得看信息前的时间(秒数)
If stime - ftime < 10 Then GoTo a: '如果看贴时间短于10秒就重新显于该贴。
Pause ’程序休眠,等待下次,也就是过20分钟再运行。
Loop
End Sub
Sub Pause()
Sleep (1200000)
End Sub
...全文
202 点赞 收藏 23
写回复
23 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Chice_wxg 2002-02-04

有简单方法你又不用……
把Sleep换成MySleep
private sub mysleep(byval t as long)
dim s as single
s=timer
while timer-s<t
doevents
wend
end sub
回复
softworms 2002-02-04
谢谢大家,我想还是不是使用这个API会好一点?我曾经用它实现了将一个程序关闭后便执行第二个程序的功能,大家觉得怎么样?用它来代替循环可以吗?真得要实现一个功能还是不要劳烦几十甚至几上百行的代码吧。简单最好了。
Private Declare Function WaitForSingleObject Lib "kernel32" Alias "WaitForSingleObject" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
回复
QQRN 2002-02-03
If stime - ftime < 10 Then GoTo a: '如果看贴时间短于10秒就重新显于该贴。

这句我不知道你怎么弄的,过10秒也关不了,害我关闭VB。
回复
QQRN 2002-02-03
Option Explicit
Dim ii As Long
Dim something(6) As String, i As Integer, cons As String
Private Declare Function Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Boolean

Sub Main()
App.TaskVisible = False '任务窗口中不可见
Timer1.Interval = 60000
End Sub

Private Sub Timer1_Timer()
Dim ftime As Integer
Dim stime As Integer
ii = ii + 1
If ii = 20 Then

Randomize '随机数初始化
'以下是运行条件满足后要弹出消息窗内的文字,具体哪一条由随机数决定
cons = "我说了,你要这样做,别对我嬉皮笑脸的!DO IT NOW!"
something(0) = "就搞编程吧,你现在是我所见过的最差的人了,既懒惰又白痴,还不快动?游戏有什么好玩的,玩来玩去玩自己,别用脚趾看我,再看我就把把你喝掉...不好,我要腹泻了!"
something(1) = "你编得程序的介面真差的没有话说,没有美术细胞就学学平面设计啊,Photoshop,Flash你有多久没有碰了?没有前途不要紧,自己要加油啊!看看自己的样子,和一条咸鱼有什么分别?"
something(2) = "今天听说你又有许多英语单词和句子搞不清楚,初中时你不是很牛吗?不用心,什么都得不到,还不快温习一下英语,以后看不懂技术书,哭都来不急!当乞丐后,千万别告诉别人我提醒过你。"
something(3) = "你又想上网啊,说是查资料,问问题,谁相信啊,好好看看基础理论书,年青人要脚踏实地,嫌闷就听听音乐,我知道你没有音乐细胞,你告诉过我的,只是我看你不要命时,就会忘记了。"
something(4) = "唉,真不知道你这些日子在干什么,一点成绩也没有,把你的笔记整理一下啊,把它们归纳成自己的东西,抄了又不看,装精,快!记得把字练好,字是面子,别给屁股丢脸!"
something(5) = "你不是说要在互联网上为班同学做个网站的吗?这次又放弃了吗?这可不行,做要有始有终啊,瞧瞧你许诺时候的快乐劲,算了,我不勉强,但我真得很希望能看到你亲手做的站呢。"
something(6) = "今天的天气不错啊,用了这么多的D版了,是不是应该自己学点破解方法,老是靠别人也不是个办法吧,你不是下载了很多破解工具吗?拿出来练练好手也好啊,不会用就找资料看,游戏不少玩为妙!"
i = Int((Rnd * 7)) '生成乱数
ftime = Val(Right(Time, 2))
a: MsgBox "利刃无锋,你该工作了!" + something(i) + cons, vbInformation, "*永远不放弃理想*" '主代码
stime = Val(Right(Time, 2)) '取得看信息前的时间(秒数)
If stime - ftime < 10 Then GoTo a: '如果看贴时间短于10秒就重新显于该贴。
ii = 0 '程序休眠,等待下次,也就是过20分钟再运行。
End If
End Sub
回复
jett 2002-02-03
定时的函数
http://www.csdn.net/expert/Topic/499/499071.shtm
其中bardo贴出来的我调试过没问题
ljren_t(立志)贴出来的我没调试过,你也可以试试
回复
jett 2002-02-03
回复人: softworms(了然)
我试了一下,我不希望使用带form的程序和timer控件

看看我贴出来的那个贴子,里面的函数最适合没有form的程序
回复
Arcan 2002-02-03
to:Chice_wxg(定理 1、人定胜天 2、听天由命)
可以用timer控件作数字累加呀,达到一定的数字后就进行操作。这样就可以产生很大的间隔了。
回复
yfsteven1 2002-02-03
不要用循环啊,加一个窗体后用Timer来控制就快多了!!
回复
softworms 2002-02-03
现在的问题已经很明显了,这个程序的目的是在后台潜服一定的时间后例运行来提出note,但是现在面临一个问题就是它在潜服时会占用大量的CPU时间片使得系统运行不流畅,这当然不是程序用户所希望看到的,我试了一下,我不希望使用带form的程序和timer控件,毕竟我只想这是一个很小的程序,现在需要一个方法就是当程序首次运行后便处于一种休眠状态并且尽可能少的占用CPU片,然后当一个事件(希望是时间)触发后,它便又苏醒了,然后再一次完全它的使命,随后便又睡着了,使用后台运行它可不可以实现它?有人可以以对比的方式简洁地给出以上几个方法的利弊吗?简单的实现方法,不要太多冗长的代码。谢谢大家指教!
回复
sippey 2002-02-03
这么麻烦啊
回复
AechoJohn 2002-02-03
Option Explicit
Const csWAIT_ABANDONED As Long = &H80
Const csWAIT_OBJECT_0 As Long = &H0
Const csWAIT_TIMEOUT As Long = &H102
Const csWAIT_FAILED As Long = &HFFFFFFFF

Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (lpEventAttributes As SECURITY_ATTRIBUTES, ByVal bManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function ResetEvent Lib "kernel32" (ByVal hEvent As Long) As Long
Private Declare Function SetEvent Lib "kernel32" (ByVal hEvent As Long) As Long

Private mblnStop As Boolean

Private Sub cmdStop_Click()
mblnStop = True
End Sub

Private Sub cmdTest_Click()
Dim lngHandle As Long, lngR As Long, lngT As Long
Dim suT As SECURITY_ATTRIBUTES
Dim strMsg As String

cmdTest.Enabled = False
mblnStop = False
WaitForOne 2000
cmdTest.Enabled = True
End Sub

Private Function WaitForOne(ByVal lngTime As Long)
Dim lngHandle As Long, lngR As Long, lngT As Long
Dim suT As SECURITY_ATTRIBUTES
Dim strMsg As String

'create a events
suT.nLength = Len(suT)
lngHandle = CreateEvent(suT, True, 0, "mywaitevents")

' lngR = GetLastError()
' strMsg = lngHandle & vbCrLf & lngR
' MsgBox strMsg

If lngHandle = 0 Then GoTo ErrDeal

Do While mblnStop = False
'reset the event nosignaled
lngR = ResetEvent(lngHandle)
DoEvents
'wait for the event
lngR = WaitForSingleObject(lngHandle, lngTime)
DoEvents
' lngT = GetLastError()
' Select Case lngR
' Case csWAIT_ABANDONED
' strMsg = "wait_abandoned"
' Case csWAIT_OBJECT_0
' strMsg = "wait_object_0"
' Case csWAIT_TIMEOUT
' strMsg = "wait_timeout"
' Case csWAIT_FAILED
' strMsg = "wait_failed"
' End Select
' MsgBox strMsg & vbCrLf & lngT
'set the event signaled
lngR = SetEvent(lngHandle)
DoEvents
Loop
CloseHandle lngHandle

ErrDeal:
End Function


你根据上面的代码改一下吧!(把声明与WaitForOne函数提出来改改就行了!)
回复
老熊宝宝 2002-02-03
你的程序有意思!
Timer控件实质上还是用的SetTimer这个API,系统每55秒发一个WM_TIMER消息,不精确。
Timer的Interval在约一分钟,要20分钟,累加到20不就行了,你不用非要20分钟那么准吧!
回复
Chice_wxg 2002-02-02
另外:To TechnoFantasy(www.applevb.com) 等

不能用Timer控件
那只是理论方法。因为Timer控件触发时间不能超过600000(即 60秒 = 1分钟 )


To sonicdater(发呆呆(我答问题*不吵架*因为我呆)) 
这种方法不行。 doevents必须在循环中才能起到相关作用。
回复
Chice_wxg 2002-02-02

改!把Sleep换成MySleep
这样:

private sub mysleep(byval t as long)
dim s as single
s=timer
while timer-s<t
doevents
wend

end sub
回复
softworms 2002-02-02
谢谢,两个观点都不错,不过还分等我验证后才能根据结果给分,当然只要肯指教我的朋友都给分,不过多少有分别,编程的学问可真大啊,我以后一定要好好跟大家等众高手前辈多学一些。
回复
pjohnlei 2002-01-31
不要用sleep好吗,还有do....loop一直在占用cpu片
回复
qsygbs 2002-01-31
sleep()函数是什么呢?
回复
Arcan 2002-01-31
用timer最好
回复
_西瓜皮_ 2002-01-31
完全同意使用Timer
回复
uguess 2002-01-31

不要使用Sleep()函数。你可以使用Timer控件来控制,只要添加一个窗体,一个Timer控件,运行时不要把窗体显示出来就好了。



回复
加载更多回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7518

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2002-01-31 04:57
社区公告
暂无公告