【问题标题】:MSACCESS.EXE does not close when using POP-UP forms使用 POP-UP 表单时,MSACCESS.EXE 不会关闭
【发布时间】:2016-10-29 20:13:39
【问题描述】:

其他人在退出数据库时遇到了 MSACCESS.EXE 进程未关闭(从任务管理器)的问题。我读过的每一篇文章都与没有正确关闭记录集变量有关。

当我退出正在处理的数据库时,我注意到 MSACCESS.EXE 进程从 Win 10 任务管理器中的“应用程序”部分移动到“后台进程”。这个挂起的进程继续使用 RAM。我确定我正在正确关闭所有记录集变量。

通过大量调试,我想出了一个简单的方法来复制问题:

  1. 在新的 Access 数据库中创建两个表单。将其中一个的 PopUp 属性设置为 True,将另一个设置为 False。保存表单“PopUp”和“NoPopUp”并关闭数据库。
  2. 打开任务管理器查看屏幕上运行的进程。
  3. 打开 Access 数据库并打开 NoPopUp 表单。请注意 Apps 下的 MSACCESS.EXE 进程。
  4. 关闭您的数据库。请注意,MSACCESS.EXE 已从您的进程列表中删除(在“应用程序”和“后台进程”下)。
  5. 现在重新打开 Access 数据库并打开弹出窗口。然后关闭数据库。
  6. 请注意,MSACCESS.EXE 进程从“应用程序”部分移动到“后台进程”,并且仍在使用系统内存。

每次在打开其 Pop-up 属性设置为 True 的表单后关闭数据库时,额外的 MSACCESS.EXE 进程都会在任务管理器中挂起。

我的数据库使用了大量的弹出式表单。我应该如何关闭我的数据库,这样这些挂起的进程就不会堆积起来? (我在 Windows 10 中使用 Access 2013。)

谢谢, 山姆

【问题讨论】:

  • 弹出式表单也是模态的吗?
  • 您是否尝试过在调用 application.close 之前明确关闭表单?这可能是垃圾收集问题.. 可能是合适的stackoverflow.com/questions/21688255/…
  • 什么版本的 Access?我在 2010 年看不到这种行为。
  • "(我在 Windows 10 中使用 Access 2013。)"
  • 在 2010 年和 2013 年测试过 - 再次没有看到这种行为。

标签: ms-access ms-access-2013


【解决方案1】:

你现在如何关闭你的数据库?

你能改变命令来调用一个函数吗? 然后在该函数中调用一个关闭所有打开表单的例程 您可能需要在不保存的情况下添加要关闭的参数 - 取决于您的结果。

Function CloseAllOpenFrms()
    On Error GoTo Error_Handler
    Dim DbF                   As Access.Form
    Dim DbO                   As Object

    Set DbO = Application.Forms    'Collection of all the open forms

    For Each DbF In DbO    'Loop all the forms
            DoCmd.Close acForm, DbF.Name, acSaveNo
    Next DbF

Error_Handler_Exit:
    On Error Resume Next
    Set DbF = Nothing
    Set DbO = Nothing
    Exit Function

Error_Handler:
    MsgBox "The following error has occured." & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: CloseAllOpenFrms" & vbCrLf & _
           "Error Description: " & Err.Description, _
           vbCritical, "An Error has Occured!"
    Resume Error_Handler_Exit
End Function

来自http://www.devhut.net/2015/02/17/ms-access-vba-close-all-open-forms/

