IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Okna jsou bez ovládacích prvků a negungují

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Dog
Člen
Avatar
Dog:26.12.2016 1:44

Ahoj,

upravoval jsem svoji apku, tak aby byla mnohem šetrnější na pamět, ale něco způsobilo, že okna, která mají vyskakovat vůbec nefungují, aplikace nezahlásí chybu, když ji stopnu, tak má všechny údaje v oknech správné, ale prostě je to zobrazuje takhle (viz obr.)

Úpravy jsem dělal velké , takže nevím kde přesně se mohla stát chyba, údaje v oknech sedí. Zajímalo by měl spíš něž konkrétní řešení to, co způsobí takové chování aplikace, poté bych to byl schopen vyřešit.
PS: snad to nebyl Resharper a jeho fullcleanup.

Mimochodem, aplikace jinak funguje, funguje všechno až na tyhle vyskaovací okna, které mají začít vyskakovat po zmáčknutí buttonu, samozřejmě jsem upravoval kód jen těchto oken, proto se to nějak ...

Díky moc

Editováno 26.12.2016 1:46
 
Odpovědět
26.12.2016 1:44
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na Dog
Adam Ježek:26.12.2016 2:19

Co to je za okna? Klasický MessageBox (tvarem to tak vypadá), nebo sis tvořil něco vlastního?
Mimochodem, používáš nějaký verzovací systém?

Nahoru Odpovědět
26.12.2016 2:19
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Dog
Člen
Avatar
Dog:26.12.2016 2:38

Nene klasické formy s ovládacima prvkama.

Mám to zálohovane samozřejmě :-)

 
Nahoru Odpovědět
26.12.2016 2:38
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:26.12.2016 9:57

Tak začni znova po malých úpravách - nejhorší co můžeš udělat je přepsat půl programu naslepo -zvlášť když děláš něco nového, co nemáš ověřené.

 
Nahoru Odpovědět
26.12.2016 9:57
Avatar
Odpovídá na Dog
Michal Žůrek - misaz:26.12.2016 10:37

a proč těch oken je tolik?

 
Nahoru Odpovědět
26.12.2016 10:37
Avatar
Dog
Člen
Avatar
Dog:26.12.2016 10:42

Má to vyskakovat a přepisovat určitý okna ve windowsu, respektive v jednom software :) Tohle je jen test takže jsem to dal vyskakovat na základě logu, bez ohledu na to jaký okna jsou otevřený, ale když ten software otevřu (ten třetí strany), tak se nezobrazují na oknech toho softu, prostě to vůbec nefunguje i když konstruktory přebírají parametry v pořádku, pokud jsem něco nepřehlédl :-)

 
Nahoru Odpovědět
26.12.2016 10:42
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na Dog
Adam Ježek:26.12.2016 11:32

Tak se vrať k původní verzi, která ještě fungovala,a postupně začni provádět úpravy na aktuální verzi, ale pouštěj to s každou úpravou. V jednu chvíli to přestane fungovat a máš zdroj problému.

Nahoru Odpovědět
26.12.2016 11:32
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Dog
Člen
Avatar
Dog:26.12.2016 21:02

Tak já to nyní volám z eventu (to vyskakování těch oken), a z něj se nezobrazí vůbec žádný okno správně, ani bezparametrickej konstruktor jako...

Settings pc = new Settings();
pc.Show();

To zobrazí stejně špatně jako ty okna v tom obrázku... Takže to není parametrama v kódu, ty to předává správně problém je někde jinde. Hlava mi to nebere...

Editováno 26.12.2016 21:04
 
Nahoru Odpovědět
26.12.2016 21:02
Avatar
Dog
Člen
Avatar
Dog:27.12.2016 2:08

Spustilo se mi další vlákno a z něj se to otevíralo... :)

 
Nahoru Odpovědět
27.12.2016 2:08
Avatar
Odpovídá na Dog
Marian Benčat:27.12.2016 9:10

Tak to si vyresil ne? Je to celé STA, pravděpodobně ti to nebude fungovat, pokud to budeš otevírat z jiného vlákna.. Ten kdo ten objekt totiž vytvořil (to vlákno), tak to je jeho vlastníkem a jen to do něj může zapisovat (kreslit) atd. Otevírání toho okna marshalluj do hlavního vlákna.

