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.
Fórum › .NET
Zjištění doby provedení akce
Nevím jak hodně to potřebuješ přesné, ale na základní (na sekudny přesné) stačí DateTime.Now http://msdn.microsoft.com/en-us/library/system.datetime.now.aspx
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'
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()
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";
}
}
}
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() });
}
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
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;
}
To CZechBoY : Dal jsem na tvojí radu http://programujte.com/?akce=diskuze&kam=vlakno&tema=18239-certifikat-na-php#142295 a prachsprostě jsem to překopíroval ;)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Grafické provedení programu v C — založil Coolen
Provedení URL na talčítko — založil Pardus
Postupné provedení efektu — založil Pepe
Ktory pascal je doby na vyucbu — založil Kenny
Arduino (C++) - zkraceni doby impulzu — založil martin
Moderátoři diskuze