|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
[C] Idea per ciclo di attesa
Salve a tutti
dunque il problema che ho è questo: in un programma scritto in C che deve girare su un sistema Unix-like, devo comprimere alcuni file (non so quanti siano questi file e che dimensione abbiano), quindi devo fare altre operazioni che riguardano l'archivio compresso. Ora il fatto è questo: mi servirebbe un ciclo di attesa che attenda la fine della compressione, in modo da non utilizzare l'archivio compresso che non è ancora stato totalmente compresso Qualcuno ha qualche idea? |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Quote:
comunque rispondendo...potresti fare un file temporaneo, così da non fare neanche il ciclo..alla fine del processo di compressione lo copi e alla fine avrai solo quest'ultimo salvato sull'hd, mentre il file tmp sarà cancellato.
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
|
#3 | ||
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
Quote:
Quote:
con la tua soluzione il problema che avevo ce l'ho lo stesso! non saprei quando ricopiare il file temporaneo, perchè non so a priori quando terminerà la compressione! potrei mettere subito dopo l'inizio della compressione una sleep di un minuto, ma se la compressione dovesse durare di più? oppure se dovesse durare solo 2 secondi? capisci il problema è come poter verificare se la compressione è terminata oppure no |
||
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Quote:
comunque magari in pvt mi spieghi come hai fatto che mi interessa per favore? ma se metti uno sleep in base alla dimensione del file??
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2011
Messaggi: 381
|
Ciao, se usi la system(), essa è bloccante, quindi se sei in monothread non ci son problemi. Se sei in multithread oppure se mandi il programma di compressione in bg allora è più complesso.
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX |
|
|
|
|
|
#6 | |||
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
Quote:
Quote:
Quote:
|
|||
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Quote:
è troppo se ti chiedo di passarmi il sorgente? perchè non riesco a capire come implementare la conversione! premetto che è da un pò che non riesco a farlo. Mi accontenterei anche di farlo in single-thread visto che le fork non le ho ancora fatte per bene!
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
Quote:
scusa cosa è che non riesci ad implementare precisamente? devi semplicemente fare una cosa del genere: int ret = fork (); if (ret = 0) { execlp ("tar", "tar", nome_archivio, NULL); .... } |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
scusami vorresti dire che execlp ti fa la conversione direttamente? ma in che libreria è presente quella funzione??
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
scusami prima del nome dell'archivio, se intendi usare gnuzip, anche "-czf" , se usi bzip2 qualcosa di simile (dai un bel man tar
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
ok anche man execl ....
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2011
Messaggi: 381
|
Non sei in multithread, sei in multiprocesso.
Devi far attendere al padre la terminazione del figlio. Quindi basta una wait() nel padre. Attenzione alla execlp ed alle exec in generale, tutto ciò che scrivi dopo NON può e NON deve essere eseguito.
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Ti serve semplicemente di far partire la decompressione su un nuovo thread, che "possiede" un bool che è sempre false finchè non ha finito.
Poi nel thread principale metti Codice:
pthread_start( thread, decompress, file );
while( !decompressionHasFinished )
{
//anima la gui, fai quello che ti serve di fare
}
pthread_join( thread );
Il multiprocesso non ti serve! E' importante non usare wait() (nel caso del processo) o join() (nel caso del thread) subito, perchè altrimenti il primo thread si blocca in attesa del secondo... e in pratica hai un thread solo. Ultima modifica di Tommo : 18-12-2011 alle 12:12. |
|
|
|
|
|
#15 | |||
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
Quote:
Quote:
Quote:
|
|||
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
scusami ma man serve solo a vedere il manuale o sbaglio? non e' una funzione...
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 2011
Messaggi: 381
|
Un conto sono i processi (diverso descrittore di processi, diverso spazio di indirizzamento, etc...) un conto sono i thread. C'è molta letteratura in giro che ti spiega per bene la differenza tuttavia il grosso vantaggio è che hai la possibilità di accedere alle variabili (condivise) del processo che li crea.
Nel tuo caso sei in multiprocesso. La fork() crea un processo. Se vuoi utilizzare i thread, per il C, ci sono i POSIX thread (pthread). Per creare un pthread si utilizza la pthread_create(..) L'accesso alle variabili condivise avviene attraverso l'uso di semafori, (pthread_mutex_t). Tuttavia è un argomento troppo vasto per dare una spiegazione esaustiva ed alla fine scriverei un libro sulla programmazione concorrente
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
Quote:
mmm qualcosa ho capito, anche se non tutto. il fatto è questo: io nel main ho creato vari thread che soddisferanno varie richieste giunte dal client (fra cui la compressione di file)....quando c'è una richiesta un thread chiama una funzione che supponiamo sia gestisci_richiesta() .... dentro questa funzione poi posso creare un altro thread come mi consigli tu? |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
Quote:
|
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
Quote:
serve per vedere il manuale e capire il funzionamento delle funzioni, ad esempio. nel tuo caso mi sembra che devi capire il funzionamento della funzione execl (e probabilmente anche della tar) quindi usa pure la funzione man |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:31.




