Nahoru Odpovědět
27.12.2016 9:10
Totalitní admini..
Avatar
Dog
Člen
Avatar
Dog:28.12.2016 16:54

Snažil jsem se na to přijit, ale nepřisel jsem na to :(

Pořád se to snaží dostat do jiného vlákna, zatímco ta původní verze jede a okna se otviraji stále na hlavním vlákně, tak ty popup okna u nové verze se otevírají na novém vlákně a tam to dělá to co to dělá.

Kdyz si uz myslim, ze jsem dostal vsechno do hlavniho vlakna, tak to stopnu na initializecomponent popupu a zase to jede na jinym :(

 
Nahoru Odpovědět
28.12.2016 16:54
Avatar
Odpovídá na Dog
Michal Štěpánek:28.12.2016 18:47

Pořád se to snaží dostat do jiného vlákna...

samo se to do jiného vlákna cpát nebude, někde jsi to musel napsat, aby se to otevíralo v novém vláknu. Bez tvého zásahu by všechno běželo jen v hlavním vlákně...

Nahoru Odpovědět
28.12.2016 18:47
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:28.12.2016 19:51

A co kdyby ses už teda pochlubil nějakým kódem - třeba původní funkční vs nový nefunkční ?

 
Nahoru Odpovědět
28.12.2016 19:51
Avatar
Dog
Člen
Avatar
Dog:28.12.2016 20:49

Kód je strašně dlouhej. Je to tím, že to mám na eventu changed ve watcheru, ten to vždycky otevře v threadu...

 
Nahoru Odpovědět
28.12.2016 20:49
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:28.12.2016 21:43

Tak ten úsek kódu co otvírá ty okna zas tak dlouhý snad nebude ne ?

 
Nahoru Odpovědět
28.12.2016 21:43
Avatar
Dog
Člen
Avatar
Dog:29.12.2016 2:31

Tak to běží všechno v main vlaknu, ale stejně to dělá pořád to stejný... Zítra postnu zdroják, protože už vážně netuším čím by to mohlo být...

 
Nahoru Odpovědět
29.12.2016 2:31
Avatar
Dog
Člen
Avatar
Dog:29.12.2016 2:40

co je zajimavý je tohle:

//Event na _fileSystemWatcher.Changed += WatcherChangedEvent;
        private void WatcherChangedEvent(object sender, EventArgs e)
        {
            Settings set = new Settings();
            set.Show();     //tohle to zobrazi stejne spatne jako v tom obrazku
            this.Invoke(new Action(() => {

                Settings seet = new Settings();
                seet.Show();     //tohle to zobrazi jak ma

//tady jsou dalsi metody ... samozrejme tam nezobrazuju setting,
//  ale jen takova ukazka, okna se zobrazuji z dalsi tridy kterou volam
//  tady, a bezi to vsechno pod main threadem
            }));
        }
Editováno 29.12.2016 2:42
 
Nahoru Odpovědět
29.12.2016 2:40
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:29.12.2016 5:49

Tak v první řadě bys neměl používat "klíčové slovo" set - to je vyhrazeno pro setter property

 
Nahoru Odpovědět
29.12.2016 5:49
Avatar
Dog
Člen
Avatar
Dog:29.12.2016 9:02

Však já ho nepoužívám... :-) jen jsem chtěl ukázat co to dělá.

 
Nahoru Odpovědět
29.12.2016 9:02
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:29.12.2016 10:24

asi mám teda halucinace, ale já vidím

Settings set = new Settings();
           set.Show();
 
Nahoru Odpovědět
29.12.2016 10:24
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:29.12.2016 10:35

A co je to vůbec za třídu ta Settings - nějaká tvoje, nebo internal sealed partial class Settings z Properties ?

 
Nahoru Odpovědět
29.12.2016 10:35
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na ostrozan
Ondřej Štorc:29.12.2016 11:24

Podle toho jak ji používá tak by si tipnul že je to form.

Nahoru Odpovědět
29.12.2016 11:24
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Dog
Člen
Avatar
Dog:29.12.2016 11:32

to jsem dal jen jako ukázku toho jak to funguje v eventu watcheru mimo invoke a s invoke...
Vůbec jsem to nespouštěl, protože je to mimo. Jinak to vůbec takto nepoužívám, ano je to klasickej form s nastavenim softu...

Teďka musím vytáhnout to nejdůležitější z toho softu, aby mi nekdo poradil, protože jsem už zoufalej z toho...

 
Nahoru Odpovědět
29.12.2016 11:32
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:29.12.2016 11:40

Takové nekonkrétní narychlo slátané ukázky typu "je to nějak podobně jako tohle" jsou k ničemu

schválně jsem si to zkusil a ono to chodí jak má - proč by taky nemělo - dal jsem to teda na buttonClick

private void button1_Click(object sender, EventArgs e)
   {
       Form2 newForm = new Form2();
       newForm.Show();
       this.Invoke(new Action(() => {
           Form2 newForm2 = new Form2();
           newForm2.Show();
       }));
   }

a otevřou se dva nové formy

 
Nahoru Odpovědět
29.12.2016 11:40
Avatar
Dog
Člen
Avatar
Dog:29.12.2016 18:26

VSE VELMI ZJEDNODUSENE, abych priblizil problem

    public partial class MainWindow : Form
    {

        readonly FileSystemWatcher _fileSystemWatcher = new FileSystemWatcher
        {
            Path = Path.GetDirectoryName(Properties.Settings.Default.PokerStarsPath),
            Filter = "xxx.log.txt",
            EnableRaisingEvents = false,
            NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.Size
        };

        public MainWindow()
        {
            InitializeComponent();

            //Udalosti na changed
            _fileSystemWatcher.Changed += WatcherChangedEvent;
        }

        private void WatcherChangedEvent(object sender, EventArgs e)
        {
            //aby bezelo pod main thradem, tim ten problem zpusobeny neni
            //  ale pro zjednoduseni
            this.Invoke(new Action(() => {
                AnalyzeLogs analyzelogs = new AnalyzeLogs(_psRun, _ftpRun, _wpnRun);
                analyzelogs.LogAnalyzeAndSendData();
            }));
        }

}

Z eventu to jde sem ->

 class AnalyzeLogs
 {
     public delegate void MsgHandler();
     public event MsgHandler MsgFound;
     public AnalyzeIt analyzeit { get; set; }
     static List<string> _sendedData = new List<string>();


     public AnalyzeLogs(bool psRun, bool ftpRun, bool wpnRun)
     {
             MsgFound += FoundEvent;
     }

     public void LogAnalyzeAndSendData()
     {
         try
         {
             using (
                 FileStream fsreader =
                     new FileStream(
                         Properties.Settings.Default.PokerStarsPath,
                         FileMode.Open,
                         FileAccess.Read,
                         FileShare.ReadWrite))
             {
                 using (StreamReader reader = new StreamReader(fsreader))
                 {
                     {
                         //radkovac
                         for (int radek = 0; radek <= _logPos; radek++)
                             reader.ReadLine();

                         //prvni cyklus; cte radky z pokerstars.log.0, ktere se maji
                         //  vytahnout do log.txt
                         string text;
                         while ((text = reader.ReadLine()) != null)
                         {
                                if (text.Contains("MSG_X"))
                                     {
                                             //prida  data do _sendedData
                                     }
                                if (text.Contains("MSG_Z"))
                                     }
                                             //prida  data do _sendedData a vypali event
                                             MsgFound();
                                     }
                         }
                     }
                 }
           }
      }


     private void FoundEvent()
     {
         //tady to utridi a posle data do ->

         analyzeit = new AnalyzeIt("Y", Kar1, Kar2, BB,
             Sta, ToCl, S, Id, Pozice);

                     //posila vysledky z analyzeit do analyzelight, protoze
                     //  analyzeit by zabirala strasne moc prostoru,
                     //  vzhledem k x tisic radkum porovnavaich dat
                     //  zhruba 1GB RAM na 100 odeslani

                     //KONSTRUKTOR... Data nejsou podstatna
                     AnalyzeLight light =
                         new AnalyzeLight(analyzeit.ShowPicture1(),
                             analyzeit.ShowPicture2(),
                             analyzeit.ShowPictureS(),
                             analyzeit.ShowPictureSLow(),
                             analyzeit.ShowPictureVsR(),
                             analyzeit.ShowPictureVsL(),
                             analyzeit.ShowPictureVsO(),
                             analyzeit.Efective.ToString(),
                             analyzeit.Bb.ToString(),
                             analyzeit.Sta.ToString(), analyzeit.ToC,
                             analyzeit.Kar1, analyzeit.Kar2,
                             analyzeit.St, analyzeit.ID,
                             analyzeit.RN,
                             analyzeit.Gr, analyzeit.Na,
                             analyzeit.Po, analyzeit.NCo,
                             analyzeit.IsG, analyzeit.Sit);

                     //tady se vytvori nove okno
                     new ShowIt(light);
  }
}

 //ZOBRAZOVAC a vyskakovac oken :)
 //  DATA SEDI, I V TOM POPUPOVEM OKNE
 //  ALE ZOBRAZUJE TO TAK JAKO V PRVNIM OBRAZKU
 //  KDYZ TADY DAM SHOWDIALOG() MISTO SHOW(), TAK SE ZOBRAZI
 //  I DO KONZOLE VYPISE JEN PRVNI UDAJ (PRO PRVNI OKNO) A
 //  POTOM SE TO ZASTAVI, PRITOM TO MA NACIST DALSICH 200 UDAJU
 //  S SHOW(), SE TO SICE V KONZOLI ZOBRAZI, I ZACNOU VYSKAKOVAT OKNA,
 //  ALE VYSKAKUJI TAK JAK V TOM PRVNIM OBRAZKU, BEZ CEHOKOLI :)

 class ShowIt
 {
     static PopupWindow[] cardspopup = new PopupWindow[1000];
     static List<long> IDs = new List<long>();
     long _idT;
     static int _cSt = 0;

     public ShowIt(AnalyzeLight light)
     {
         if (light != null)
         {
             _idT = light.ToID;
             if (IDs.Contains(light.ToID))
             {
                 int x = 0;

                 foreach (long i in IDs)
                 {
                     if (light.ToID == i)
                     {
                         cardspopup[x].Actualize(light);
                         break;
                     }
                     x++;
                 }
             }
             else
             {
                 IDs.Add(light.ToID);

                 //TADY SAMOZREJME MAM  InitializeComponent();

                 cardspopup[_cSt] = new PopupWindow(light, _idT, _cSt);
                 cardspopup[_cSt].Show();
                 _cSt++;
             }
         }
     }
 }
