"Programma werkt niet meer"

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dag vrienden,

Ik ben een programma aan het maken waarmee foto's gemaakt kunnen worden. Ik maak dit programma voor
het bedrijf waar ik werk. Deze foto's worden op een Pdf-bestand geplaatst, wat heel degelijk werkt.

Ik gebruik de library van Microsoft: Expression Encoder, om de webcam te kunnen gebruiken.
Het programma draait op een tablet met Windows 10.

Nu gebeurt het soms, dat wanneer de camera op start, of er een foto gemaakt moet worden (zie code),
dat het programma vast loopt en het beruchte "Programma werkt niet meer"-scherm verschijnt. Er wordt dan gezocht naar een oplossing voor het probleem, wat eindeloos duurt en niet werkt ;p

Nu heb ik geen flauw idee waar deze fout vandaan kan komen, of wat ik er aan moet doen. Ik krijg ook geen foutmelding, alleen het gegeven dat er ergens iets fout gaan, en wat het programma doet crashen.

Mijn code: (let niet te veel op hoe het geschreven is aub, tenzij daar het probleem ligt ;p)

C#: snap.cs
1
2
3
4
5
Mode Modus;
     LiveJob live;
     LiveDeviceSource source;
     Bitmap result;
 


Deze code wordt uitgevoerd wanneer de usercontrol waaruit de foto gemaakt wordt, wordt geladen. In het gros van de gevallen loopt dit gewoon prima.

C#: snap.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  
public void Initiate()
     {
        
         try
         {
             live = new LiveJob();
             source = live.AddDeviceSource(((Checklist)this.Parent).WebCam, ((Checklist)this.Parent).Audio);
             SourceProperties sp = source.SourcePropertiesSnapshot();
             panel1.Size = sp.Size;
             live.OutputFormat.VideoProfile.Size = new Size(sp.Size.Width, sp.Size.Height);
             source.PreviewWindow = new PreviewWindow(new System.Runtime.InteropServices.HandleRef(panel1, panel1.Handle));
             live.ActivateSource(source);
         }
         catch (Exception c)
         {
             ((MainForm)this.ParentForm).Log("Foutmelding: " + c.Message.ToString());
             MessageBox.Show(c.InnerException.ToString());
         }
     }
  


Vervolgens kan er middels een knop een foto worden gemaakt. Dit gebeurt als volgt:

C#: snap.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  
try
             {
                 Bitmap b = new Bitmap(panel1.Size.Width, panel1.Size.Height);
                 using (Graphics g = Graphics.FromImage(B))
                 {
                     Rectangle r = new Rectangle();
                     Point sp = panel1.PointToScreen(new Point(panel1.ClientRectangle.X, panel1.ClientRectangle.Y));
                     g.CopyFromScreen(sp, Point.Empty, panel1.Size);
                 }
                 panel1.BackgroundImage = b;
                 XImage x = XImage.FromGdiPlusImage(B);
                 button2.Enabled = true;
                 live.StopEncoding();
                 live.RemoveDeviceSource(source);
                 source.PreviewWindow = null;
                 source = null;
                 live = null;
             }
             catch (Exception ee)
             {
                 MessageBox.Show(ee.Message);
                 ((MainForm)this.ParentForm).Log("Foutmelding: " + ee.Message.ToString());
             }

 


Ik heb geen idee waar ik moet beginnen met zoeken. Bovenstaande code heb ik verkregen uit de documentatie bij de library, en door zelf wat te knutselen.

Als jullie me zouden kunnen, heel graag!

Alvast bedankt en groeten,

Thijs

Alle reacties


Acties:
  • +1 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Begin eerst eens met het kijken in de windows EventLog, daar staat als het goed is meer informatie over waarom het gecrashed is. Daarnaast kun je eens logging toevoegen aan je applicatie over unhandled exceptions: MSDN: How to Handle .NET Unhandled Exceptions Gracefully – Half Blood P...

Anders kun je nog eens gaan kijken naar de crashdump, en met iets als windbg kijken wat er nou precies mis ging: MSDN: Basic Analysis of a Managed Memory Dump (.NET) – Practical Develo...

