1

簡単に言えば、建物のエネルギー需要を計算する大規模な VBA プログラムを作成しました。ここに投稿するには多くのコードが必要ですが、最初に各建物の構成ファイルを読み取り、次にディスクからいくつかの熱負荷プロファイルを読み込み、35040 15 時間、どの熱生産者がどの熱量を生成するかを動的に計算します。

Windows Defender を搭載した Windows 7 では、Excel のバージョン (2007、2010、2013、365 テスト済み) に関係なく、スムーズに動作します。

現在、Windows 10 と Windows Defender (Excel 365) を搭載したコンピューターで同じコードを実行すると、信じられないほど遅くなります (1000 倍程度に感じられます)。そして奇妙なことに、すべてがずっと遅く、特定の手順やイベントではありません。ディスクからのファイルとプロファイルの読み込みには永遠に時間がかかりますが、ループ (ドライブとの間で何も転送されない場所) で必要なエネルギーを計算するのも非常に遅くなります。GUI はまったく更新されず、アプリケーション全体がフリーズしているように見えます。

同時に MsMpEng.exe が完全にロードされ、Windows Defender に問題があることを示唆しています。そして驚いたことに、Windows Defender をオフにすると、すべてが正常に動作します。

さて、非常に多くのクラス/モジュール/などがあるためです。何が問題なのかはわかりませんが、コードをアップロードできません。しかし、少なくとも私は疑いを持っています。すべてのクラスには、ここに示すように実装された親プロパティがあり ます。親プロパティは非常に頻繁にコード全体で呼び出されるため、CopyMemory-API/関数に問題があった場合、極端な速度低下は理にかなっています。

更新 1 : CopyMemory-Function を削除し、すべての親を循環参照に置き換えました。これは長期的な解決策ではありませんが、問題の一部は解決しました。十分に長く待つと、ある時点で計算が開始され、想定どおりに高速になります。したがって、問題は一般的にAPI関数に関連している可能性があります。これは、GUIにかなりの量を使用しているためです。

Public Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr

Public Declare PtrSafe Function GetDeviceCaps Lib "Gdi32" (ByVal hDC As LongPtr, ByVal _
    nIndex As Long) As Long

Public Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hWnd As LongPtr, ByVal _
    hDC As LongPtr) As Long

Public Declare PtrSafe Function GetSystemMetrics32 Lib "user32" _
    Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long

Public Declare PtrSafe Function SetWindowPos Lib "user32" _
        (ByVal hWnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
        ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
        ByVal cy As Long, ByVal wFlags As Long) As Long

Public Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As LongPtr) As Long

Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr

Public Declare PtrSafe Sub ReleaseCapture Lib "user32" ()

Public Declare PtrSafe Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" _
    (ByVal hInst As LongPtr, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As LongPtr

Public Declare PtrSafe Function GetActiveWindow32 Lib "user32" Alias "GetActiveWindow" () As Integer

#If Win64 Then
    Public Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
#Else
    Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" _
        (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
#End If

Update 2(これにより、トピックが解決されます):

プログラムのロード部分に時間がかかった理由は、JSON-Converterを使用したためです。そして、同様の問題があったことが判明しました。モジュールを更新し、他のすべての API 呼び出しを削除したので、すべてが正常にスムーズに実行されます。したがって、API 呼び出しが原因であることは間違いありませんが、大きなパフォーマンスの問題について不平を言う人がそれほど多くない理由はわかりません。そして今、私が望んでいない方法で GUI を微調整することはできず、親プロパティを適切に実装する方法が本当にわかりません。

4

0 に答える 0