» »

[C#] pixel scan z Thread

[C#] pixel scan z Thread

perooo25 ::

Pozdravljeni,
imam en problem , rad bi da mi program skeniral (preverjal) 12 različnih pixel pozicij na zaslonu, trenutno imam to narejeno tako da ni preverjanje začne z funkcijo Thread (nitjo), vendar ker jih s timerjam refresham, mi to zeloooo obremeni aplikacijo in jo včasih tudi zablokira (error: System.OutOfMemoryException), upočasni mi tudi delovanje računalnika, kaj bi lahko uporabil namesto tega? (Predvidevam da je za to krivo Thread v zvezi s timerjam-> ker se niti prekinjajo in ponovno zaženejo)

del kode:

...
using System.Threading;
using System.Runtime.InteropServices;

...
public partial class Form1 : Form
{
    Thread L06;
    Thread L05;
    Thread L04;
    Thread L03;
    Thread L02;
    Thread L01;
    Thread D1;
    Thread D2;
    Thread D3;
    Thread D4;
    Thread D5;
.....
}
 public void updateL06()
    {
        Bitmap screenCopy = new Bitmap(1, 1);
        using (Graphics gdest = Graphics.FromImage(screenCopy))
        {
            while (true)
            {
                using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero))
                {
                    IntPtr hSrcDC = gsrc.GetHdc();
                    IntPtr hDC = gdest.GetHdc();
                    int retvalL = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, LX06, LY06, (int)CopyPixelOperation.SourceCopy);
                    gdest.ReleaseHdc();
                    gsrc.ReleaseHdc();
                }
                Color cL = Color.FromArgb(screenCopy.GetPixel(0, 0).ToArgb());
                label1.ForeColor = cL;
                this.Invoke((Action)(() =>
                {
                    string cLb = Convert.ToString(cL);
                    if (cL.G == RG && cL.B == RB && cL.A == RA)
                    {
                        q = 1;
                        if (a == 0 && s == 0 && d == 0 && f == 0 && g == 0 && h == 0)
                        { poz = 50000 - (premink * 6); }
                    }
                    else
                    { q = 0; }
                }));
            }
        }
    }
    public void updateL05()
    {
        Bitmap screenCopy = new Bitmap(1, 1);
        using (Graphics gdest = Graphics.FromImage(screenCopy))
        {
            while (true)    //. . . . .  }
       // .............. takole mi skenira 12 pixlov ..............




 private void timer1_Tick(object sender, EventArgs e)
    {
 timer1.Interval = osV;
            L01 = new Thread(updateL01);
            L01.Start();
            D1 = new Thread(updateD1);
            D1.Start();
            L02 = new Thread(updateL02);
            L02.Start();
            D2 = new Thread(updateD2);
            D2.Start();
            L03 = new Thread(updateL03);
            L03.Start();
            D3 = new Thread(updateD3);
            D3.Start();  //. . . . . . 
        // . . . . . . . . . 
            L01.Abort();
            D1.Abort();
            L02.Abort();
            D2.Abort();
            L03.Abort();
            D3.Abort();
            L04.Abort();
            D4.Abort(); . . . . . . .  .   }  

// takole mi jih pa timer refresha


timer se zažene ob pritisku na gumb in prav tako konča.

Upam da se bo kdo spomnil primerne rešitve :D

darkolord ::

Zašteka ti verjetno predvsem zaradi tega, ker to počneš v "while (true)" neskončni zanki v vseh threadih.

Na kakšen časovni interval bi rad preverjal zadevo?

Edit: a threade kr takoj ugasneš?

Zgodovina sprememb…

blackbfm ::

Tak na hitro da ti odgovorim, če ti meče out of memory potem imaš memory leak nekje v kodi. Verjetno je kaj s tistim bitmapom ki ga kreiraš ali pa z nepravilnim zapiranjem threadov. Skeniranje parih pixlov sicer ne bi smelo usut aplikacije ali tako obremenit računalnika.

Zašteka ti predvsem zaradi tega, ker to počneš v "while (true)" neskončni zanki v vseh threadih.


lahka rešitev je da se da kakšna milisekunda sleepa vmes pa je

Zgodovina sprememb…

  • spremenilo: blackbfm ()

perooo25 ::

darkolord je izjavil:

Zašteka ti verjetno predvsem zaradi tega, ker to počneš v "while (true)" neskončni zanki v vseh threadih.

Na kakšen časovni interval bi rad preverjal zadevo?

Edit: a threade kr takoj ugasneš?



Ja zaenkrat mi ga takoj ugasne, a to rajši odstranim in dam potem v preverjanje pixla pri "while(true)" kakšen Thread.sleep(2)? ja interval preverjanja bi moral biti čim bolj natančen, parkrat na sekundo.

_Dormage_ ::

Bi pomagalo, če bi povedal kaj točno hočeš naredit oziroma kaj je problem, ki ga rešuješ.
Če sleepaš thread bi imelo smisla, ampak verjetno nebi rešilo leak.

perooo25 ::

Ok, naredil bi program ki bi mi skeniral dolocene pixle (barve pixlov) na zaslonu, kjer bi bil v ozadju nek program, se pravi bi skeniral pixle nekega programa, in v primeru da se kateremu pixlu spremeni barva v barvo kateero bi preverjal, bi se v mojem programu zgodil nek dogodek (npr: povecov ali pomanjsal bi se progress bar ) :)

Mavrik ::

Neprestano poganjanje threadov je zelo drago, kar se tiče performans, zato ni čudno da vidiš take stvari.

Predelaj svojo aplikacijo tako, da se bodo vsi threadi štartali samo na začetku, potem pa delaj loop znotraj vsakega threada in poskrbi da boš imel kak Thread.sleep() kje - če praviš da rabiš samo "parkrat" na sekundo, je sleep(100) več kot dovolj - ne rabiš uničiti cele mašine z neprestanim pollingom 1000x na sekundo.
The truth is rarely pure and never simple.

_Dormage_ ::

Zakaj pa za skeniranje parih pixlov rabiš tolko niti?
Čisto dovolj bi bilo, da bi 1 thread pogledal vseh 12.
Druga stvar je, da kreiranje niti ni poceni. Ni poceni, če vsakič ko odrabiš nit jo ubiješ in naslednjič kreiraš novo.
Ena rešitev je, da ko odrabiš thread ga samo uspavaš dokler ga ponovno ne zbudiš.
V vsej tej zgodbi z nitmi pa ne vidim razloga za napako, ki jo dobiš. Še kar maš nekje leak :)

perooo25 ::

Aha, ok, in kako v en thread spraviti 12 preverjanj ?

darkolord ::

Enega za drugim, jasno.

perooo25 ::

npr.:
 L01 = new Thread(updateL01,updateL02, updateL03, updateL04, updateL05,.... );
            L01.Start()


mogoče tako ?

_Dormage_ ::

Če prav vidim imaš za vsak skeniran pixel svojo metodo, ki to naredi?
Zakaj ni vse skupaj v eni metodi?

perooo25 ::

jp, misliš da bi bilo bolje da bi imel eno mtodo, in bi v while dal vse usinge ? ali kako ?

Zgodovina sprememb…

  • spremenil: perooo25 ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

kako narediti program ki bere drugi program

Oddelek: Programiranje
465385 (3698) imagodei
»

C# problem z kopiranjem

Oddelek: Programiranje
9972 (766) 3p
»

[Visual C#] zaradi while zanke se ne pokaže okno

Oddelek: Programiranje
8917 (794) Fresh-Grass
»

Niti (threads)

Oddelek: Programiranje
141799 (1467) snow
»

Java problem

Oddelek: Programiranje
51052 (908) YuLcE

Več podobnih tem