Diskuze: pomoc při

C# .NET .NET (C# a Visual Basic) pomoc při American English version English version

Avatar
Dog
Člen
Avatar
Dog:

Ahoj,

dal jsem dohromady s pomocí hj.masek parser k programu, který analyzuje data z logfile a následně je zpracovává.

nyní mi chybí poslední krůček k dokončení mého software, začal jsem ho testovat a přišel jsem na jednu záludnost, a to je, že software odesílá data "MSG_0x0007-T" o vteřinu později, než MSG_0x0009-T, což je problém v tomto případě, protože program počítá s daty do cyklu 2. Takže když se změní něco v logu toho softu, tak to přečte jen "MSG_0x0009-T", protože než se objeví 007, tak je EndOfStream, do cyklu 2. pošle MSG_0x0009-T bez dat.

Na obrázku můžete vidět co to dělá.
levé okno: 1 to přečetlo bez problému, protože jsem ten soft, na kterým pracuji zapnul až trošku později, po tom, ze kterého tahám údaje, takže bylo vše načteno, protože v logu všechny údaje byly.

problém nastává, když se to dostane do reálného času, právě skrz to zpoždění mezi 009 a 007. Načte 009, narazí na eof a jede dále bez 007. V druhém okně můžete vidět , že to nenačetlo údaj jak je pod 1. (0040D64 F 65.........) a třetí okno vyhodnotí, jako no data, což je blbost. Protože 007 se objeví po vteřině.

Takže se ptám, jak upravit software tak, aby to počítalo s touto záludností?

  • potřebuji vždy uložit do logMehoSoftu.txt 0009-T (které jde vždy jako první a je jen jedno). a k němu přiřadit patřičné 0007-T (kterých je vždy více, ale s tím už počítá druhý parser). Nesmí se uložit 0009 bez 0007, protože to ukáže no data.
  • může být vstup třeba najednou:

-> 0009-T 3129......
-> 0009-T 5434....

a o vteřinu později přijde
-> 0007-T 3129...
-> 0007-T 3129...
-> 0007-T 5434...
-> 0007-T 3129...
-> 0007-T 5434...
-> 0007-T 5434...

tak bych potřeboval, aby se to uložilo do logMehoSoftu.txt dohromady.

  • poslední problém je ten, že občas (asi 1%) 0009-T chybí 0007-T a jestli se neobjeví do 3 vteřin, tak tehdy by to mělo zobrazit "no data"

No, v každém případě díky, že jste dočetli až sem a za každou odpověď.

/*
možná by to šlo vyřešit tak, že by se otevřely dva streamy, jeden na 0009-T a jeden na 0007-T, když cyklus v prvním streamu najde 0009-T, tak by přeskočil na druhý stream, kterému by předal pozici 0009-T a od té pozice by hledal 0007-T, a tak až do konce souboru

// problém ale je, že by se ta pozice pravděpodobně nepředávala správně, protože při rychlým načítání velkého množství údajů za krátkou dobu skáče pozice po násobcích 1024.
*/

private void timer1_Tick(object sender, EventArgs e)
{
    //cyklus
    try
    {
        // cteni pokerstars.log.0 a zapisovani do log.txt
        FileStream fr = new FileStream(pathlogfile, FileMode.Open,
            FileAccess.Read, FileShare.ReadWrite);
        StreamReader reader = new StreamReader(fr);
        FileStream fw = new FileStream(@"logMehoSoftu.txt", FileMode.Open,
            FileAccess.Write, FileShare.ReadWrite);
        StreamWriter writer = new StreamWriter(fw);

        //nastaveni pozice
        fr.Seek(pspos, SeekOrigin.Begin);
        fw.Seek(logpos, SeekOrigin.Begin);

        //prvni cyklus; cte potřebné radky, ktere se maji vytahnout do log.txt
        //*************************** 1. CYKLUS ***********************
        while (reader.EndOfStream == false)
        {
            string text = reader.ReadLine();
            if (text.Contains("MSG_0x0009-T"))
            {
                string cardtemp = text;
                text = reader.ReadLine();
                iffirst:
                if (text.Contains("::: "))
                {
                    string cardtemp1 = text;
                    text = reader.ReadLine();
                    ifsecond:
                    if (text.Contains("::: "))
                    {
                        i++;
                        string cardtemp2 = text;
                        writer.WriteLine(i + " " + cardtemp + " " +
                            cardtemp1 + " " + cardtemp2);
                        listBox1.Items.Add(i + " " + cardtemp + " " +
                            cardtemp1 + " " + cardtemp2);
                    }
                    else
                    {
                        text = reader.ReadLine();
                        goto ifsecond;
                    }
                }
                else
                {
                    text = reader.ReadLine();
                    goto iffirst;
                }
            }

            if (text.Contains("MSG_0x0007-T"))
            {
                string stacktemp = text;
                text = reader.ReadLine();
                if (text.Contains("'F'") || text.Contains("'w'"))
                {
                    string stacktemp1 = text;
                    text = reader.ReadLine();
                    if (text.Contains("'C'") || text.Contains("'c'")
                        || text.Contains("'W'"))
                    {
                        string stacktemp2 = text;
                        text = reader.ReadLine();
                        if (text.Contains("'*'"))
                        {
                            string stacktemp3 = text;
                            writer.WriteLine(i + " " + stacktemp + " " +
                                stacktemp1 + " " + stacktemp2 + " " + stacktemp3);
                            listBox1.Items.Add(i + " " + stacktemp + " " +
                                stacktemp1 + " " + stacktemp2 + " " + stacktemp3);
                        }
                        else
                        {
                            writer.WriteLine(i + " " + stacktemp + " " + stacktemp1 +
                                " " + stacktemp2);
                            listBox1.Items.Add(i + " " + stacktemp + " " + stacktemp1 +
                                " " + stacktemp2);
                        }
                    }
                }
            }
        }

        pspos = fr.Position;
        logpos = fw.Position;

        //listBox3.Items.Add(pspos + "\t" + logpos);

        writer.Close();
        reader.Close();
        fw.Close();
        fr.Close();


        //druhy cyklus asociuje s promennymi veskera potrebna data z log.txt
        //********************* 2. CYKLUS ***********************
 
Odpovědět 28. července 2:02
Avatar
Dog
Člen
Avatar
 
Nahoru Odpovědět 28. července 2:08
Avatar
Dog
Člen
Avatar
Dog:

Čau, tak jsem to částečně vyřešil (vážně jen částečně) tím, že jsem otevřel jeden na 009 a jeden na 007, s tímto by to už mělo jít, samozřejmě s tím, že dám do nějakého cyklu to 007 (načítání třeba po 20ms), nebýt bugu s pozicí, pozici kterou to načítá opět špatně... :(

Viz obrázek... link
Nahoře je verze, která nepočítá s časovým zpožděním mezi 009 a 007, ale když má všechna data pohromadě tak funguje naprosto správně. Verze dole s tím zatím taky nepočítá, ale je nachystána pro to, aby počítala (viz kód tohoto příspěvku)....

problém s pozicí je zřejmý u čísla 15. na obrázku... cyklus 009 předá špatně pozici a místo načtení hned prvního 007, což je nejdůležitější načte až 2., který je k ničemu :(

Neví někdo jak to vyřešit? Ten problém s pozicí, se zbytkem bych si už měl poradit. :-)

private void timer1_Tick(object sender, EventArgs e)
{
    FileStream fw = new FileStream(@"log.txt", FileMode.Open, FileAccess.Write, FileShare.ReadWrite);
    StreamWriter writer = new StreamWriter(fw);
    fw.Seek(logpos, SeekOrigin.Begin);

    //009
    try
    {
        // cteni pokerstars.log.0 a zapisovani do log.txt
        FileStream fr = new FileStream(pathlogfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        StreamReader reader = new StreamReader(fr);

        //nastaveni pozice
        fr.Seek(pspos, SeekOrigin.Begin);

        //prvni cyklus; cte radky z pokerstars.log.0, ktere se maji vytahnout do log.txt
        //******************************************************************* 1. CYKLUS ********************************************************************
        while (reader.EndOfStream == false)
        {
            string text = reader.ReadLine();
            if (text.Contains("MSG_0x0009-T"))
            {
                string cardtemp = text;
                text = reader.ReadLine();
                //  iffirst:
                if (text.Contains("::: "))
                {
                    string cardtemp1 = text;
                    text = reader.ReadLine();
                    //  ifsecond:
                    if (text.Contains("::: "))
                    {
                        i++;
                        string cardtemp2 = text;
                        writer.WriteLine(i + " " + cardtemp + " " +
                            cardtemp1 + " " + cardtemp2);
                        listBox1.Items.Add(i + " " + cardtemp + " " +
                            cardtemp1 + " " + cardtemp2);
                        cislo1 = cardtemp.Split(' ');
                        //listBox1.Items.Add(cislo1[2]);
                        break;
                    }
                    else
                    {
                        text = reader.ReadLine();
                        //   goto ifsecond;
                    }
                }
                else
                {
                    text = reader.ReadLine();
                    // goto iffirst;
                }
            }
        }
        pspos = fr.Position;
        //listBox1.Items.Add(pspos);
        reader.Close();
        fr.Close();
    }
    catch (Exception ex)
    {
        listBox1.Items.Add("***009*** " + ex.Message);
    }

    //007
    try
    {
        FileStream fr2 = new FileStream(pathlogfile, FileMode.Open,
            FileAccess.Read, FileShare.ReadWrite);
        StreamReader reader2 = new StreamReader(fr2);


        //******* TADY VZNIKÁ PROBLÉM, PROTOŽE SE POZICE NEPŘEDÁ PŘESNĚ
        fr2.Seek(pspos, SeekOrigin.Begin);
        //******* TADY VZNIKÁ PROBLÉM, PROTOŽE SE POZICE NEPŘEDÁ PŘESNĚ

        pspos1 = fr2.Position;
        listBox1.Items.Add(pspos1);

        while (reader2.EndOfStream == false)
        {
            string text = reader2.ReadLine();
            cislo2 = text.Split(' ');

            if (text.Contains("MSG_0x0007-T") && text.Contains(cislo1[2]))
            {
                string stacktemp = text;
                text = reader2.ReadLine();
                if (text.Contains("'F'") || text.Contains("'w'"))
                {
                    string stacktemp1 = text;
                    text = reader2.ReadLine();
                    if (text.Contains("'C'") || text.Contains("'c'") ||
                        text.Contains("'W'"))
                    {
                        string stacktemp2 = text;
                        text = reader2.ReadLine();
                        if (text.Contains("'*'"))
                        {
                            string stacktemp3 = text;
                            writer.WriteLine(i + " " + stacktemp + " " +
                                stacktemp1 + " " + stacktemp2 + " " + stacktemp3);
                            listBox1.Items.Add(i + " " + stacktemp + " " +
                                stacktemp1 + " " + stacktemp2 + " " + stacktemp3);
                            //listBox1.Items.Add(cislo2[2]);
                            //listBox1.Items.Add(pspos);
                            break;
                        }
                        else
                        {
                            writer.WriteLine(i + " " + stacktemp + " " +
                                stacktemp1 + " " + stacktemp2);
                            listBox1.Items.Add(i + " " + stacktemp + " " +
                                stacktemp1 + " " + stacktemp2);
                            break;
                        }
                    }
                }
            }
        }

        reader2.Close();
        fr2.Close();
    }

    catch (Exception ex)
    {
        listBox1.Items.Add("***007*** " + ex.Message);
    }

    logpos = fw.Position;
    writer.Close();
    fw.Close();

    //druhy cyklus asociuje s promennymi veskera potrebna data z log.txt
    //*********************************** 2. CYKLUS *******************

//a přejmenujte prosím název tohoto vlakna nějak normálně, třeba problém s pozicí :) díky

Editováno 28. července 16:39
 
Nahoru Odpovědět 28. července 16:37
Avatar
Dog
Člen
Avatar
Dog:

Tak jsem zjistil, že filestream,po­sition, je pozice v tomto případě pozice v bytech, potřeboval bych aktuální pozici kursoru :)

 
Nahoru Odpovědět 28. července 21:42
Avatar
Dog
Člen
Avatar
Dog:

nakonec jsem to musel vyřešit trošku krkolomně :)

for (int i = 0; i <= logpos; i++)
                    reader.ReadLine();
string text = reader.ReadLine();
                    logpos++;
Editováno 29. července 20:57
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 29. července 20:56
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 5 zpráv z 5.