Toon posts:

[C#] Proces freeze problemen

Pagina: 1
Acties:
  • 136 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi.

ik zal dit keer proberen zo helder mogelijk mijn probleem uit te leggen:

ik werk aan een C# programma
deze voert ffmpeg.exe uit om een videofile.* naar een videofile.flv (flash video) om te zetten

in cmd.exe doe ik dat als volgt:
code:
1
ffmpeg.exe -y -i "input.mov" -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 output.flv

dit proces (ffmpeg.exe) loopt keurig door, CPU@99% totdat de conversie klaar is...(ongeacht hoe lang dit ook duurt) daarna verdwijnt het uit de taskmanager (logisch)

vanuit C# doe ik dit als volgt:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
...
System.Diagnostics.Process ffmpegProc = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo i = new System.Diagnostics.ProcessStartInfo();
i.FileName = "ffmpeg.exe";
i.Arguments = "-y -i \""+inputClip+"\" -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 "+ outputClip;
i.RedirectStandardOutput = true;
i.RedirectStandardInput = true;
i.RedirectStandardError = true;
i.CreateNoWindow = true;
i.UseShellExecute = true;
ffmpegProc.StartInfo = i;
ffmpegProc.MaxWorkingSet = (IntPtr)10000000;
ffmpegProc.WaitForExit(30000);
ffmpegProc.WaitForInputIdle(30000);
ffmpegProc.PriorityBoostEnabled = true;
ffmpegProc.Start();
SendProgressBar.Value = 1;
string output = ffmpegProc.StandardOutput.ReadToEnd();
while(!ffmpegProc.HasExited) 
{
    SendProgressBar.Value = 2;
    if(ffmpegProc.Responding)
    {
        sendStatus.Text = "Busy...";
        ffmpegProc.Refresh();
    }
    else
    {
        sendStatus.Text = "Process died";
    }
    Thread.Sleep(10000);
}
if(ffmpegProc.ExitCode != 0) 
{
    sendStatus.Text = "Error";
    MessageBox.Show("Process exit code: {0}" + ffmpegProc.ExitCode);
}
else 
{
... 

als ik dit uitvoer, wordt ffmpeg.exe dus 'achter de schermen' uitgevoerd
dat gaat in het begin goed... CPU@99%
maar na precies 17 seconden (ongeacht processor/geheugen capaciteit) gaat de CPU tijd voor het ffmpeg.exe proces naar 0% ! (het blijft wel in de taskmanager staan, op nul procent maar met 5MB in gebruik)
(dit in tegenstelling tot ffmpeg vanaf de commandline met identieke files en -switches)

als ik nu dit proces ga bekijken met de VS.NET debugger gebeurt er niks.
_sluit_ ik echter de debugger, dan stoot ineens het proces ffmpeg.exe door en lukt het wel..

heel vreemd..
ik heb deze eigenschappen later toegevoegd:
C++:
1
2
3
4
ffmpegProc.MaxWorkingSet = (IntPtr)10000000;
ffmpegProc.WaitForExit(30000);
ffmpegProc.WaitForInputIdle(30000);
ffmpegProc.PriorityBoostEnabled = true;

omdat ik vermoedde dat er te weinig geheugen/buffer overbleef, maar dit blijft op beide manieren (commandline/System.Diagnostics.Process) zo rond de 4900KB steken dus dat is het ook niet..

kent iemand dit probleem?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
Doe het eens zo:

code:
1
2
3
4
5
6
7
8
9
10
11
p.UseShellExecute = false;
p.FileName = Environment.GetEnvironmentVariable("COMSPEC");
p.StartInfo.RedirectStandardInput   = true;
p.StartInfo.RedirectStandardError   = true;
p.StartInfo.RedirectStandardOutput  = true;

p.Start();

p.StandardInput.WriteLine ("ffmpeg.exe -y -i ..... ");

p.WaitForExit();


(Waarbij p jouw System.Diagnositics.Process is).
Met die code ga je dus eigenlijk gewoon een command window gaan openen, en ga je het commando dat je anders gewoon uitvoert in je console gaan uitvoeren.
Je kan ook nog de CreateNoWindow op true zetten, zodanig dat je niks ziet.

[ Voor 32% gewijzigd door whoami op 18-05-2005 16:30 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
(bedankt voor de hulp)
ik heb nu:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// start ffmpeg
System.Diagnostics.Process p = new System.Diagnostics.Process();
                
p.UseShellExecute = false;
p.FileName = Environment.GetEnvironmentVariable("COMSPEC");
p.StartInfo.RedirectStandardInput    = true;
p.StartInfo.RedirectStandardError    = true;
p.StartInfo.RedirectStandardOutput    = true;

p.Start();

p.StandardInput.WriteLine ("ffmpeg.exe -y -i \""+inputClip+"\" -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 "+ outputClip);

p.WaitForExit();

dan zegtie
code:
1
2
C:\test\test.cs(482): 'System.Diagnostics.Process' does not contain a definition for 'UseShellExecute'
C:\test\test.cs(483): 'System.Diagnostics.Process' does not contain a definition for 'FileName'

raar.. als ik p. intype, dan krijg staat bij de code-completion lijst geen FileName of UseShellExecute..

Verwijderd

Topicstarter
sorry sorry - "StartInfo" moest er nog tussenin

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
Euh, ja, het is natuurlijk ProcessStartInfo dat je nodig hebt...

p.StartInfo.UseShellExecute

maar dat kon je zelf toch wel vinden met een beetje logisch nadenken ?

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:26

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op woensdag 18 mei 2005 @ 16:52:
sorry sorry - "StartInfo" moest er nog tussenin
Op het forum is er een edit-knop :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Ik zal het onthouden, excuses
Maareh, het werkt nog steeds niet..

Als ik nu mijn brouwsel (test.exe) draai en op convert klik (event welke ffmpeg.exe lanceert), dan begint het proces weer, tot na circa 17 seconden... en hop, ffmpeg.exe dropt naar cpu 0%

Echter, kill ik test.exe, dan gaat ffmpeg.exe weer gewoon door met converten
Hoe kan het dat test.exe een door zichzelf gelanceerd proces weer "afknijpt", en waarom na 17 seconden?

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Je kunt toch werken met events, het converteren doe je in een anderen thread en dmv event laat je weten wat het gestart is en later dat hij klaar is.

edit:
Ik lees niet goed, je eigen app blijft niet hangen maar het process dat je start
:Z

[ Voor 26% gewijzigd door pjvandesande op 19-05-2005 10:22 ]


  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 19-04 14:26

dotcode

///\00/\\

Misschien heeft het met je output te maken of zo. Als het buffer vul is moet je die eerst verwerken. Zomaar een gok, het probleem heb ik wel eens gezien...

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

dotcode schreef op donderdag 19 mei 2005 @ 12:08:
Misschien heeft het met je output te maken of zo. Als het buffer vul is moet je die eerst verwerken. Zomaar een gok, het probleem heb ik wel eens gezien...
Dan denk ik dat het eerder in de Input Stream zit. De input stream word gesloten on exit. Dus je zou hem zelf is kunnen sluiten.

Verwijderd

Topicstarter
Ik heb mede dankzij GoT vanalles geprobeerd en opgezocht.
Dit is vooralsnog de beste manier gebleken:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if(inputClip != null)
{
    System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create ();
    string encryptedHash = BitConverter.ToString(md5.ComputeHash(System.Text.Encoding.ASCII.GetBytes(inputClip))).Replace("-", String.Empty).ToLower();
    string outputClip = encryptedHash + ".flv";
    string thisDir = Environment.CurrentDirectory;

    try
    {
        System.Diagnostics.Process p = new Process();
        p.StartInfo.RedirectStandardOutput=false;
        p.StartInfo.FileName = thisDir.ToString() + "\\ffmpeg.exe";
        p.StartInfo.Arguments = "-y -i \"" + inputClip + "\" -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 " + outputClip;
        p.StartInfo.UseShellExecute=false;
        p.StartInfo.CreateNoWindow=true;
        p.Start();
        p.WaitForExit();
        p.Dispose();
        //p.CloseMainWindow();
        //p.Close();
    }
    catch (Exception error)
    {
        MessageBox.Show(error.Message);
    }
}

Hij gaat nu eindelijk boven de 17 seconde... perfect.
Volgens mij komt het door p.Dispose();

Maar nu krijg ik als error (in de exception, en pas NA het succesvol aflopen van het ffmpeg proces) :
code:
1
No process is associated with this object.

Moet ik het op een andere manier afvangen?

[ Voor 6% gewijzigd door Verwijderd op 19-05-2005 14:54 . Reden: typos ]


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Is die p.Dispose nog nodig dan (ná de p.WaitForExit())? Als het programma toch al gesloten is...

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
die Dispose zal idd enkel uitgevoerd worden nadat het proces beeëindigd is.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Hm, nee idd als ik die ook uitzet gaat het ook goed...
Wazig..dan weet ik niet wat er is gebeurd maar ik raak deze code niet meer aan ;)
bedankt
Pagina: 1