Editováno 29.12.2016 18:27
 
Nahoru Odpovědět
29.12.2016 18:26
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:29.12.2016 22:59

No to ti povím teda - to je na můj vkus pěkná divočina otvírat okno v konstruktoru třídy - tam bych hledal problém - konstruktorem bys měl předávat třídě parametry ale rozhodně ne provádět nějaké akce - takže všechno z konstruktoru hoď do metody a teprv jejím voláním okno otvírej.
Jiného nic mně nenapadá

 
Nahoru Odpovědět
29.12.2016 22:59
Avatar
Odpovídá na ostrozan
Marian Benčat:29.12.2016 23:06

Me tam tedy desi kazda druha radka :-/ Mozna nejvice řádka:

new ShowIt(light);

:-) Vůbec bych se nedivil, kdyby to bylo tímdle a garbage collectingem :-)

Nahoru Odpovědět
29.12.2016 23:06
Totalitní admini..
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Marian Benčat
ostrozan:29.12.2016 23:08

Jj přesně tohle jsem měl na mysli

 
Nahoru Odpovědět
29.12.2016 23:08
Avatar
Odpovídá na ostrozan
Marian Benčat:29.12.2016 23:23

Uplne vidim, jak mu runtime smazne pulku toho "formuláře" ještě než ho zobrazí :-) Nerad bych tu ale zabředával do GC a refcountingu :-) Už když vidím nelockovaný static a doufání v to, že mě bude někdo marshallovat do STA, aby nedošlo k race condition ve mně Invoke()uje myšlenku, že to možná někdy zobrazí okno, jindy uvaří kafe a možná občas odstartuje nukleární válku.

@Dog první co udělej je, že zkusíš instance někam přiřadit do proměnné, když už tedy máš side efekty v constructoru..

Nahoru Odpovědět
29.12.2016 23:23
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Neaktivní uživatel:29.12.2016 23:28

Takže GC může smazat z haldy třídu, i když právě probíhá její konstruktor? (pokud na ni neukazují reference, jak říkáš, new ShowIt() )

Nahoru Odpovědět
29.12.2016 23:28
Neaktivní uživatelský účet
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Marian Benčat
ostrozan:29.12.2016 23:30

statické pole tisíce oken je taky docela bomba - celé to vypadá na hodně špatný návrh aplikace

 
Nahoru Odpovědět
29.12.2016 23:30
Avatar
Odpovídá na Neaktivní uživatel
Marian Benčat:29.12.2016 23:42

EE to nemůže. Ale jsme v single-thread frameworku, ten volá mj. nějaký Repaint a potřebuje k tomu data. Dog má v kódu:

//TADY SAMOZREJME MAM  InitializeComponent();

Tento komentář, takže hádám, že ShowIt bude asi i nějaká komponenta.. Těžko říct co tam má. Z toho co mu to vykresluje si osobně myslím, že tam má buďto časově závislou chybu, nebo tam zabije hlavní vlákno. pořád si myslím, že nám důležité informace zůstávají skryty :-)

Nahoru Odpovědět
29.12.2016 23:42
Totalitní admini..
Avatar
Odpovídá na ostrozan
Marian Benčat:29.12.2016 23:51

Já bych se na to klidně kouknul podrobněji, ale jen pokud by dal k dispozici fakt minimalni repro solution, takhle stejně to nejdůležitější určitě nedal..

Nahoru Odpovědět
29.12.2016 23:51
Totalitní admini..
Avatar
Dog
Člen
Avatar
Dog:30.12.2016 13:12

Dal jsem to mimo konstruktor, v konstruktoru jsem nechal jen inicializaci tridy AnalyzeLight
Ted to volam takhle, ale nic se nezměnilo:

ShowIt showit = new ShowIt(light);
showit.GetWindow();

To co nechapu je, ze ve tride ShowIt, kdyz dam misto:
cardspopup[_cSt]­.Show(); ... tohle cardspopup[_cSt]­.ShowDialog();
Tak to to popupové okno normálně zobrazi, ale vlakno se ukonci hned po prvním cardspopup[_cSt]­.ShowDialog(); ... Jako by nevědělo, že má pokračovat v cyklu while

while ((text = reader.ReadLine()) != null)
{
        // tady ma pokracovat, show() tady sice pokracuje, ale nezobrazuje okna :(
        ...
}

*** V každém případě díky moc za cenné rady, např. že v konstruktoru se nic nezobrazuje, jen inicialzuje apod...

Editováno 30.12.2016 13:14
 
Nahoru Odpovědět
30.12.2016 13:12
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:30.12.2016 14:07

Když otevřeš dialogové okno (ShowDialog), tak program čeká, než ho zavřeš, pak teprve pokračuje dál.

 
Nahoru Odpovědět
30.12.2016 14:07
Avatar
Odpovídá na Dog
Marian Benčat:30.12.2016 14:49

Ten while cyklus. Jak trvá dlouho? Jsi si jistý na 100% ze dojede a ze dojede v rozumné době?

Nahoru Odpovědět
30.12.2016 14:49
Totalitní admini..
Avatar
Dog
Člen
Avatar
Dog:30.12.2016 15:44

No trvá 40 sekund, když to načtu naráz, procita 50 tisic radku ale až to bude real time tak to bude skákat maximálně po 100 řádcích za změnu, no s tím showdialog() se to zobrazí a zobrazuje to okno, musím to sice vždycky zavřít, ale zobrazuje se to, každý okno má svůj konstruktor...

cardspopup[_cSt] = new PopupWindow(light, _idT, _cSt);

a několikrát se zavolá actualizer toho okna...

cardspopup[x].Actualize(light);

Kterej se po tom zobrazení showdialogem už samozřejmě neatualizuje protože okno se musí zavřít aby to mohlo pokračovat a už neexistuje... Ale zobrazí se ty okna volané pomocí konstruktoru, což mi hlava nebere.

Tak netuším čím to může být, snad tím, že když se to automaticky nezastaví po zobrazení okna tak se to začne nějákým způsobem přepisovat něco někde, nebo že to okamžutě po zobrazení okna shráhně garbage... Nevim :(

A co jste mysleli tím nezabezpečený staticem? měl bych to mít locklý, nebo nejákej semaphore? Neznám právě taková ty nepsaná pravidla programování :( Nevíte kde bych se o tom mohl něco dočíst?

 
Nahoru Odpovědět
30.12.2016 15:44
Avatar
Dog
Člen
Avatar
Dog:30.12.2016 16:19

Dále, když v tom eventu nahradím

ShowIt showit = new ShowIt(light);
showit.GetWindow();

tímto

//Což není žádná komponenta mého softu, prostě form
Form form = new Form();
form.Show();

Tak to začne pálit jeden form za druhým, správně zobrazených, ale když dám zobrazit nějákej form v mém řešení, tak to začne zobrazovat zase jako v tom prvním obrázku např.

Settings form = new Settings();
form.Show();

//nicméně když tam dám ShowDialog(); tak se to zobrazí normálně,
//  ale vzhledem k tomu,, že to musím zavírat tak je to nepoužitelné,
//  ale přijde mi to paradoxní celý
Editováno 30.12.2016 16:21
 
Nahoru Odpovědět
30.12.2016 16:19
Avatar
Marian Benčat:30.12.2016 16:29

Ten while co trva 40sec běží v hlavním vlakne? Tak to může být dost pravděpodobně pricina. Pokud totiž delší dobu takto zabijes hlavní vlákno svojipraci, tak nemůže obsluhovat události pro COM objekty. Kdyby to bylo wpf, vyhodí ti exception, že se zahltila event queue a crashne ti, winforns se chová jsem podivne.

Nahoru Odpovědět
30.12.2016 16:29
Totalitní admini..
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:30.12.2016 17:43

Píšeš, že projíždíš 50 000 řádků a máš tam nějaké pole o velikosti 1000 - nemůže se ti stát, že se ti index (to x) dostane přes ten 1000?
Nebyl by místo toho pole lepší List?

 
Nahoru Odpovědět
30.12.2016 17:43
Avatar
Odpovídá na ostrozan
Marian Benčat:30.12.2016 17:52

To by mu to za běžných okolností vyhodilo OutOfBoundExcep­tion, pokud je to v nějakém threadu, co si vytvořil sám růčo, tak mu ten thread tiše spadne. Pořád ale si nejsem jistý, jestli se mu tam pouští více threadu nebo ne.. a pokud mu tam něco thready pouští (nějaký ten Watcher), tak to tam může tiše polykat.

Nahoru Odpovědět
30.12.2016 17:52
Totalitní admini..
Avatar
Dog
Člen
Avatar
Dog:30.12.2016 19:42

Zobrazuje se to špatně, i v v multithreadingu i kdyz to spustim v konstruktoru hlavniho okna...

 
Nahoru Odpovědět
30.12.2016 19:42
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:30.12.2016 20:02

Takhle dlouhé záležitosti by se měly zpracovat asynchronně - buď BackgroundWorker, nebo Async /Await - každé pracuje jinak, těžko říct, co je pro tvůj případ lepší.
Taky když jsem si kdysi zkoušel jak chodí FileSystemWatcher, tak jsem měl myslím problém s tím, že když otevřeš soubor, který vyvolal event, tak si vlastně vyvoláš opětovně eventhandler a pokud to nemáš dobře ošetřené, tak tak se můžeš pěkně zacyklit

 
Nahoru Odpovědět
30.12.2016 20:02
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Dog
ostrozan:30.12.2016 20:11

Takže to všechno ukazuje na to, že chyba je v tom PopUpWindow - můžeš sem dát kód?

 
Nahoru Odpovědět
30.12.2016 20:11
Avatar
Dog
Člen
Avatar
Dog:30.12.2016 20:45

Tohle byla poslední funkční verze... Ve které se vsechno zobrazovalo, jak mělo... je to teda ještě mnohem ale mnohem horší kód než to, co jste viděli :D

měl jsem to na timeru, takže když byl log dlouhej, třeba 500k řádků tak se muselo načítat pořád všechno dokola načítat třeba 10x za vteřinu a ta struktura v analyzelogs.Lo­gAnalyzeAndSen­dData(); byla jiná že to třeba něco nenačetlo apod... nová verze načítá 100% dat, který chci načíst, ale problém je s tim zobrazovanim.

private async void TimerTickEvent(object sender, EventArgs e)
{
    AnalyzeLogs analyzelogs = new AnalyzeLogs(psRun, ftpRun, wpnRun);
    await Task.Run(() =>
    {
        analyzelogs.LogAnalyzeAndSendData();
    });

    //GTOSolution
    AnalyzeIt analyzeit = analyzelogs.analyzeit;

    if (analyzeit != null)
    {
        try
        {
            AnalyzeLight analyzelight = new AnalyzeLight(
                analyzeit.ShowPicture(),
                //dalsi parametry
                );

            ShowIt table = new ShowIt(analyzelight);
            File.WriteAllLines(@"log.txt", pslog);
        }
        catch {     }
    }
}

Já jsem do té třídy s PopUpWindow vůbec nerýpal, a proč by to nezobrazovalo ve FoundEventu teda i tak primitivní věc, jako:

Settings settings = new Settings();     //settings je trida : form v mym projektu
settings.show();

Data to tam posila spravne, ale... :(

//V KAZDEM PRIPADE DEKUJI ZA VASI TRPELIVOST :))

Editováno 30.12.2016 20:48
 
Nahoru Odpovědět
30.12.2016 20:45
Avatar
Dog
Člen
Avatar
Dog:30.12.2016 20:57

A tim eventem to to taky nebude, protoze i kdyz dam do konstruktru mainformu na konec :

AnalyzeLogs analyzelogs = new AnalyzeLogs(psRun, ftpRun, wpnRun);
analyzelogs.LogAnalyzeAndSendData();

Tak problem stale pretrvava... :(( Uz vazne nevim... A to PopUpWindow jsem neupravoval a nic jsem s nim nedelal, tak si nemyslim, ze to tim bude, ale klidne ho sem dam...

 
Nahoru Odpovědět
30.12.2016 20:57
Avatar
Dog
Člen
Avatar
Dog:30.12.2016 21:10

Předpokládám, že nemusím v zobrazovacím okně vytvářet novou instanci AnalyzeLight:

public CardsPopup(AnalyzeLight analyzelight, long id_turnaje, int c_stolu)
{
    InitializeComponent();

A stačí to inicializovat přes parametr... Jsou to ta data, která se mají zobrazit, jako texty, obrazky apod...
Resp. nemusím:

this.analyzelight = analyzelight

a potom ty prvky aktualizovat pres this.analyzelight

nic jinýho mě nenapadá...

Editováno 30.12.2016 21:11
 
Nahoru Odpovědět
30.12.2016 21:10
Avatar
Dog
Člen
Avatar
Dog:31.12.2016 2:36
//Tahle inicializace fsw nezobrazovala ve svem eventu show() vůbec od ničeho správně
//  tak jsem tam dal místo ní, klasickou pomoci sady nástrojů a docílil jsem alespoň
//  zobrazení formuláře z mého řešení v eventu
//ŠPATNĚ
readonly FileSystemWatcher _fileSystemWatcher = new FileSystemWatcher
{
    Path = Path.GetDirectoryName(Properties.Settings.Default.PokerStarsPath),
    Filter = "xxx.log.txt",
    EnableRaisingEvents = false,
    NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.Size
};

public MainWindow()
{
    InitializeComponent();

    //Udalosti na changed
    _fileSystemWatcher.Changed += WatcherChangedEvent;
}
//ŠPATNĚ

Když dám za volání eventu MsgFound(); v LogAnalyzeAndSen­dData() break, tak zobrazuje okna i aktualizuje s show(), což je pokrok, ale samozřejmě že musím pořád měnit logfile, abych dosáhl neustálého volání eventu WatcherChange­dEvent... Což takhle určitě nejde, ale pokrok...

Editováno 31.12.2016 2:39
 
Nahoru Odpovědět
31.12.2016 2:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 48 zpráv z 48.