【讨论】:

  • 使用上述步骤重现问题我只是通过单击右上角的 x 来关闭数据库。在我的实际应用程序中,我使用的是 Application.Quit(从命令按钮)。您的 CloseAllOpenFrms 函数完成了关闭表单的工作,但是一旦数据库关闭(通过单击 x 或使用 Application.Quit),MSACCESS.EXE 进程仍然存在。
  • 不清楚您是如何尝试实现它的。您不能只是将函数放在模块中并期望它自行运行。你能证明你是调用 Application.Quit 的代码吗?确保在这两种情况下都实现它的一种方法可能是从隐藏的表单中调用该函数 - 在 Form unload 事件中。从退出按钮中卸载该表单 - 首先让该场景工作 - 然后我们可以查看 X 按钮 - 可能通过使用全局变量来跟踪调用关闭事件的位置。
  • 嘿米奇。这似乎只是我的计算机上的问题。我无法在其他机器上重新创建它。但是,我可以每次在我的机器上使用带有简单弹出表单的新数据库重复该行为,而无需任何控件或 VBA 代码。我所要做的就是打开表单并关闭数据库(没有任何代码),并且每次将 MSACCESS.EXE 进程从“应用程序”移动到“后台进程”。也许是某种内存泄漏?
  • 其他人都在使用 Windows 10 - 每个人都使用 64 位系统吗?
  • 没错,64 位 Win 10 系统都围绕 w/32 位 Access 2013。
【解决方案2】:

在新的示例数据库中尝试这个非常基本的示例。

编辑:在每个关闭表单后添加SleepDoEvents,以防缓存/快速cpu 领先于代码?最后一次尝试解决奇怪的问题。

在模块 1 中

Option Compare Database
Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)     

Function CloseAllOpenFrms()

        On Error GoTo Error_Handler
        Dim DbF                   As Access.Form
        Dim DbO                   As Object

        Set DbO = Application.Forms    'Collection of all the open forms

        ' Close all popups first
        For Each DbF In DbO    'Loop all the forms
            If DbF.PopUp Then
                DoCmd.Close acForm, DbF.Name, acSaveNo
                DoEvents
                Sleep 1000
            End If
        Next DbF

        ' Close remaining forms
        For Each DbF In DbO    'Loop all the forms
            DoCmd.Close acForm, DbF.Name, acSaveNo
            DoEvents
            Sleep 1000
        Next DbF

        Application.Quit acQuitSaveNone

    Error_Handler_Exit:
        On Error Resume Next
        Set DbF = Nothing
        Set DbO = Nothing
        Exit Function

    Error_Handler:
        MsgBox "Error closing : " & DbF.Name & vbCrLf & _
               "Error Description: " & Err.Description, _
               vbCritical, "Error closing form"
        Resume Error_Handler_Exit
    End Function

使用两个命令按钮创建基本的Form1: 命令按钮Command1(Caption= 打开弹出表单) 命令按钮Command0(Caption = Exit DB)

在Form1的表单模块中粘贴文本

'------------------------------------------------------------
' Command1_Click
'
'------------------------------------------------------------
Private Sub Command1_Click()
On Error GoTo Command1_Click_Err

    CloseAllOpenFrms

Command1_Click_Exit:
    Exit Sub

Command1_Click_Err:
    MsgBox Error$
    Resume Command1_Click_Exit

End Sub


'------------------------------------------------------------
' Command0_Click
'
'------------------------------------------------------------
Private Sub Command0_Click()
On Error GoTo Command0_Click_Err

    DoCmd.OpenForm "Form2-popup", acNormal, "", "", , acWindowNormal


Command0_Click_Exit:
    Exit Sub

Command0_Click_Err:
    MsgBox Error$
    Resume Command0_Click_Exit

End Sub

创建另一个表单 Form2-popup 并将 Popup 属性设置为 true 添加命令按钮Command1,标题为“退出表单”

'------------------------------------------------------------
' Command1_Click
'
'------------------------------------------------------------
Private Sub Command1_Click()
On Error GoTo Command1_Click_Err

    DoCmd.Close , ""


Command1_Click_Exit:
    Exit Sub

Command1_Click_Err:
    MsgBox Error$
    Resume Command1_Click_Exit

End Sub

【讨论】:

  • 谢谢,米奇。我将示例数据库放在一起。然后我打开Form 1,单击按钮打开PopUp,然后单击Form 1上的按钮退出数据库。进程仍然挂在任务管理器中。
  • 最后一个想法 - 如果您有一台带缓存的快速计算机,可能是时间问题。让我为模块修改上面的代码
  • 米奇,感谢您的帮助。睡眠没有帮助。我想我会继续手动关闭这些孤立的进程。我们已经在这方面花费了足够的时间!保重。
  • 哎哟。太奇怪了。没见过这样的事
猜你喜欢
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多