重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Sleep是挂起式等待,对于小于一个时钟周期(一般是16ms)的等待可能是系统通过循环实现的,所以CPU使用率必然很高,另外,你sleep 1的话操作系统无法精确做到1m,所以你的代码Sleep 1实际要等上若干毫秒以后才有反应(因为1ms小于windows的一个调度周期)
创新互联公司主要从事成都网站制作、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务夏邑,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
解决办法是用SetTimer的这个API
在窗体里添加一个按钮,添加代码:
Private Sub Command1_Click()
TimerId = SetTimer(0, 0, 1000, AddressOf TimerProc)
End Sub
添加一个模块,添加代码
Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public TimerId As Long
Public Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
KillTimer 0, TimerId
Form1.Print "时间到"
End Sub
需要注意的是用户层的任何定时器设定值小于15ms时都将是不精确的
在VB.NET中,带框架窗体的大小是不能为0的,要想做到高、宽都为0,需要自己重绘一个无边框窗体,用外置图片来绘制,配合PS做一些图片,既可以换肤还能做的很漂亮。
按当前代码修改,你把下面的代码粘回去就可以了,窗体的高和宽达到最小时,循环会自己退出,避免无限循环;
Select Case 2
Case Is = 1
Dim w As Integer = Me.Width
Do
Me.Width -= 5 : w -= 5
Threading.Thread.Sleep(3)
Loop While Me.Width = w
Case Is = 2
Dim h As Integer = Me.Height
Do
Me.Height -= 5 : h -= 5
Threading.Thread.Sleep(3)
Loop While Me.Height = h
Case Is = 3
Do
Me.Opacity -= 0.05
Threading.Thread.Sleep(120)
Loop Until Me.Opacity = 0
End Select
这段代码我执行无误,不太清楚题主是如何异步发送的,题主也没给出错误究竟是什么,所以无从判断。
只能说需要手动释放,或者用 message = Nothing 也可以释放。
【针对问题补充的回答】
注释行已去掉,仍能正常运行,可能跟网络环境有关。
另外不知题主 AddHandler client.SendCompleted, AddressOf SendCompletedCallback 这行中的回调函数 SendCompletedCallback 是怎么写的,我写的是:
Private Function SendCompletedCallback(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
If e.Cancelled Then
REM 邮件发送被取消
ElseIf e.Error.ToString "" Then
REM 邮件发送失败
Else
REM 发送成功
End If
End Function
另外建议用 Try-Ctach-End Try 结构,并在释放前设置延时函数。
第一个for完成对delay_time参数的控制,即共循环多少次内部循环
第二个for(内部循环),完成对j从0到199的控制,共循环200次。
翻译成汇编就是:
(R0为传递参数)
DELAY:
MOV R1,#200
DJNZ R1,$
DJNZ R0,DELAY
RET