[ Voor 18% gewijzigd door Woy op 14-07-2016 09:35 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

Ik heb geen idee waar ik moet beginnen met zoeken. Bovenstaande code heb ik verkregen uit de documentatie bij de library, en door zelf wat te knutselen.
Oei.

En begin eens met debuggen, draai de applicatie met een (remote) debugger er aan, dan kun je precies zien waar het mis gaat.

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dankje Woy! Ga ik mee aan de slag. Zo op het eerste gezicht lijkt er een probleem te zijn rondom ntdll.dll. M'n logboek zegt het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Logboeknaam:   Application
 Bron:          Application Error
 Datum:         14-7-2016 08:46:34
 Gebeurtenis-id:1000
 Taakcategorie: (100)
 Niveau:        Fout
 Trefwoorden:   Klassiek
 Gebruiker:     n.v.t.
 Computer:      Tablet-Lijncontrole-1
 Beschrijving:
 Naam van toepassing met fout: ....exe, versie: 1.0.0.0, tijdstempel: 0x57862ad8
 Naam van module met fout: ntdll.dll, versie: 10.0.10240.16392, tijdstempel: 0x55a85cc1
 Uitzonderingscode: 0xc0000374
 Foutmarge: 0x000e1267
 Id van proces met fout: 0xccc
 Starttijd van toepassing met fout: 0x01d1dd8c2078f4a7
 Pad naar toepassing met fout: C:\Program Files\....exe
 Pad naar module met fout: C:\Windows\SYSTEM32\ntdll.dll
 Rapport-id: f60b6c48-180d-4f3f-b82a-cf92a6662bc9
 Volledige pakketnaam met fout: 
 Relatieve toepassings-id van pakket met fout: 
 Gebeurtenis-XML:
 <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
   <System>
     <Provider Name="Application Error" />
     <EventID Qualifiers="0">1000</EventID>
     <Level>2</Level>
     <Task>100</Task>
     <Keywords>0x80000000000000</Keywords>
     <TimeCreated SystemTime="2016-07-14T06:46:34.000000000Z" />
     <EventRecordID>1566</EventRecordID>
     <Channel>Application</Channel>
     <Computer>Tablet-Lijncontrole-1</Computer>
     <Security />
   </System>
   <EventData>
     <Data>....exe</Data>
     <Data>1.0.0.0</Data>
     <Data>57862ad8</Data>
     <Data>ntdll.dll</Data>
     <Data>10.0.10240.16392</Data>
     <Data>55a85cc1</Data>
     <Data>c0000374</Data>
     <Data>000e1267</Data>
     <Data>ccc</Data>
     <Data>01d1dd8c2078f4a7</Data>
     <Data>C:\Program Files\...\....exe</Data>
     <Data>C:\Windows\SYSTEM32\ntdll.dll</Data>
     <Data>f60b6c48-180d-4f3f-b82a-cf92a6662bc9</Data>
     <Data>
     </Data>
     <Data>
     </Data>
   </EventData>
 </Event>

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

En dat zegt je.. eh vrij weinig? ;) Nogmaals, hang er een (remote) debugger aan kijk dan waar het mis gaat. Dan kun je véél gerichter je vraag stellen.

Nu komt het over alsof wij maar even voor je moeten debuggen ;)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Ik ben niet heel bekend met development voor Windows, maar hoe zit het met de case-sensitivity van variabelen? Ik zie variabele b gedeclareerd worden, maar in de vervolg-code wordt B gebruikt?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
CH40S schreef op donderdag 14 juli 2016 @ 10:17:
Ik ben niet heel bekend met development voor Windows, maar hoe zit het met de case-sensitivity van variabelen? Ik zie variabele b gedeclareerd worden, maar in de vervolg-code wordt B gebruikt?
Geen idee hoe die hoofdletter daar komt haha. In m'n originele code staat er inderdaad gewoon een kleine 'b'.
Ventieldopje schreef op donderdag 14 juli 2016 @ 10:00:
En dat zegt je.. eh vrij weinig? ;) Nogmaals, hang er een (remote) debugger aan kijk dan waar het mis gaat. Dan kun je véél gerichter je vraag stellen.

Nu komt het over alsof wij maar even voor je moeten debuggen ;)
Zegt me inderdaad niet veel. En dat is niet het geval hoor, ik ga er eens naar kijken!
#edit: Het probleem is ook een beetje dat het probleem bijna niet voor komt. Het programma wordt de hele dag gebruikt, dan worden er zo'n 100 foto's genomen, maar misschien komt het éen keer per dag voor. Met debuggen is dat dus lastig. Ik heb net denk ik eventjes 50x de camera opgestart en een foto gemaakt, en dat ging allemaal goed ;p Maar er staat me iets van bij dat ik via de Visual Studio debugger geen foutmelding kreeg, maar dat de boel gewoon vast liep. Ik kom hier op terug als ik meer weet.

Bedankt in ieder geval
Thijs

[ Voor 22% gewijzigd door Verwijderd op 14-07-2016 11:28 ]


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

Dat komt denk ik omdat je de fouten afvangt met try catch. Wat gebeurd er als je bij de catch een breakpoint zet en dan een hoop foto's gaat maken?

Als hij dan alsnog gewoon freezed lijkt het mij eerder een driver issue. Al krijg je dan wel vaak een blauw scherm.

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Even post tussendoor, ik kreeg zojuist tijdens het gebruik zonder debugger wederom de fout. De eventLog geeft dit weer:

Uitzonderingsinformatie: System.AccesViolationException

Ik weet verder niet veel van Exceptions af, zou het kunnen zijn dat dit soort exceptions niet opgevangen worden in m'n try statement en daarom er een crash optreedt?

