VB 程序d出错误框(部件要求挂起),求解决。

VB 程序d出错误框(部件要求挂起),求解决。,第1张

你的循环语句中要插入一句DoEvents,使查询期间能让其他软件临时获得CPU的控制权,避免程序进入“假死”(或者说挂起)状态。另一方面,你的查询代码也要进行优化,以免占用太多的CPU控制时间。Windows系统是个多任务系统,你要时刻记住,在同一个时刻,并不是只有你的程序在运行,还有许多其他软件也在排队等着分CPU的一杯羹,所以软件也要有“公德心”,不能只顾自己,强行霸占系统资源。就像很多人排队买火车票,如果轮到你的时候你长时间霸着售票窗口不走,那么整个队伍就陷入停滞状态了。

说不行的,太笨了。其实完全可以做得到,就是你再写个form2,在原来需要d出msgbox的地方,改为 form2.show,然后在form2里设置2个按钮,分别是“确定”与“取消”,同样可以实现使用msgbox的功能。这样,就可以现实你的目的, 可以让msgbox d出时,下面的命令可以继续执行?并且不需要 Timer控件。(可以增加的“倒计时自动消失对话窗”的高级功能:在form2里放个定时器,设置倒计时,如果用户没有理会d出来的form2窗口,时间到了,form2可以自动消失。)

以下是代码:

Private Sub Form_load()

......

form2.show

XXXX

.......

END Sub

其中,XXXX以及后面的代码就是你原来希望的,d出消息框之后可以继续执行的代码(程序并未挂起,仍在执行)。

Form2 的代码:

在Form2中,“确定”按钮的名称为Command_sub1,“取消”按钮的名称为Command_sub2,以区别于Form1中的按钮。

Dim TimeLeft As Integer

Private Sub Form_load()

TimeLeft = 10

Timer1.Interval = 1000

Timer1.Enabled = True

Label_sub2.Caption = "若未决定,将在" &Str$(TimeLeft) &" 秒后继续。"

End Sub

Private Sub Timer1_Timer()

TimeLeft = TimeLeft - 1

Label_sub2.Caption = "若未决定,将在" &Str$(TimeLeft) &" 秒后继续。"

If TimeLeft = 0 Then

Timer1.Enabled = False

DoEvents

Call Command_sub1_Click

End If

End Sub

Private Sub Command_sub1_Click()

'此段是"确定"按钮要执行的

Unload Form2

Set Form2 = Nothing

End Sub

Private Sub Command_sub2_Click()

'此段是"取消"按钮代码

Unload Form2

Set Form2 = Nothing

End Sub

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const SYNCHRONIZE = &H100000

Private Const STANDARD_RIGHTS_REQUIRED = &HF0000

Private Const PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or &HFFF)

Private Declare Function NtSuspendProcess Lib "ntdll.dll" (ByVal hProc As Long) As Long

Private Declare Function NtResumeProcess Lib "ntdll.dll" (ByVal hProc As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Private hProcess As Long

Private Sub cmdClose_Click()

CloseHandle hProcess

End Sub

Private Sub cmdResume_Click()

If IsNumeric(txtPid.Text) Then

hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, CLng(txtPid.Text))

If hProcess <>0 Then

NtResumeProcess hProcess '继续

'NtSuspendProcess 挂起

End If

End If

End Sub

Private Sub cmdTerminate_Click()

If hProcess Then

TerminateProcess hProcess, 0

Else

If IsNumeric(txtPid.Text) Then

hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, CLng(txtPid.Text))

If hProcess <>0 Then

TerminateProcess hProcess, 0

End If

End If

End If

End Sub


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11563729.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存