Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-12-2011, 09:09   #1
Eddie1985
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?
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 10:30   #2
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da Eddie1985 Guarda i messaggi
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?
ciao! bel programmino, che algoritmo di compressione hai utilizzato? sarei curioso anche io di implementarlo uno, ma la compressione proprio non mi viene...

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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 10:48   #3
Eddie1985
Senior Member
 
Iscritto dal: Oct 2004
Messaggi: 304
Quote:
ciao! bel programmino, che algoritmo di compressione hai utilizzato? sarei curioso anche io di implementarlo uno, ma la compressione proprio non mi viene...
l'utente può scegliere se utilizzare il compressore bzip2 oppure gnuzip....non penso sia semplice inventare un nuovo algoritmo di compressione, se è questo che volevi fare


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.
mi sa che non ho spiegato bene il mio problema
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
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 10:53   #4
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da Eddie1985 Guarda i messaggi
l'utente può scegliere se utilizzare il compressore bzip2 oppure gnuzip....non penso sia semplice inventare un nuovo algoritmo di compressione, se è questo che volevi fare




mi sa che non ho spiegato bene il mio problema
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
capisco scusami allora....
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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 11:07   #5
starfred
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
starfred è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 11:32   #6
Eddie1985
Senior Member
 
Iscritto dal: Oct 2004
Messaggi: 304
Quote:
comunque magari in pvt mi spieghi come hai fatto che mi interessa per favore?
ho fatto con una fork, e poi con una execlp....cmq non è niente di particolarmente complicato, se googleggi un pò dovresti riuscirci (nel caso contattami)


Quote:
ma se metti uno sleep in base alla dimensione del file??
il problema che cercavo di spiegare è quello, non so a priori la dimensione del file, perchè esso deve essere creato


Quote:
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.
uso fork + execlp che immagino sia la stessa cosa che usare la system....ad ogni modo sono in multithread, avevo dimenticato di scriverlo
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 11:38   #7
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da Eddie1985 Guarda i messaggi
ho fatto con una fork, e poi con una execlp....cmq non è niente di particolarmente complicato, se googleggi un pò dovresti riuscirci (nel caso contattami)
scusami stai facendo un programma con licenza?
è 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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 11:48   #8
Eddie1985
Senior Member
 
Iscritto dal: Oct 2004
Messaggi: 304
Quote:
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!

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);
....
}
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 11:50   #9
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da Eddie1985 Guarda i messaggi
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);
....
}
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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 11:50   #10
Eddie1985
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 )
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 11:54   #11
Eddie1985
Senior Member
 
Iscritto dal: Oct 2004
Messaggi: 304
ok anche man execl ....
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 11:56   #12
starfred
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
starfred è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 11:57   #13
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da Eddie1985 Guarda i messaggi
ok anche man execl ....
il man cosa fa?
__________________
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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 12:08   #14
Tommo
Senior Member
 
L'Avatar di Tommo
 
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 );
Quel while può anche essere il "main loop" del programma, quello che conta è che lanci la decompressione su un secondo thread e aspetti così che finisca (o con qualcosa di più complicato tipo una Condition o un pthread_mutex_trylock()).
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.
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 18-12-2011 alle 12:12.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 12:13   #15
Eddie1985
Senior Member
 
Iscritto dal: Oct 2004
Messaggi: 304
Quote:
Non sei in multithread, sei in multiprocesso.
il programma che devo scrivere (anzi che ho scritto) è multithread....puoi spiegarti meglio?

Quote:
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.
ok, quindi quando devo inserire la wait() ? dopo la fork prima di execl?


Quote:
il man cosa fa?
seh vabbè.........
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 12:21   #16
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da Eddie1985 Guarda i messaggi
seh vabbè.........
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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 12:24   #17
starfred
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
starfred è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 12:26   #18
Eddie1985
Senior Member
 
Iscritto dal: Oct 2004
Messaggi: 304
Quote:
Originariamente inviato da Tommo Guarda i messaggi
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 );
Quel while può anche essere il "main loop" del programma, quello che conta è che lanci la decompressione su un secondo thread e aspetti così che finisca (o con qualcosa di più complicato tipo una Condition o un pthread_mutex_trylock()).
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.

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?
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 12:27   #19
Eddie1985
Senior Member
 
Iscritto dal: Oct 2004
Messaggi: 304
Quote:
Originariamente inviato da starfred Guarda i messaggi
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
si il programma che sto facendo usa i pthread....leggi il post sopra che ho appena scritto per capire la situazione
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2011, 12:29   #20
Eddie1985
Senior Member
 
Iscritto dal: Oct 2004
Messaggi: 304
Quote:
Originariamente inviato da tecno789 Guarda i messaggi
scusami ma man serve solo a vedere il manuale o sbaglio? non e' una funzione...

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
Eddie1985 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Il nucleo della cometa interstellare 3I/...
La Russia potrebbe sviluppare un'arma pe...
Manda la RAM Corsair in assistenza, rice...
ASUS ROG G1000 con 'AniMe Holo': saranno...
Un test di longevità ha messo alla prova...
Incat inizia i test dell'incredibile tra...
LG Sound Suite: al CES il sistema audio ...
Avengers Doomsday, il primo trailer &egr...
La crisi delle memorie non farà sconti a...
Il trailer più atteso dell'anno &...
I gamer vogliono i monitor OLED: sopratt...
Samsung alza l’asticella dei televisori ...
Energie rinnovabili 2025: quasi 42% del ...
Le auto elettriche volano in tutta Europ...
Nuovo look per la finestra Esegui su Win...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:31.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v