Waitforexit Beispiel C ++ Warteschlange


Also habe ich dieses Problem seit einer Weile gekämpft und habe viele verschiedene Möglichkeiten, es zu beheben, aber kann nicht. Bascally waht meine app tut ruft eine Java-Datei, um eine Anwendung auf ein Gerät zu laden. Während seine Beladung es auf eine Richtext-Box druckt, dann möchte ich weiter zur nächsten Datei wechseln. Das Problem, das ich habe, ist, dass, während die erste Datei geladen wird, versucht die 2. zu laden, welche Fälle Probleme. Ich habe versucht, die Wartezeit für den Ausgang, aber wenn ich das tun, dann werden die Ausgabedaten nicht in das reiche Textfeld geschrieben. Irgendwelche Ideen, die ich versuchte, das Warten auf Ausfahrt an vielen verschiedenen Orten zu setzen, aber es scheint nicht zu funktionieren. Zwei Methoden unten schreiben die stdout oder Fehler auf die richtext Feld. Jede Idee wäre toll. Grundsätzlich brauche ich den Prozess zu beenden, also dann kann ich weiter gedacht, die forloop, um die nächste Datei zu laden. Bekommst du irgendeine Art von Fehlermeldung Es scheint mir wie deine Argumente sind - Xmx512M - jar. Fehlt ein Leerzeichen nach der Befehlszeilenoption - jar. Das könnte dazu führen, dass es einfach sofort beenden, weil er nicht in der Lage ist, den Befehl zu verstehen. Außerdem, wie M. Babcock vorgeschlagen, verschieben Sie die loaddPB-Methode aus dem UI-Thread, und stellen Sie sicher, um das Laden Teil in einem Semaphor zu wickeln, so wird nur eine einzelne Datei geladen zu einem Zeitpunkt geladen und die Benutzeroberfläche kann weiterhin tun, was sie benötigt tun. Ndash SPFiredrake Feb 9 12 at 15:29 Seien Sie gewarnt, dass dies etwas quothackishquot in, dass you39re noch blockiert die UI-Thread, aber Sie manuell pumpen die Ereignisse durch die Nachricht Warteschlange. Dies ist NICHT eine Best Practice, und die meisten Entwickler werden es dagegen empfehlen. Die beste Option ist, den Ladecode in einen separaten Thread zu werfen. Ndash SPFiredrake Feb 9 12 at 15: 54 Ich arbeite an einem Programm, das eine Warteschlange für die Übermittlung von Tausenden von Läufen mit Programm XXX auf einem 8-Core X5560 (2P) Workstation ist. Die Laufzeiten können überall von wenigen Minuten bis zu Bruchteilen einer Sekunde sein. Mein Warteschlangencode wird bis zu 8 Threads starten und wird von einem Timer gesteuert, der sich von 100ms bis 2000ms je nach Last anpasst. Es sind nie mehr als 8 Jobs laufen. Die Warteschlange funktioniert gut, der Durchsatz ist sehr gut und die Jobs, die mehr als ein paar Sekunden laufen, gehen gut. Das Problem, das ich habe, ist, wenn die Laufzeiten klein sind, zum Beispiel .25 Sekunden. Alles funktioniert gut für ca. 700 Läufe. Der cpus ist beschäftigt und der Durchsatz ist hoch. Dann fange ich an, Instanzen von XXX zu bekommen, die komplett sind, aber das System scheint sie in einem Wartezustand für irgendwo von ein paar Sekunden bis über eine Minute zu halten, und die gesamte System-CPU-Nutzung fällt auf Null. Das System kann für 30 Sekunden oder mehr im Leerlauf bleiben, zu welcher Zeit 200 Läufe gemacht werden, dann wiederholt sich das Problem. Das System scheint in Deadlock zu sein. Warum passieren diese Zombie-Prozesse und wie kann ich das vermeiden? Ich pflege eine Liste von Aufträgen zum Ausführen des Typs QueueRec. Dieser Execute-Code wird in einem von der Warteschlange erstellten Thread gestartet. Ich pflege einen Pool von ystem :: Diagnostics :: Prozess, den ich wiederverwende. -------------------------------------------------- ------ public ref Klasse QueueRec public: DateTime mtimequeued DateTime mtimesubmitted DateTime mtimecompleted TimeSpan melapsedtime ZeitSpan mcputime Thread mthread bool mrunsuccess int mprocnum public: statisches arrayltSystem :: Diagnose :: Prozess gt mprocs. Initialisiert an anderer Stelle JobStatus mstatus String margs String mdir bool QueueRec :: Exceute (bool showwindow) bool Erfolg falsch System :: Diagnose :: Prozess proc mprocsmprocnum proc-gtStartInfo-gtRedirectStandardOutput true proc-gtStartInfo-gtUseShellExecute false proc-gtStartInfo-gtFileNamequotXXXquot proc-gtStartInfo - GtArguments margs proc-gtStartInfo-gtWorkingDirectory mdir proc-gtStartInfo-gtCreateNoWindow showwindow proc-gtStartInfo-gtErrorDialog true proc-gtStart () proc-gtWaitForExit () String Ergebnis proc-gtStandardOutput-gtReadLine () if (result-gtContains (quotRUN COMPLETEDquot)) Erfolg True mcputime proc-gtTotalProcessorTime if (mcputime. TotalMillisecondslt1000) Sleep (1000 - mcputime. TotalMilliseconds) verzweifelter Versuch bei fix proc-gtKill () mproc-gtClose () procnullptr catch (.) Return success Sonntag, 27. Januar 2013 um 19:20 Uhr Danke Schilf, Ill schau in das. Ich habe noch etwas getestet und es scheint, dass das Scheibenleseschreiben wahrscheinlich der Schuldige ist. Das Problem wurde gelindert, als ich ein SAS-Laufwerk anstelle eines eSATA-Laufwerks verwendete. Nachdem ich einige Untersuchungen durchgeführt habe, habe ich den Speicher für das Festplatten-Caching erhöht, indem ich den folgenden Registrierungswert von 0 auf 1 auswähle. HKEYLOCALMACHINESYSTEMCurrentControlSetControlSession ManagerMemory ManagementLargeSystemCache Das machte eine große Verbesserung. Ich muss noch einige Tests machen, um zu sehen, ob die Lösung akzeptabel ist. Vielen Dank für die Vorschläge, als Antwort von Stephen Toub markiert - MSFT Microsoft Mitarbeiter, Besitzer Donnerstag, Januar 31, 2013 7:46 PM Montag, 28. Januar 2013 7:39 PM Alle Antworten Sie haben leider nicht Ihre Warteschlange und ihre Synchronisation in Die Post (noch mit den parallelen Erweiterungen zu) - so ist es schwer zu sagen, warum es eine Deadlock geben kann. Verwenden Sie eine threadsafe-Sammlung, wie z. B. ConcurrentQueueltTgt Wenn nicht, kann das Problem in der Synchronisation der Warteschlange selbst sein. Vielleicht möchten Sie auf BlockingCollectionltTgt schauen, anstatt auch eine Warteschlange direkt zu verwenden, da es für diese Art von Arbeit ausgerichtet ist. Reed Copsey, Jr. - Reedcopsey Wenn ein Beitrag Ihre Frage beantwortet, klicken Sie bitte auf "Mark As Answer" auf diesem Post und klicken Sie auf "Mark as Helpful". Sonntag, 27. Januar 2013 19:31 Reed, Danke für die Antwort. Ich benutze Monitor :: Enter und Monitor :: Beenden, um die Synchronisation durchzuführen und sicherzustellen, dass der Code threadsafe ist. Ich kann sagen, die Warteschlange Code ist nicht das Problem, weil Windows Resource Monitor zeigt Instanzen von XXX mit einem Status von Running für Perioden, die viel länger als die Ausführungszeit sind, während die System-CPU-Nutzung ist Null. Zum Beispiel kann die CPU-Zeit für einen XXX-Prozess 0,25 Sekunden sein, aber der Prozess endet nicht für 15 Sekunden. Wenn dies bei 8 Instanzen von XXX geschieht, wird die gesamte CPU-Nutzung 0. Resourse Monitor zeigt deutlich 8 Instanzen von XXX läuft fast kontinuierlich so dass der Warteschlangencode funktioniert gut. Die XXX cpu Zeit wird wie im Code gezeigt erfasst. Die verstrichene Zeit wird wie folgt aufgezeichnet DateTime t1 DateTime :: Now DateTime t2 DateTime :: Now TimeSpan verstrichtet t1.Subtract (t1) Ich veröffentliche die verstrichenen und cpu mal, wie die Jobs abgeschlossen, damit ich vergleichen kann. Ive laufen auch Zehntausende von Testfällen, wo die CPU-Zeit für XXX 4-7 Sekunden ist und keine Probleme aufgetreten sind. Die einzige Sperrung ist auf proc-gtWaitForExit () (und Monitor :: Enter für kritische Abschnitte) Ich vermute, dass einige Systemressourcen überlastet werden können. Das System kann warten, um eine Festplattenaktivität abzuschließen, da eine große Anzahl von Dateien erstellt wird. Wenn die Laufzeit kurz ist, wird eine große Anzahl von Dateien erstellt, wenn die Laufzeit länger ist, dann werden weniger Dateien erstellt, aber sie sind größer. Ich muss diese Möglichkeit untersuchen. Sonntag, 27. Januar 2013 um 11:46 Uhr Disk IO ist immer ein guter Kandidat für diese Typen oder Probleme - Im Allgemeinen wird die Festplatte IO auf der gleichen Platte am Ende wird seriell, so dass mehrere Threads schriftlich Dateien auf Festplatte auf einmal tatsächlich können Verlangsamen Sie Ihre Verarbeitung, da Sie Konflikte dort hinzufügen. Id wirklich empfehlen, die TPL dafür zu versuchen - Parallel. ForForEach, während ein bisschen Schmerzen von C4343, sind sehr gut auf dynamisch Last Balancing basierend auf der Arbeit beteiligt. Anstatt immer mit quot8 threadsquot, werden sie nach Bedarf anpassen, was oft auf lange Sicht besser sein kann (obwohl es oft tweaking über benutzerdefinierte Partitionierung, etc.). Reed Copsey, Jr. - Reedcopsey Wenn ein Beitrag Ihre Frage beantwortet, klicken Sie bitte auf "Mark As Answer" auf diesem Post und klicken Sie auf "Mark as Helpful". Montag, 28. Januar 2013 um 5:22 Uhr Danke Reed, Ill schau in das. Ich habe noch etwas getestet und es scheint, dass das Scheibenleseschreiben wahrscheinlich der Schuldige ist. Das Problem wurde gelindert, als ich ein SAS-Laufwerk anstelle eines eSATA-Laufwerks verwendete. Nachdem ich einige Untersuchungen durchgeführt habe, habe ich den Speicher für das Festplatten-Caching erhöht, indem ich den folgenden Registrierungswert von 0 auf 1 auswähle. HKEYLOCALMACHINESYSTEMCurrentControlSetControlSession ManagerMemory ManagementLargeSystemCache Das machte eine große Verbesserung. Ich muss noch einige Tests machen, um zu sehen, ob die Lösung akzeptabel ist. Vielen Dank für die Vorschläge, markiert als Antwort von Stephen Toub - MSFT Microsoft Mitarbeiter, Besitzer Donnerstag, Januar 28, 2013 7:46 PM Microsoft führt eine Online-Umfrage, um Ihre Meinung über die Msdn zu verstehen Website. Wenn Sie sich für die Teilnahme entscheiden, wird Ihnen die Online-Umfrage präsentiert, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen Helfen Sie uns, MSDN zu verbessern. Besuchen Sie unsere UserVoice-Seite, um auf Ideen Dev Centers Lernressourcen vorzulegen und abzustimmen

Comments

Popular posts from this blog

Forex Signal Anbieter Ukc

Cashbackforex Hotforex Betrügen

Nachtfuchs Forex