BitmapImage immer im Besitz von einem Thread...

  • WPF

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von EugenIS.

    BitmapImage immer im Besitz von einem Thread...

    Hallo Leute und danke für es reinschauen...

    hab ein kleines problem:

    angenommen ich hätte irgend wo ein BitmapImage Objekt...
    Egal wie ich drauf zugreife, ist es irgend wie im Besitz von einem Thread. Beispiel:

    public class blalba...

    private BitmapImage _BitmapImage = new BitmapImage();

    _DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    ...
    ...
    _BitmapImage = null; //Fehler...


    bin echt ein wenig ratlos. Delegate bringt in dem Fall auch irgend wie nichts. Und es in BackgroundWorker_ProgressChanged auszulagern bring auch nichts. hm... Kann mich da jemand mal was besserem belehren?

    danke im voraus.
    Wenn du die Klasse innerhalb eines Threads instanzierst vermutlich ja.
    Das wissen wir ja nicht. Erkläre mal was du machen willst.

    Du schreibst was von wegen backgroudworker. Vergiss die mal unter wPF. Besser. Vergiss die überhaupt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    EugenIS schrieb:

    warum soll ich die vergessen? wie macht ihr das den wenn ihr im hintergrund was machen wollt?


    Ich verwende einen Task oder, in Ausnahmefällen, nen Thread. Den BackgroundWorker hab ich bisher noch nie benötigt.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hallo

    Ich verwende Async/Await. Angenehm anzuwenden. Aber man muss es verstehen.
    Aber ErfinderDesRades hat ein Tut über AsyncAwait gemacht.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Aber ErfinderDesRades hat ein Tut über AsyncAwait gemacht

    Da du anscheinend nicht suchen willst mache ich das für dich. Aber gerne.
    Hier das Tut.


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @EugenIS sei doch so gut und schliesse deine Themen ab wenn sich diese erledigt haben. So weis jeder das das Thema erledigt ist. Du hast einige Themen offen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    EugenIS schrieb:

    manch eine Sache bekomme ich einfach nicht übersetzt in C#

    Is natürlich eine tolle Fehlerbeschreibung :P

    Was ist dir denn unklar?
    Was genau willst du überhaupt machen?

    Nofear23m schrieb:

    Erkläre mal was du machen willst.

    Habe ich ja schon mal gefragt, du willst es aber irgendwie nicht beantworten.
    Vieleicht ist das problem ja sogar noch einfacher zu lösen.

    Hier noch ein sehr guter Artikel. Damit solltest du gut zurechtkommen.
    Sehr gut geschrieben und einfach erklärt. Habe ich schon länger in meinen Favoriten.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Naja, was ich immer befürchte ist, diese endlos dämliche Sprüche wofür man so etwas braucht und eigentlich kommt bei vollständigen Problembeschreibungen sowieso nicht bei raus. Daher versuche ich es so kurz wie möglich halten...

    Wie dem auch sei, möchte ich eine Visuelle Lichtschranke haben, die einen Bild sich ansieht, Filtert, und hinterher auswertet ob es gut, oder schlecht ist.
    Wenn man das ganze in "schritte" unterteilen würde wäre es so:
    WebCam (Anzeige Bild 1)
    Foto
    FotoBereich (Anzeige Bild 2)
    FotoFilter (Anzeige Bild 2)
    Auswertung (Result)

    Zur Zeit ist es halt so, dass ich die WebCam an habe, kann auch ein Foto schießen, Bereich eingrenzen und es Filtern...
    Blöderweise kann ich es nicht gefiltert darstellen, weil es ständig irgend wie von einem anderen Thread beansprucht wird. Selbst wenn ich ein bmp in meinem BGW erstelle, dann ist es schon von einem anderen Thread beansprucht und es fällt auf die Nase, was mich sehr wundert...

    Bevor mir einer hier reinschreibt "mit einer LED und einem Lichtsensor wäre die Angelegenheit auch gegessen" möchte ich vorab sagen; wenn es funktioniert hätte, würde ich es nehmen...

    Habe mir das hier angesehen: c-sharpcorner.com/article/async-and-await-in-c-sharp/
    Bin halt gerade noch bei...
    OK, da ich den Code mit welchem du dieses Bild erstellst (von der Webcam) nicht kenne rate ich mal ins blaue das dieser Code das Bitmap in einem NebenThread erstellt und dir reinreicht.
    Natürlich kommst du hier mit Async/Await auch nicht weit.

    Und GENAU das ist es warum man IMMER schreiben sollte was man macht und was man will.

    Du hättest dir nun tagelange probiererei ersparen können. Nun ja. Deine Sache.

    Ich werde sicher nicht Anfangen mit die zu diekutieren warum und weshalb du was machst. Ist mir ja schnuppe. Du willst was proggen, dann mach das auch. Verstehe deine bedenken nicht. Aber OK.

    Also, du musst zusehen das du das Objekt wieder in den UI Thread bekommst. Hierfür kann man z.b. die Dispatcher Klassen verwenden.
    Aber bevor du dich jetzt lange damit rumquälst würde ich dir empfehlen mir mal den Code Online zu stellen welcher dir das besagte BitmpaImage Objekt erzeug mit welchem du diese Probleme hast.

    Mal sehen ob es vieleicht noch besser zu lösen ist.

    PS: Wie bereits oben geschrieben ist es schon sehr egoistisch wenn du deine Threads so vernachlässigst. Antworte bitte darauf oder schliesse diese ab. Wir nehmen uns die Zeit dir zu Helfen, da kannst du dir die paar Sekunden nehmen deine Threads zu aktualisieren oder? Danke im Voraus.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hilft dir das weiter? Habe bis dato das...

    C#-Quellcode

    1. public csGlobalControl()
    2. {
    3. csTimer.DateTimeChanged += CsTimer_DateTimeChanged;
    4. if (csDEtErr != null)
    5. csDEtErr.Start();
    6. csBackgroundWorker.RunWorkerAsync();
    7. }
    8. private csBackgroundWorker _csBackgroundWorker = null;
    9. public csBackgroundWorker csBackgroundWorker
    10. {
    11. get
    12. {
    13. if (_csBackgroundWorker == null)
    14. {
    15. _csBackgroundWorker = new csBackgroundWorker();
    16. _csBackgroundWorker.DoWork += _csBackgroundWorker_DoWork;
    17. _csBackgroundWorker.ProgressChanged += _csBackgroundWorker_ProgressChanged;
    18. _csBackgroundWorker.RunWorkerCompleted += _csBackgroundWorker_RunWorkerCompleted;
    19. }
    20. return _csBackgroundWorker;
    21. }
    22. }
    23. private bool _CamConnect = false;
    24. private bool CamConnect
    25. {
    26. get
    27. {
    28. return _CamConnect;
    29. }
    30. set
    31. {
    32. if (_CamConnect == value)
    33. return;
    34. _CamConnect = value;
    35. try
    36. {
    37. if (_CamConnect)
    38. {
    39. MediaConnector.Connect(IWebCamera.VideoChannel, DrawingImageProvider);
    40. MediaConnector.Connect(IWebCamera.VideoChannel, SnapshotHandler);
    41. VideoViewerWPF.SetImageProvider(DrawingImageProvider);
    42. IWebCamera.Start();
    43. VideoViewerWPF.Start();
    44. }
    45. else
    46. {
    47. VideoViewerWPF.SetImageProvider(null);
    48. IWebCamera.Stop();
    49. VideoViewerWPF.Stop();
    50. }
    51. }
    52. catch (Exception ex)
    53. {
    54. csGlobalHelper.ShowError(ex);
    55. }
    56. }
    57. }
    58. private delegate void UpDelegate(BitmapImage img);
    59. private UpDelegate _udDelegate;
    60. private UpDelegate upDelegate
    61. {
    62. get
    63. {
    64. if (_udDelegate == null)
    65. _udDelegate = new UpDelegate((BitmapImage img1) =>
    66. {
    67. imgDelegate(img1);
    68. });
    69. return _udDelegate;
    70. }
    71. }
    72. private void imgDelegate(BitmapImage img)
    73. {
    74. try
    75. {
    76. var tmp = img.Clone();
    77. Image.Source = tmp;
    78. }
    79. catch (Exception ex)
    80. {
    81. csGlobalHelper.ShowError(ex);
    82. }
    83. }
    84. private void _csBackgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    85. {
    86. try
    87. {
    88. var tmpBGW = (csBackgroundWorker)sender;
    89. CamConnect = true;
    90. tValues tVal_0 = null;
    91. tValues tVal_1 = null;
    92. tValues tVal_2 = null;
    93. tValues tVal_3 = null;
    94. using (var tmpCon = new csDataBase_IIEntities())
    95. {
    96. tVal_0 = tmpCon.Database.SqlQuery<tValues>(string.Format("SELECT TOP 1 * FROM [cs].[tValues] WHERE vNumber = {0}", tValues.eNumber.PosX_0.ToInt32())).FirstOrDefault();
    97. tVal_1 = tmpCon.Database.SqlQuery<tValues>(string.Format("SELECT TOP 1 * FROM [cs].[tValues] WHERE vNumber = {0}", tValues.eNumber.PosX_1.ToInt32())).FirstOrDefault();
    98. tVal_2 = tmpCon.Database.SqlQuery<tValues>(string.Format("SELECT TOP 1 * FROM [cs].[tValues] WHERE vNumber = {0}", tValues.eNumber.PosY_0.ToInt32())).FirstOrDefault();
    99. tVal_3 = tmpCon.Database.SqlQuery<tValues>(string.Format("SELECT TOP 1 * FROM [cs].[tValues] WHERE vNumber = {0}", tValues.eNumber.PosY_1.ToInt32())).FirstOrDefault();
    100. }
    101. var image = SnapshotHandler.TakeSnapshot().ToImage();
    102. //image.Save(tmpUrl);
    103. var tmpp = (Bitmap)image;
    104. for (int i = 0; i < tmpp.Height; i++)
    105. {
    106. for (int j = 0; j < tmpp.Width; j++)
    107. {
    108. var tmpCol = tmpp.GetPixel(j, i);
    109. var rgb = ((tmpCol.R + tmpCol.G + tmpCol.B) / 3);
    110. if (rgb > 60)
    111. rgb = 255;
    112. else
    113. rgb = 0;
    114. if (i == 100)
    115. tmpp.SetPixel(j, i, Color.FromArgb(124, 252, 0));
    116. else
    117. tmpp.SetPixel(j, i, Color.FromArgb(rgb, rgb, rgb));
    118. }
    119. }
    120. var tmp = new BitmapImage();
    121. //tmp = Convert(tmpp);
    122. //Image.Source = tmp;
    123. //BitmapImage = Convert(tmpp);
    124. //var tmp = Convert(tmpp).Clone();
    125. //tmp.
    126. tmpBGW.ReportProgress(1, new BitmapImage());
    127. }
    128. catch (Exception ex)
    129. {
    130. csGlobalHelper.ShowError(ex);
    131. }
    132. }
    133. private void _csBackgroundWorker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
    134. {
    135. try
    136. {
    137. if (e.ProgressPercentage == 1)
    138. if (Application.Current.Dispatcher.CheckAccess())
    139. imgDelegate((BitmapImage)e.UserState);
    140. else
    141. Application.Current.Dispatcher.BeginInvoke(upDelegate, (BitmapImage)e.UserState);
    142. }
    143. catch (Exception ex)
    144. {
    145. csGlobalHelper.ShowError(ex);
    146. }
    147. }
    148. private void _csBackgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
    149. {
    150. try
    151. {
    152. }
    153. catch (Exception ex)
    154. {
    155. csGlobalHelper.ShowError(ex);
    156. }
    157. }
    1.) Mit dem Code fängt man nicht viel an. Unvollständig. Lade in diesem Fall ein Testprojekt hoch. Erstelle ein neues Projekt nur mit dem wichtigsten und stelle das problem nach.
    2.) Wenn dir in einem Beitrag jemand Fragen stellt gehe bitte darauf ein und versuche diese zu beantworten, sonst wird dir dieser jemand vermutlich auch nicht mehr Antworten ;)
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    EugenIS schrieb:

    Welche frage hab ich den jetzt schon wieder nicht beantwortet...


    Nofear23m schrieb:

    Wir nehmen uns die Zeit dir zu Helfen, da kannst du dir die paar Sekunden nehmen deine Threads zu aktualisieren oder?

    Wie oft habe ich das nun geschrieben, ausserdem habe ich gebeten ein sauberes Projekt hochzuladen, machst du auch nicht.
    Du willst nicht? ok
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m drück nicht so doll... manchmal finde ich nicht die zeit sich jeden tag damit zu beschäftigen. das bedeutet nicht, dass es für mich abgeschlossen ist....

    Also irgend wie tut nix aus euren beispielen. selbst wenn man das ganz einfach aus der seite rauskopiert, beginnt er mir dies und das grün anzuzeichnen... ich weis garnicht was ich hochladen soll...

    hab das hier auch mal ausprobiert: docs.microsoft.com/de-de/dotne…ing-guide/concepts/async/

    da ist alles rot und grün selbst wenn man nichts macht... :( Frustrierend...
    Bilder
    • Unbenannt55.PNG

      27,85 kB, 584×651, 93 mal angesehen
    Ich sag dazu nix mehr. Code kopieren ohne ihn zu verstehen bringt hald nicht viel. Und da du dazu nicht im Stande bist aber ein Beispielprojekt hochzuladen welches dein problem beschreibt, und nur das, anscheinend auch nicht willst- denn das hatte ich gefordert - bin ich nicht im stande dir zu helfen.

    Vieleicht andere, ich leider nicht.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Was ist daran verkehrt? Was ich ganz ganz toll finde, man erzählt mir hier, vergiss dies vergiss das, und selbst ist man nicht in der Lage eine einfache Klasse mit einem Construktor und einem asynchronen Aufruf mir zu zeigen. ungefähr so:

    construktor(){

    }

    AufrufDerPermanenntLaufenSollImHintergrund(){

    }

    Finde ich so toll immer. Das mutiviert echt neue Systeme auszuprobieren.

    EugenIS schrieb:

    Was ist daran verkehrt? (Code kopieren ohne zu verstehen)
    Komische Frage - du merkst doch selbst, dasses nix bringt.



    EugenIS schrieb:

    selbst ist man nicht in der Lage eine einfache Klasse mit einem Construktor und einem asynchronen Aufruf mir zu zeigen. ungefähr so....
    Bitte sehr:

    C#-Quellcode

    1. construktor(){
    2. await Task.Run( AufrufDerPermanenntLaufenSollImHintergrund);
    3. }
    4. async void AufrufDerPermanenntLaufenSollImHintergrund(){
    5. }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()