De stack ziet er als volgt uit:

Stack:
bij MS.Internal.Expression.Encoder.Live.LiveEncode.CreateTimelineSegments()
bij MS.Internal.Expression.Encoder.Live.LiveEncode.StopEncoding()
bij Microsoft.Expression.Encoder.Live.LiveJob.StopEncoding()
bij Noordhuys_Material.Snap.button1_Click(System.Object, System.EventArgs)
bij .... enz..

Zegt dit jullie misschien iets?

Alvast bedankt!

PS: Ik zou er graag verder in duiken wat betreft de exceptions en de foutmeldingen die ik krijg, maar daar heb ik momenteel simpelweg geen tijd voor. Omdat het programma eigenlijk toch draaiende moet blijven zou ik het graag zo willen proberen.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Een AccessViolation geeft aan dat je geheugen probeert aan te spreken dat niet valide is. Als ik je code zo zie, en de grove manier van Exception handling is er waarschijnlijk eerder al iets mis gegaan waardoor je gebruikte component niet meer in de juiste staat is.

Ik zou eerst eens beginnen met betere logging toevoegen.
PS: Ik zou er graag verder in duiken wat betreft de exceptions en de foutmeldingen die ik krijg, maar daar heb ik momenteel simpelweg geen tijd voor. Omdat het programma eigenlijk toch draaiende moet blijven zou ik het graag zo willen proberen.
Dat is natuurlijk niet ons probleem. Zorg dus eerst eens dat je een goede test omgeving hebt, en zorg dat je er tijd voor hebt.

[ Voor 37% gewijzigd door Woy op 14-07-2016 11:53 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

Even misschien totaal ongerelateerd maar het viel mij op. Waarom roep je dit aan nadat voordat je alsnog het hele object disposed? Het is koffiedik kijken maar misschien gaat het mis bij het opruimen? Lijkt mij een beetje onnodig:

code:
1
live.RemoveDeviceSource(source);

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Wat start de procedure en waar draait deze?
Is het namelijk niet zoiets simpels als dat iemand te snel op de knop drukt waardoor de procedure 2x naast elkaar loopt (en de ene de close doet waardoor de andere geen toegang meer heeft tot de data)

Want zeker iets als een camera zal geen echte multithreading ondersteunen (bij het maken van foto's)

Acties:
  • +2 Henk 'm!

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 25-08 11:27
Is het niet zo dat LiveJob en LiveDeviceSource disposables zijn? (Implementeren IDisposable). In dat geval moet je Dispose() aanroepen voordat je je variabelen weer op null zet.

Dispose() ruimt het object en zijn resources netjes op.


Verder vind ik het raar dat je een soort screenshot maakt van een panel via CopyFromScreen om je plaatje op te slaan. Het lijkt me dat de Expression Encoder sdk wel mooiere methoden heeft om dat te doen.

[ Voor 29% gewijzigd door epic007 op 14-07-2016 14:40 ]


Acties:
  • 0 Henk 'm!

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

epic007 schreef op donderdag 14 juli 2016 @ 14:33:
Is het niet zo dat LiveJob en LiveDeviceSource disposables zijn? (Implementeren IDisposable). In dat geval moet je Dispose() aanroepen voordat je je variabelen weer op null zet.
Of binnen een using(...) { } block zetten. Dacht dat dat de juiste manier van werken was met IDisposables.

Signature van nature


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 08:37
epic007 schreef op donderdag 14 juli 2016 @ 14:33:
Verder vind ik het raar dat je een soort screenshot maakt van een panel via CopyFromScreen om je plaatje op te slaan. Het lijkt me dat de Expression Encoder sdk wel mooiere methoden heeft om dat te doen.
Ik vond het ook raar.. tot ik ging kijken of het op een andere manier kon (in UWP kan het immers heel simpel met de MediaCapture class welke opties heeft om foto's en video's te maken) maar dit schijnt blijkbaar "de" manier te zijn met Expression Encoder.

Maar aangezien het spul blijkbaar op een windows 10 tablet draait is het wellicht een idee om een UWP app te maken.

[ Voor 16% gewijzigd door Killah_Priest op 14-07-2016 18:50 ]


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

epic007 schreef op donderdag 14 juli 2016 @ 14:33:
Is het niet zo dat LiveJob en LiveDeviceSource disposables zijn? (Implementeren IDisposable). In dat geval moet je Dispose() aanroepen voordat je je variabelen weer op null zet.

Dispose() ruimt het object en zijn resources netjes op.


Verder vind ik het raar dat je een soort screenshot maakt van een panel via CopyFromScreen om je plaatje op te slaan. Het lijkt me dat de Expression Encoder sdk wel mooiere methoden heeft om dat te doen.
Het is inderdaad een disposable ;)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de snelle reacties allemaal! Ik ga morgen op vakantie, daarna ga ik er verder mee aan de slag.

Groeten,
Thijs
Pagina: 1