Forum » Programiranje » [C#] Sesutje aplikacije
[C#] Sesutje aplikacije
ql000 ::
Delam aplikacijo, kjer je pomemebno, da sta dva fizična objekta sinhronizirana, Unibrain kamera in Microscribe roka. Kamero krmilim preko FireWire, roko pa preko serijskih vrat. Ko prileti frame iz kamere v comp, se sproži Callback metoda, ki zahteva koordinate roke v tistem trenutku. Podatki (slika in koordinate) se shranjujejo v bytno polje v memorijo, pač zaradi hitrosti, ko je pa celotna meritev opravljena pa se podatki shranijo na disk. Občasno se zgodi, da se aplikacija sesuje in vedno je kriv stavek:
frameData je podatke tipa IntPtr, FramBuffer je byte[], Counter*FrameSize, FrameSize sta neka indexa, ki se povečujeta z vsakim framom, ki prileti.
Zakaj pride do sesutja, kak memory leakage,...?
Tu je še cela CallBack metoda:
Ker hec je v tem, da zadeva deluje, občasno pa vseeno pride do sesutja.
Marshal.Copy(frameData, FrameBuffer, Counter*FrameSize, FrameSize);
frameData je podatke tipa IntPtr, FramBuffer je byte[], Counter*FrameSize, FrameSize sta neka indexa, ki se povečujeta z vsakim framom, ki prileti.
Zakaj pride do sesutja, kak memory leakage,...?
Tu je še cela CallBack metoda:
public static void OnFrameArrived(IntPtr frameData) { StopWatch.Reset(); StopWatch.Start(); RunMicroscribe(out x, out y, out z); // Ko pride frame pošlji koordinate iz roke! StopWatch.Stop(); System.Console.WriteLine(" Pretečen čas: {0}ms", StopWatch.Elapsed.TotalMilliseconds.ToString()); Marshal.Copy(frameData, FrameBuffer, Counter*FrameSize, FrameSize); CoordArray[3*Counter] = x; // V CoordArray vpisujem po 3 koordinate CoordArray[3*Counter + 1] = y; CoordArray[3*Counter + 2] = z; System.Console.WriteLine(" Koordinate so: X={0}, Y={1}, Z={2}", x, y, z); // Izpiši koordinate System.Console.WriteLine(" Counter = {0}", Counter); Counter = Counter + 1; // Iteracija Counterja! }
Ker hec je v tem, da zadeva deluje, občasno pa vseeno pride do sesutja.
- spremenil: ql000 ()
Vesoljc ::
mogoce res ne bi skodilo, da poves KATERI eror ti debuger pljune ven...
Abnormal behavior of abnormal brain makes me normal...
mHook ::
Če se ti exception pojavi dokaj hitro (oz. znano kdaj), potem se z debugerjem priključi na proces in nastavi breakpoint.
Okoli memory leakinga pa si pomagaj s ProcessExplorerjem in/ali kakšnim profilerjem ( .NET 2 Profiler, ANTS Profiler,...).
Okoli memory leakinga pa si pomagaj s ProcessExplorerjem in/ali kakšnim profilerjem ( .NET 2 Profiler, ANTS Profiler,...).
ql000 ::
Unhandled Exception: System.ArgumentOutOfRangeException: Requested range extends
past the end of the array.
at System.Runtime.InteropServices.Marshal.CopyToManaged(IntPtr source, Object
destination, Int32 startIndex, Int32 length)
at System.Runtime.InteropServices.Marshal.Copy(IntPtr source, Byte[] destinat
ion, Int32 startIndex, Int32 length)
at Test_microscribe.Program.OnFrameArrived(IntPtr frameData) in C:\Documents
and Settings\Darinka\My Documents\Visual Studio 2005\Projects\Test microscribe\T
est microscribe\Program.cs:line 191
at Firei.FrameCallback(UInt32 uCameraIndex, Double dblSampleTime, Byte* pBuff
er, tagBITMAPINFOHEADER* pbih, Void* Context)
System.ArgumentOutOfRangeException: Requested range extends past the end of the array. --> ta mi je najbolj sumljiv, samo, zakaj zadeva potem večinoma dela?
past the end of the array.
at System.Runtime.InteropServices.Marshal.CopyToManaged(IntPtr source, Object
destination, Int32 startIndex, Int32 length)
at System.Runtime.InteropServices.Marshal.Copy(IntPtr source, Byte[] destinat
ion, Int32 startIndex, Int32 length)
at Test_microscribe.Program.OnFrameArrived(IntPtr frameData) in C:\Documents
and Settings\Darinka\My Documents\Visual Studio 2005\Projects\Test microscribe\T
est microscribe\Program.cs:line 191
at Firei.FrameCallback(UInt32 uCameraIndex, Double dblSampleTime, Byte* pBuff
er, tagBITMAPINFOHEADER* pbih, Void* Context)
System.ArgumentOutOfRangeException: Requested range extends past the end of the array. --> ta mi je najbolj sumljiv, samo, zakaj zadeva potem večinoma dela?
Vesoljc ::
izpisuj si indexe ter velikost arraya
Abnormal behavior of abnormal brain makes me normal...
ql000 ::
Evo sem pogledal! Zgodba je taka, da mora biti Counter*FrameSize manjši od FrameBuffer.Length. In to dejansko je. Vrednosti indexov in velikosti so iste, tako v primeru, ko se aplikacija izvede v redu, kot tudi v primeru crash-a!
A je varijanta, da katera druga aplikacija ali proces, lahko tudi znotraj iste aplikacije, šara po tem delu memorije, ki jo jaz uporabljam?
Hec je tudi v tem, da dokler delam z malim poljem, ranga nekaj elementov, zadeva deluje 100%, tukaj delam z poljem ranga 55.290.000 bytov, se mu pa sfuzla! RAM-a imam 512MB, tako, da to ne bi smel biti problem.
Če ne bo šlo drugače, bom v ta del Marshal.Copy fliknu Exception, ta se vedno pojavi pri zadnjem fram-u. Zadnji frame in koordinato zavržem, pa bom videl, kaj bo. Ta Marshal.Copy mi malo smrdi.
A je varijanta, da katera druga aplikacija ali proces, lahko tudi znotraj iste aplikacije, šara po tem delu memorije, ki jo jaz uporabljam?
Hec je tudi v tem, da dokler delam z malim poljem, ranga nekaj elementov, zadeva deluje 100%, tukaj delam z poljem ranga 55.290.000 bytov, se mu pa sfuzla! RAM-a imam 512MB, tako, da to ne bi smel biti problem.
Če ne bo šlo drugače, bom v ta del Marshal.Copy fliknu Exception, ta se vedno pojavi pri zadnjem fram-u. Zadnji frame in koordinato zavržem, pa bom videl, kaj bo. Ta Marshal.Copy mi malo smrdi.
Zgodovina sprememb…
- spremenil: ql000 ()
ql000 ::
Zdej mi je kapilo! Včasih se zgodi, da mi Counter, to je nek globalni števec, ki šteje število frame-ov, ki priletijo v računalnik, preskoči v nedovoljeno vrednost.
Pri if (Counter == FrameNo) zna priti do lapsusa. Counter je globalna spremenljivka, tipa Int32. Kako se zasigurat, da ne pride do overflowa dovoljene vrednosti?
System.Console.WriteLine(" Zaganjam kamero..."); Camera1.InitStream(0,0); // Tega je treba zinicializirat, da baraba dela!! // MFI se ne sklada z CFI!!, tako, da Help file ni ravno od koristi Camera1.CallbackFormat = FiPixelFormat.RGB_24; Camera1.onFrameArrived += new FiCamera.OnFrameArrived(OnFrameArrived); Camera1.Run(); // Zalaufam kamero! for ( ; ; ) // Ena neskončna zanka, da vidim, kaj se sploh dogaja { //Camera1.SaveFrame(@"c:\programi\myframe.bmp"); if (Counter == FrameNo) // XX framov poberem in zaključim { Camera1.Stop(); // Ugasnem kamero Camera1.ShutdownStream(); break; // Izhod iz zanke } } System.Console.WriteLine(" Shranjujem podatke! Prosim pocakaj...");
Pri if (Counter == FrameNo) zna priti do lapsusa. Counter je globalna spremenljivka, tipa Int32. Kako se zasigurat, da ne pride do overflowa dovoljene vrednosti?
ql000 ::
Takoj ob inicializaciji ga postavim na 0. Aplikacija je živa znotraj ene meritve. Kar pomeni, da se števec uporablja samo enkrat.
Vesoljc ::
pa dejansko gres cez to mejo (232 / 2)??
cist tko, ni bolje ce najprej ugasnes stream, potem pa se kamero?
cist tko, ni bolje ce najprej ugasnes stream, potem pa se kamero?
Abnormal behavior of abnormal brain makes me normal...
ql000 ::
Sej v tem je hec, ker posnamem 60 frame-ov. Glede streama in ustavljavnja kamere se strinjam, samo sem videl v nekem sourcu od proizvajalca kamere, da najprej ugasne stream, šele potem pa kamero.
Včasih se zgodi, da enostavno ne upošteva iteracije števca. Mogoče malo preveč mikrokontrolersko razmišljam ?!
Včasih se zgodi, da enostavno ne upošteva iteracije števca. Mogoče malo preveč mikrokontrolersko razmišljam ?!
Jean-Paul ::
Se mi rahlo dozdeva, kaj bi lahko bilo. Za zacetek poskusi preverjati tvoj stevec tudi v callback rutini. Ce stevec preseze maksimalno stevilo framov, ki jih lahko shranis v svoj buffer, potem izpusti kopiranje v ta buffer. Ce bo to obrodilo sadove, smo na dobri poti. Javi!
LP
LP
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | kako narediti program ki bere drugi programOddelek: Programiranje | 5744 (4057) | imagodei |
» | [c#] naloga za maturo...rabim majhno pomocOddelek: Programiranje | 2333 (1670) | ql000 |
» | C# in slika iz kamereOddelek: Programiranje | 1351 (1235) | ql000 |
» | [C#] IndexOutOfRange ExceptionOddelek: Programiranje | 1300 (1145) | ql000 |
» | [C#] unmanaged->managed codeOddelek: Programiranje | 2141 (2016) | Zzzzzzz |