PDA

View Full Version : [C] - Thread


nico88desmo
10-04-2007, 13:19
Nel linguaggio C, come si fà a mettere un Thread in attesa, in modo che non occupi la cpu per tot. tempo?

tglman
10-04-2007, 13:31
Se sei All'interno del thread basta che fai una chiamata di sistema per esempio una sleap!!

skerdz
10-04-2007, 13:48
Se sei All'interno del thread basta che fai una chiamata di sistema per esempio una sleap!!

Attenzione, non `sleap` ma `sleep`

system("sleep -s 0.003"); // per 3 millisecondi
system("sleep 3"); // per 3 secondi visto che il flag di default è -s
system("sleep -h 1"); // per 1 ora
system("sleep -d 3"); //per 3 giorni

Ciao ciao
Daniel

beppegrillo
10-04-2007, 13:51
perkè usare system e basarsi su un eseguibile esterno?
Credo sia meglio utilizzare direttamente sleep()

Marco Giunio Silano
10-04-2007, 14:04
in quale os?

nico88desmo
10-04-2007, 14:33
Come OS utilizzo linux;

ma una sleep, ferma il thread o il processo?

Marco Giunio Silano
10-04-2007, 14:44
Come OS utilizzo linux;

ma una sleep, ferma il thread o il processo?

perché non utilizzare una fork?

In ogni caso il tuo thread sarà schedulato. Se non deve fare niente, istanzialo quando deve lavorare...

nico88desmo
10-04-2007, 14:53
facendo la fork creo un nuovo processo, però i 2 processi che poi avrò non possono condividere gli stessi dati;

Per questo motivo utilizzo gli thread

Marco Giunio Silano
10-04-2007, 14:58
facendo la fork creo un nuovo processo, però i 2 processi che poi avrò non possono condividere gli stessi dati;

Per questo motivo utilizzo gli thread

ok, è un po' di anni che non ci lavoro e non vorrei confondermi con eCos, ma il thread dovrebbe essere un processo a se e puoi sospenderlo, così non è più schedulato e "rianimarlo" quando ti serve.
Così te lo togli dai piedi.

ilsensine
10-04-2007, 14:58
ma una sleep, ferma il thread o il processo?
Il thread.

ilsensine
10-04-2007, 15:00
ok, è un po' di anni che non ci lavoro e non vorrei confondermi con eCos, ma il thread dovrebbe essere un processo a se e puoi sospenderlo, così non è più schedulato e "rianimarlo" quando ti serve.
Così te lo togli dai piedi.
E' come un processo, ma con una relazione particolare con i thread fratelli.
Ad esempio non puoi sospendere un solo thread con SIGSTOP come sospenderesti un qualsiasi processo.

nico88desmo
10-04-2007, 16:10
Il thread.

Come mai, dopo aver fatto la sleep, il programma mi si blocca??

beppegrillo
10-04-2007, 16:18
Come mai, dopo aver fatto la sleep, il programma mi si blocca??

perkè non gli passi il parametro? perkè lo chiami solo su un thread?
Impossibile risponderti se non posti almeno 2 righe di codice ;)

nico88desmo
10-04-2007, 16:27
perkè non gli passi il parametro? perkè lo chiami solo su un thread?
Impossibile risponderti se non posti almeno 2 righe di codice ;)

questa è la funzione chiamata dal thread:

void *thread_func(void *c) {
while (1) {
carica(c);
sleep(2);
}
pthread_exit(0);
}

carica è una funzione esterna scritta con linguaggio pascal;

71104
10-04-2007, 17:05
pthread_exit(0) lo puoi anche togliere...

nico88desmo
10-04-2007, 17:40
si infatti..mah, come mai mi si blocca il programma?
carica come funzione serve per stampare una stringa in una textfield scritta con lazarus;

infatti stò facendo i thread con C e interfaccia grafica con lazarus (pascal ad oggetti);

dal sorgente C creo il file oggetto e poi eseguo il link..cosa potrebbe essere che non funziona?

