OutOfMemoryException   otázka

VB.NET

Dobrý den,

jsem začátečník a rád bych se zeptal proč může vznikat chyba "OutOfMemoryException was unhandled". Tuto hlášku to vždy ukáže cca po 10-15 min od spuštění aplikace. Četl jsem podobná témata a myslím že s mojí 4gb pamětí by problém být neměl, žádné obrázky v aplikaci nemám (pouze picturebox u kterého se mění barva) Používám Visual Studio 2010.

Díky za odpověd.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zřejmě něčím v cyklu nebo opakovaně zabíráte paměť, nebo máte nekonečnou rekurzivní funkci. S tím že máte 4 GB RAM to vůbec nesouvisí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ukáže vám to aspoň řádek, na kterém to dělá? Pokud ano, je pokaždé stejný?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste nějaký profiler. Pokud k němu nemáte přístup, zkuste si aspoň v program dát na pár míst příkaz pro vypsání volné a obsazené paměti. Řada objektů se musí ručně "rušit" pomocí funkcí jako je "close", "destroy". Ale více Vám asi bez kódu nikdo neporadí.

Jinak, i kdybyste měl 8 GB paměti, tak pokud bude v programu chyba, tak ta paměť dojde taky ;-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za odpovědi.

Chybný řádek to neoznačuje. Nevím jestli to nemůže způsobovat nějaký problém s WebBrowser který mám na formuláři?

Tady je kdyžtak ten cyklus :

        tree1 = GetPixel(GetDC(0), tree1x, tree1y)
        Dim minus As Integer = tree1 - 300000
        Dim plus As Integer = tree1 + 300000
        If minus < tree1b And plus > tree1b Then
            SetCursorPos(tree1x, tree1y)
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
        Else
            tree2 = GetPixel(GetDC(0), tree2x, tree2y)
            Dim minus1 As Integer = tree2 - 300000
            Dim plus1 As Integer = tree2 + 300000
            If minus1 < tree2b And plus1 > tree2b Then
                SetCursorPos(tree2x, tree2y)
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            End If
        End If
       

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Podezíral bych funkci GetDC, nevolejte ji pokaždé, ale vytáhněte si ji do proměnné před tím cyklem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To nepůjde protože tu aplikaci používám k tomu aby za mě klikala na internetu. A pokud nedostanu aktuální barvu pixelu tak by to stratilo smysl.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Neříkám, že tu funkci nemáte používat. Ale zavolejte si ji jednou, ne opakovaně v cyklu, podle toho, co jsem našel na googlu, alokuje nějakou paměť a neuvolňuje ji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já potřebuji aby se ta funkce volala po chvilce znovu pokud bych jí zavolal jednou před cyklem tak to nebude fungovat tak jak by mělo. Nevíte jestli jde ta paměť nějak uvolnit?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

        tree1 = GetPixel(GetDC(0), tree1x, tree1y)
        Dim minus As Integer = tree1 - 300000
        Dim plus As Integer = tree1 + 300000
        If minus < tree1b And plus > tree1b Then
            SetCursorPos(tree1x, tree1y)
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
        Else
            Dim dc As IntPtr = GetDC(0)             
            tree2 = GetPixel(dc, tree2x, tree2y)
            Dim minus1 As Integer = tree2 - 300000
            Dim plus1 As Integer = tree2 + 300000
            If minus1 < tree2b And plus1 > tree2b Then
                SetCursorPos(tree2x, tree2y)
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            End If
            ReleaseDC(0,dc)
        End If

A k deklarácii GetDC pridajte aj ReleaseDC:

<System.Runtime.InteropServices.DllImport("user32.dll")> _
Public Function GetDCint ReleaseDC(hWnd As IntPtr, HDC As IntPtr)
End Function
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pozerám že som tam napísal nejakú blbosť, tak sa ospravedlňujem, správne má byť:

<System.Runtime.InteropServices.DllImport("user32.dll")> _
Public Function ReleaseDC(hWnd As IntPtr, HDC As IntPtr) As Integer
End Function

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel jsem to upravit ale pokaždé ta samá chyba. Asi musí být problém v něčem jiném.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback