Zjištění doby provedení akce – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zjištění doby provedení akce – .NET – Fórum – Programujte.comZjištění doby provedení akce – .NET – Fórum – Programujte.com

 

Tootal0
Newbie
18. 5. 2011   #1
-
0
-

Dobrý den,

mám aplikaci, která přehrává multimediální data z paketové sítě. Chtěl bych zjistit, jak dlouho aplikaci trvá než začně přehrávat tzn. od stisku tlačítka start po začátek přehrávání audia/videa.

Přemýšlel jsem, že bych to možná udělal takto:
1)Zjistit si systémový čas - to bych si uložil při stisku tlačítka start
2)Zjistit systémový čas - při začátku přhrávání
3)Udělat rozdíl => výsledná doba

Nevím ale, jak se dostat k systémovému času.

Za každý návrh budu rád.

Nahlásit jako SPAM
IP: 80.188.217.–
Petrroll0
Stálý člen
18. 5. 2011   #2
-
0
-
Nahlásit jako SPAM
IP: 92.62.224.–
Tootal0
Newbie
18. 5. 2011   #3
-
0
-

To Petrroll : Díky, systémový čas tedy získám DateTime time = DateTime.Now; Když ho chci ale vypsat do textboxu, tak hlásí chybu (není stejného datového typu). Zkoušel jsem to pomocí ToString, ale nefunguje.

Konkrétně:

DateTime time = DateTime.Now;

DateTime time2 = DateTime.Now;

TimeSpan rozdil = time - time2;
rozdil = textBox1.Text; - Cannot implicitly convert type 'string' to 'System.TimeSpan'

Nahlásit jako SPAM
IP: 80.188.217.–
nervak0
Věrný člen
18. 5. 2011   #4
-
0
-

rozdil = textBox1.Text;
Naopak.

Nahlásit jako SPAM
IP: 213.211.51.–
Tootal0
Newbie
18. 5. 2011   #5
-
0
-

To nervak :

textBox1.Text = rozdil; - Cannot implicitly convert type 'System.TimeSpan' to 'string'
Nevím, jestli jsem to správně pochopil, ale i když to prohodím, tak se nic nestane.

Nahlásit jako SPAM
IP: 80.188.217.–
nervak0
Věrný člen
18. 5. 2011   #6
-
0
-

textBox1.Text = rozdil.ToString();

Nahlásit jako SPAM
IP: 213.211.51.–
Petrroll0
Stálý člen
18. 5. 2011   #7
-
0
-

DataTime.Now vrací datový typ, který podle mě neposkytuje zrovna dvakrát ideální metodu .ToString. Osobně bych to vyřešil jinak:

textBox1.Text = rozdil.Hours.ToString() + " : " + rozdil.Minutes.ToString() + " : " + rozdil.Seconds.ToString()

Nahlásit jako SPAM
IP: 92.62.224.–
nervak0
Věrný člen
18. 5. 2011   #8
-
0
-

No, to je velký rozdíl...

Nahlásit jako SPAM
IP: 213.211.51.–
Petrroll0
Stálý člen
18. 5. 2011   #9
-
0
-

Jasně, v konečném důsledku tam rozdíl vlastně není, ale třeba mu to pomůže pro ilustraci.

Nahlásit jako SPAM
IP: 92.62.224.–
Tootal0
Newbie
19. 5. 2011   #10
-
0
-

neravk, Petrroll - Díky, už to funguje.

Teď mám ale jiný problém. Časový rozdíl, který chci získat je čas zobrazení. Počáteční čas je v metodě btnStart_Click a koncový v metodě VideoDecoderThread. Problém je, že tak jak je to zapsané mi to hlásí chybu Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.


private void btnStart_Click(object sender, EventArgs e)

{
if (textBox2.Text == String.Empty && textBox3.Text == String.Empty)
{
MessageBox.Show("Nelze se spojit se serverem. Pole RTP Port nebo RTCP Port nejsou vyplněny.");
}

else
{
DateTime time = DateTime.Now;
time1 = time; //time1 mam promennou, kterou muzu pouzivat v celem programu
CreateVideoDecoder();
videoJitter = new System.Collections.Generic.SortedDictionary<UInt32, RTPFrame>();
MIP = ipCombo.Text;
session = new RTPSession(); //Vytvoření potřebných věcí pro zajištění přenosu paketu
receiver = new RTPReceiver();
IPEndPoint rtpEp = new IPEndPoint(IPAddress.Parse(MIP), MRTPPort);
//MRTCPPort = MRTPPort + 1; //Pevné naplnění pro testovací účely
participant = new RTPParticipant(rtpEp, null, null, null);
session.NewRTPPacket = NewRTPPacket;
session.NewRTCPPacket = null;
receiver.AddParticipant(participant);
session.AddReceiver(receiver);

dImage = new Bitmap(videoDecoder.InputWidth, videoDecoder.InputHeight, PixelFormat.Format24bppRgb);
dImageRect = new Rectangle(0, 0, videoDecoder.InputWidth, videoDecoder.InputHeight);
pictureGraphics = pictureBox1.CreateGraphics();

isRunning = true;
videoThread = new System.Threading.Thread(new System.Threading.ThreadStart(VideoDecoderThread));
videoThread.Start();//start

}
}



private void VideoDecoderThread()

{
int iterations = 1;
while (isRunning)
{
iterations++;
RTPFrame frame = CheckJitterForCompleteFrame();//Zkompletování framu

if (frame == null)
{
System.Threading.Thread.Sleep(0);
continue;
}

byte[] asm = frame.GetAssembledFrame();//Přetížení
if (asm == null)
continue;


byte[] pic = videoDecoder.Decode(asm);
if (pic == null)
continue;

iterations++;
MediaPackage mp = new MediaPackage();
mp.Buffer = pic;
DisplayPicture(mp);


DateTime time2 = DateTime.Now;
TimeSpan rozdil = time2 - time1;

if (rozdil.Seconds == 1)
{
textBox1.Text = rozdil.Seconds.ToString() + " vteřina";
}

if (rozdil.Seconds > 1 && rozdil.Seconds < 5)
{
textBox1.Text = rozdil.Seconds.ToString() + " vteřiny";
}

if (rozdil.Seconds > 5)
{
textBox1.Text = rozdil.Seconds.ToString() + "vteřin";
}
}
}

Nahlásit jako SPAM
IP: 80.188.217.–
liborb
~ Redaktor
+18
Guru
Nahlásit jako SPAM
IP: 78.80.52.–
Tootal0
Newbie
19. 5. 2011   #12
-
0
-

To liborb : Vytvořil jsem

public delegate void MujDelegat(string text);

private MujDelegat rozdild;

public Form1()
{.
.
rozdild = new MujDelegat(this.rozdild); // Chyba - Delegate to an instance method cannot have null 'this'.
.
.
}

private void VideoDecoderThread()
{
DateTime time2 = DateTime.Now;
TimeSpan rozdil = time2 - time1;
this.Invoke(this.rozdild, new Object[] { textBox1.Text = rozdil.Seconds.ToString() });
}


Nahlásit jako SPAM
IP: 80.188.217.–
liborb
~ Redaktor
+18
Guru
19. 5. 2011   #13
-
0
-

A řádek:

rozdild = new MujDelegat(this.rozdild);
máš v konstruktoru?

EDIT: a možná si to odkazované vlákno přečti ještě jednou a pořádně :)

Nahlásit jako SPAM
IP: 78.80.52.–
Tootal0
Newbie
19. 5. 2011   #14
-
0
-

To liborb :

To první jsem napsal hodně blbě, máš pravdu.
Zkusil jsem to takto:

v konstruktoru je

rozdild = new MujDelegat(cas);


v metodě private void VideoDecoderThread()
this.Invoke(this.rozdild, new Object[] {});


pak metoda public void cas(string mujrozdil)
{

TimeSpan rozdil = time3 - time1;
textBox1.Text = rozdil.Seconds.ToString() + "ms";
}


Nevím ale co dát jako argument do this.invoke

Nahlásit jako SPAM
IP: 80.188.217.–
liborb
~ Redaktor
+18
Guru
19. 5. 2011   #15
-
0
-

Pokud to chceš řešit tak, že budeš to vypisovanou hodnotu předávat, tak nějak takto:

TimeSpan rozdil = time3 - time1;

string retezec = rozdil.Seconds.ToString() + "ms";
this.Invoke(this.rozdild, new Object[] {retezec});

a samozřejmě funkci cas upravit na:
{ 

textBox1.Text = mujrozdil;
}

Nahlásit jako SPAM
IP: 78.80.52.–
Tootal0
Newbie
19. 5. 2011   #16
-
0
-

To liborb : Děkuji za rady, podle příkladu, který jste uvedl se mi to podařilo.

Nahlásit jako SPAM
IP: 80.188.217.–
CZechBoY+4
Věrný člen
19. 5. 2011   #17
-
0
-

To liborb : máš tam sekundy a připojuješ string "ms" není tam chyba? :)

Nahlásit jako SPAM
IP: 213.192.10.–
liborb
~ Redaktor
+18
Guru
20. 5. 2011   #18
-
0
-
Nahlásit jako SPAM
IP: 78.80.52.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý