gpt4 book ai didi

multithreading - Excel VBA中的原子性

转载 作者:行者123 更新时间:2023-12-03 13:19:10 24 4
gpt4 key购买 nike

我在 xlsm 的表单模块中有以下代码:

Public Sub DoModal() ' Note: Called by LaunchHelper which is associated with F12 in Workbook_Open
Dim ewsActive As Worksheet: Set ewsActive = ThisWorkbook.ActiveSheet
If ewsActive Is Overview Then ' Overview is the CodeName of one of the Worksheets
Set ewsOverview = ewsActive ' This is a Private variable in the Form Module
ShowSafe
End If
End Sub

Private Sub ShowSafe() ' Calling Show directly caused random crashes, I concluded that these were caused by that the Form was not loaded into memory, this function makes sure, it is in memory before calling Show
Dim blnLoaded As Boolean: blnLoaded = False
Dim objForm As Object: For Each objForm In UserForms
If objForm.name = Me.name Then
blnLoaded = True
Exit For
End If
Next objForm
If blnLoaded = False Then
Load Me
End If
Show
End Sub

我所知道的:
  • VBA 是单线程的,永远不会发生两个 Subs 或 Functions 并行执行的情况(例如,在处理 Worksheet_Activate 时,还会调用 Worksheet_SelectionChange,并且执行这两个函数内的语句的顺序是不确定的)。
  • 但是,如果我们将 Excel+VBA 视为一个系统,那么它是多线程的,因为 Excel 和 VBA 是并行运行的(此外,Excel 本身也是多线程的)。

  • 我的问题是:

    我在 DoModal 中看到了一个竞争条件,因为检查和操作不是原子的,以下情况是可能的:

    (1) 条件 ewsActive Is Overview 被评估为真,所以我们开始执行 If block 内的分支。

    (2) 执行由 Excel 接管,用户切换到不同的 Worksheet。

    (3) ShowSafe 被调用,而我们的 ActiveSheet 不是 Overview 而是其他东西。

    你同意我的推理吗?尽管进行了检查,但表格可能会出现在不同的工作表上,这是否正确?到目前为止,我还没有成功地使这个错误发生,但我想知道理论上是否有可能,即使它只有很小的机会。

    在哪里可以找到有关 VBA 中多线程相关问题和保证的更多信息?

    最佳答案

    为了让用户切换 ActiveSheet,Excel 需要处理用户事件。有经验的 VBA 程序员通常通过显式调用 DoEvents 让 Excel 处理用户事件。 ,因为 Excel 的 GUI 在 VBA 代码运行时卡住/缺乏 CPU。这表明您描述的竞争条件极不可能,如果可能的话。

    但是,Excel 的 GUI 与其 VBA 运行时之间的这种非并发性只有通过实践才能知道。我没有找到正式确认 Excel 在 VBA 代码运行时处理用户事件的机会绝对为零(没有明确屈服)的官方文档。我们只有通过实践才知道,这个机会“几乎为零”。

    出于这个原因,我会说你建议的竞争条件虽然极不可能,但在理论上是可能的,直到我们有一个排除这种并发性的官方声明或文档。

    p.s.我认为这个问题仅具有学术兴趣,并且仅用于说明目的的代码,因为显然与“检查”它是否实际加载的表单无关。

    关于multithreading - Excel VBA中的原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44626714/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com