71104
10-04-2007, 20:02
così a sentimento il fatto che il programma si blocchi sembra legato più all'uso che fai di questo lazarus (che non conosco) che non al multithreading, perché poco ma sicuro, la sleep addormenta solo il thread. per verificarlo pova ad eseguire passo passo l'altro thread col debugger.

beppegrillo
10-04-2007, 20:08
quanti thread lanci? non so cosa faccia carica() ma prova a toglierlo.

nico88desmo
10-04-2007, 21:14
quanti thread lanci? non so cosa faccia carica() ma prova a toglierlo.

posto il codice;

Questo è il codice del sorgente C:


void newThread (int sc) {

switch (sc) {

case 1:
res1 = pthread_create(&IDT1, NULL, thread_func, "ciao 1");
break;

case 2:
res2 = pthread_create(&IDT2, NULL, aggiorna_SQL, NULL);
break;
}

}

void *thread_func(void *c) {

int i, pid;
i=0;

while (1) {
carica(c);
sleep(2);
}
pthread_exit(0);
}


Questo invece è quello pascal/delphi:

procedure carica(s: Pchar); cdecl; export;
var
p: string;
begin
p:=s;
form1.Memo1.Append(p);
end;

nico88desmo
10-04-2007, 21:22
così a sentimento il fatto che il programma si blocchi sembra legato più all'uso che fai di questo lazarus (che non conosco) che non al multithreading, perché poco ma sicuro, la sleep addormenta solo il thread. per verificarlo pova ad eseguire passo passo l'altro thread col debugger.

Potrebbe essere un problema del linker?

beppegrillo
10-04-2007, 21:26
Potrebbe essere un problema del linker?

è molto facile scoprirlo, togli quel carica e metti una printf.
Io cmq non vedo errori, quindi direi che il problema è di st'altro coso del pascal che usi :)

nico88desmo
10-04-2007, 21:35
è molto facile scoprirlo, togli quel carica e metti una printf.
Io cmq non vedo errori, quindi direi che il problema è di st'altro coso del pascal che usi :)

anche perchè se ci fossero errori me li direbbe in fase di compilazione.
Mannaggia, è perchè devo fare un'interfaccia grafica, e allora mi è venuto in mente di usare questo lazarus;
Caso mai ci sono altri programmi per creare un'interfaccia grafica? per linux..

71104
10-04-2007, 21:44
anche perchè se ci fossero errori me li direbbe in fase di compilazione.
Mannaggia, è perchè devo fare un'interfaccia grafica, e allora mi è venuto in mente di usare questo lazarus;
Caso mai ci sono altri programmi per creare un'interfaccia grafica? per linux.. tra le miriadi di framework che esistono sto lazarus che dici è il più sconosciuto (Object Pascal poi :huh:, ma dove c@##o l'hai preso?? :D :D)

nico88desmo
10-04-2007, 22:10
tra le miriadi di framework che esistono sto lazarus che dici è il più sconosciuto (Object Pascal poi :huh:, ma dove c@##o l'hai preso?? :D :D)

Siccome a scuola usiamo delphi della Borland per windows, allora ho cercato qualcosa di equivalente per linux e ho trovato questo.
Siceramente farei a meno anche io di usarlo :D , però è quello più semplice;

71104
11-04-2007, 00:25
ma Delphi non aveva una roba che si chiamava Kylix? :wtf:

ilsensine
11-04-2007, 09:43
ma Delphi non aveva una roba che si chiamava Kylix? :wtf:
La Borland ha smesso di mantenerlo, purtroppo.
Mischiare c e pascal è possibile da quello che leggo in giro, con le dovute cautele. Forse le mailing list di Lazarus sono più indicate per trovare questo tipo di aiuto...

ilsensine
11-04-2007, 09:46
procedure carica(s: Pchar); cdecl; export;
var
p: string;
begin
p:=s;
form1.Memo1.Append(p);
end;

Sicuro che il metodo Append è thread safe?
Lo stai chiamando da un thread che non è quello principale...

nico88desmo
11-04-2007, 15:22
Sicuro che il metodo Append è thread safe?
Lo stai chiamando da un thread che non è quello principale...

In che senso? Non capisco...