Waitforexit Esempio C ++ Coda
Così mi sono state combattendo questo problema per un po 'ora e provato molti modi diversi per risolvere il problema, ma non ci riesco. Bascally il livello qualitativo la mia applicazione non fa altro che richiama un file Java per caricare un'applicazione su un dispositivo. Mentre il suo carico la sua è la stampa a una casella RTF, quindi vorrei passare al file successivo. Il problema che sto avendo è che, mentre il primo file viene caricato, il 2 ° cerca di caricare quali casi problemi. Ho provato l'attesa per l'uscita, ma se lo faccio, poi i dati di uscita non ottiene scritta alla casella di testo ricco. Tutte le idee ho provato a mettere l'attesa per l'uscita in molti luoghi diversi, ma doesnt sembrano funzionare. Due metodi di sotto scrivere il stdout o errore al campo richtext. Qualunque idea sarebbe apprezzata. Bascally Ho bisogno il processo di uscire, così poi posso continuare pensato che il forloop per caricare il file successivo. Sei sempre qualsiasi tipo di messaggio di errore Mi sembra come i tuoi argomenti sono - Xmx512M - jar. manca uno spazio dopo l'opzione riga di comando - jar. Questo potrebbe essere la causa per uscire solo subito a causa di non essere in grado di capire il comando. Inoltre, come suggerito M. Babcock, spostare il metodo loaddPB fuori dal thread dell'interfaccia utente, e assicurarsi di avvolgere la parte di carico in un semaforo, in questo modo solo un singolo file viene caricato in un momento e l'interfaccia utente può continuare a fare quello di cui ha bisogno fare. ndash SPFiredrake 9 Febbraio 12 alle 15:29 Sappiate che questo è un po quothackishquot in quel you39re ancora bloccando il thread UI, ma you39re pompare manualmente gli eventi attraverso la coda di messaggi. Questa non è una pratica migliore, e la maggior parte degli sviluppatori vi consiglierà contro di essa. L'opzione migliore è quello di gettare il codice di caricamento in un thread separato. ndash SPFiredrake 9 febbraio 12 a 15: 54I Sto lavorando su un programma che è una coda per la presentazione delle migliaia di piste utilizzando il programma XXX su una X5560 8 core (2P) posto di lavoro. I tempi di esecuzione possono essere ovunque da pochi minuti a frazioni di secondo. Il mio codice Queue inizia fino a 8 fili ed è controllato da un temporizzatore che regola ovunque da 100ms a 2000ms seconda del carico. Non ci sono mai più di 8 posti di lavoro in esecuzione. La coda funziona bene, la velocità è molto buona e posti di lavoro che prendono più di pochi secondi gestito bene. Il problema che sto avendo è quando i tempi di esecuzione sono di piccole dimensioni, ad esempio .25 secondi. Tutto funziona bene per circa 700 corse. le CPU sono impegnati e la velocità è alta. Poi ho iniziare a ricevere le istanze di XXX che completa, ma il sistema sembra per mantenerli in uno stato di attesa per dovunque da pochi secondi a più di un minuto, e l'utilizzo totale di sistema della CPU scende a zero. Il sistema può rimanere inattiva per 30 secondi o più, momento in cui sono realizzati 200 piste, allora il problema si ripete. Il sistema sembra essere in stallo. Perché questi processi Zombie accadere e come posso evitare questo Ive a corto di idee. Io sostengo un elenco dei lavori per l'esecuzione di tipo QueueRec. Questo codice di esecuzione è lanciato in un thread creato dalla coda. Io sostengo un pool di istema :: Diagnostica :: Process che io riutilizzo. -------------------------------------------------- ------ classe ref pubblico QueueRec pubblico: DateTime DateTime mtimequeued mtimesubmitted DateTime mtimecompleted TimeSpan TimeSpan melapsedtime mcputime Discussione mthread bool mrunsuccess int mprocnum pubblico: arrayltSystem statica :: Diagnostica :: Process mprocs GT. inizializzato altrove JobStatus mstatus String margs String mdir bool QueueRec :: Exceute (bool ShowWindow) successo bool falsa System :: Diagnostica :: Process proc mprocsmprocnum proc-gtStartInfo-gtRedirectStandardOutput vero proc-gtStartInfo-gtUseShellExecute falso proc-gtStartInfo-gtFileNamequotXXXquot proc-gtStartInfo - gtArguments margs proc-gtStartInfo-gtWorkingDirectory mdir proc-gtStartInfo-gtCreateNoWindow ShowWindow proc-gtStartInfo-gtErrorDialog risultato vero proc-gtStart () proc-gtWaitForExit () String proc-gtStandardOutput-gtReadLine () se (risultato-gtContains (quotRUN COMPLETEDquot)) successo vero mcputime proc-gtTotalProcessorTime se (mcputime. TotalMillisecondslt1000) del sonno (1000 - mcputime. TotalMilliseconds) (.) disperato tentativo di correzione proc-gtKill () mproc-gtClose () procnullptr cattura successo ritorno Domenica 27 Gennaio 2013 19:20 grazie Reed, Ill guardare in quella. Ho fatto un po 'di test e sembra che readingwriting disco è probabilmente il colpevole. Il problema è stato alleviato quando ho usato un drive SAS, piuttosto che un disco eSATA. Dopo aver fatto qualche ricerca ho aumentato la memoria utilizzata per la cache del disco, modificando il seguente valore da 0 a 1. HKEYLOCALMACHINESYSTEMCurrentControlSetControlSession ManagerMemory ManagementLargeSystemCache Ciò ha reso un grande miglioramento. Ill hanno a che fare un po 'di test per vedere se la soluzione è accettabile. Grazie per i suggerimenti, contrassegnata come risposta da Stephen Toub - MSFT dipendente Microsoft, Proprietario Giovedi, il 31 ° gennaio, 2013 19:46 Lunedi, 28 ° gennaio, 2013 19:39 Tutte le risposte Purtroppo, non sei che mostra la coda e la sua sincronizzazione il palo (né utilizzando le estensioni parallele) - quindi la sua difficile da dire perché ci può essere una situazione di stallo. Si sta utilizzando una collezione threadsafe, come ad esempio ConcurrentQueueltTgt In caso contrario, il problema potrebbe essere nella sincronizzazione della coda stessa. Si consiglia di guardare BlockingCollectionltTgt invece di utilizzare una coda direttamente, così, come il suo orientata per questo tipo di lavoro. Reed Copsey, Jr. - reedcopsey Se un post risponde alla tua domanda, si prega di fare clic su Mark quot come risposta quot su quel post e quot Segna come quot disponibile. Domenica, 27 Gennaio 2013 07:31 Reed, Grazie per la risposta. Io uso Monitor :: Invio e Monitor :: Esci per fare la sincronizzazione e garantire il codice è threadsafe. Posso dirvi il codice della coda è neanche il problema, perché Resource Monitor di Windows mostra le istanze di XXX con uno stato di esecuzione per periodi che sono molto più lungo del tempo di esecuzione, mentre l'utilizzo di sistema della CPU è pari a zero. Per esempio, il tempo di CPU per un processo di XXX può essere .25 secondi ma finiscono per la squadra di processo per 15 secondi. Quando questo accade a 8 casi di XXX l'utilizzo totale della CPU diventa 0. Resourse Monitor mostra chiaramente 8 casi di XXX in esecuzione quasi continuamente in modo che il codice di coda sta funzionando benissimo. Il tempo di CPU XXX viene catturata come mostrato nel codice. Il tempo trascorso viene catturata come segue DateTime t1 DateTime :: Ora DateTime t2 DateTime :: Ora TimeSpan trascorso t1.Subtract (t1) inserisco i tempi trascorsi e della CPU, come i posti di lavoro completo in modo da poter confrontare. Ive ha anche eseguito decine di migliaia di casi di test in cui il tempo di CPU per XXX è 4-7 secondi e si sono verificati problemi. L'unico blocco è in proc-gtWaitForExit () (e monitor :: Invio per sezioni critiche) Ho il sospetto che alcune risorse di sistema potrebbe essere sovraccarico. Il sistema potrebbe essere in attesa di completare alcune attività del disco in quanto sono in corso ha creato un gran numero di file. Quando il tempo di esecuzione è breve vengono creati un gran numero di file quando il runtime è più lungo, allora si creano meno file, ma sono più grandi. Ill dover indagare questa possibilità. Domenica, 27 Gennaio 2013 23:46 Disk IO è sempre un buon candidato per questi tipi di problemi o - In generale, IO disco sullo stesso piatto finirà per essere di serie, in modo da avere più thread scrittura di file su disco in una sola volta in realtà può rallentare il processo, dal momento che si aggiunge contesa lì. Id consiglia veramente cercando il TPL per questo - Parallel. ForForEach, mentre un po 'di dolore da C4343, sono molto bravo a caricare dinamicamente il bilanciamento basato sul lavoro svolto. Invece di utilizzare sempre quot8 threadsquot, si adattano a seconda delle necessità, che spesso può essere meglio nel lungo periodo (anche se spesso ha bisogno tweaking via partizionamento personalizzato, ecc). Reed Copsey, Jr. - reedcopsey Se un post risponde alla tua domanda, si prega di fare clic su Mark quot come risposta quot su quel post e quot Segna come quot disponibile. Lunedi, 28 ° gennaio, 2013 17:22 Grazie Reed, Ill guardare in quella. Ho fatto un po 'di test e sembra che readingwriting disco è probabilmente il colpevole. Il problema è stato alleviato quando ho usato un drive SAS, piuttosto che un disco eSATA. Dopo aver fatto qualche ricerca ho aumentato la memoria utilizzata per la cache del disco, modificando il seguente valore da 0 a 1. HKEYLOCALMACHINESYSTEMCurrentControlSetControlSession ManagerMemory ManagementLargeSystemCache Ciò ha reso un grande miglioramento. Ill hanno a che fare un po 'di test per vedere se la soluzione è accettabile. Grazie per i suggerimenti, Contrassegnato come risposta da Stephen Toub - MSFT dipendente Microsoft, Proprietario Giovedi, il 31 ° gennaio, 2013 19:46 Lunedi, 28 ° gennaio, 2013 19:39 Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione di MSDN Sito web. Se si sceglie di partecipare, il sondaggio on-line sarà presentato a voi quando si lascia il sito Web MSDN. Vuoi partecipare Aiutaci a migliorare MSDN. Visita la nostra pagina UserVoice a presentare e votare le idee Dev centri risorse di apprendimento
Comments
Post a Comment