Toon posts:

[c] programma moet dmv timer?? om de 10 sec iets versturen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi, ik loop momenteel stage en ben een communicatie device aan het programmeren.

Het device heeft een bezale versie van Linux draaien en alle POSIX api's staan tot mijn beschikking.

De code ziet er nu al volgt uit


include <....>
..
..

int createAndConnectSocket()
{
commandó's....
}

void *zendOmTienSecs
{
while(1)
send(....);
}

void *haalBerichtenOp
{
while(1)
recv(...);
}

int Main
{
pthread_t haalopThread, zendThread;
int handle1, handle2;
int u = 1;
int t = 1;

printf("%i",createAndConnectSocket());
handle1 = pthread_create(&haalopThread, null, haalBerichtenOp, (void *) t);
handle2 = pthread_create(&zendThread, null, zendOmTienSecs, (void *) u);
}

Ik heb nog nooit POSIX Threads gebruikt alleen in java heb ik ermee geprogrammeerd.

Het is eigenlijk de bedoeling dat die haalopThread gewoon de hele tijd onafhankelijk van het programma, berichten binnen moet halen en die in een array opslaan. Maar ik weet niet hoe ik de thread zo moet creeeren dat de rest van het programma door blijft lopen terwijl deze thread ook zijn werk doet.
In java heb ik toen een gps_plotter gemaakt die onafhankelijk van de rest gewoon de hele tijd gps coordinaten bufferde, terwijl het programma gewoon door ging met tekenen(was een realtime plotter ;))

Plus zendOmTienSecs zou om de 10 sec gewaked moeten worden, hoe doe ik dit?? dmv een interrupt en een timer??

Als hij alleen berichten zou moeten opvangen zou ik gewoon dmv
Join(haalopThread,0) deze thread voortdurende laten lopen, dit kan nu niet omdat andere threads en functies ook nog moeten worden aangeroepen

[ Voor 18% gewijzigd door Verwijderd op 04-11-2004 14:10 ]


Verwijderd

Topicstarter
Ik zet dit ff in een nieuwe post omdat het dan iets overzichtelijker werkt:

Mijn eigenlijke vraag, is het mogelijk een thread te maken die gewoon op de achtergrond voortdurend draait en berichtjes bijv opslaat in een array.

Terwijl de main functie gewoon doorloopt, ik bedoel dat ze allebei een timeslice van 20ms hebben bijvoorbeeld en de heletijd switchen.

die ene thread door een timer aanroepen moet me wel lukken denk ik

--> ik zat zelf te denken gewoon in de main --> while(1){} toe te voegen maar dan knalt het programma er nog uit, heel raar

[ Voor 13% gewijzigd door Verwijderd op 04-11-2004 14:40 ]


Verwijderd

Topicstarter
Ik vind alle voorbeelden die ik nu heb gevonden echt heel slecht.

Ik zou dat namelijk ook dmv een funcitie kunnen doen. waar zij threads voor gebruiken ze laten bijv iets 5x bij elkaar optellen en dan exiten ze de thread, in de functie waarmee ze een thread creeren

bij mij moet ie gewoon op de achtergrond draaien

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:29

Robtimus

me Robtimus no like you

Allereerst: Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif. Da's de EDIT knop, gebruik die de volgende keer alsjeblieft.

Hoe het mij is gelukt om iets elke seconde uit te laten voeren:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
struct timespec delay, delay2;
int i;

delay.tv_sec = 1;
delay.tv_nsec =0;  
delay2.tv_sec = 1;
delay2.tv_nsec =0;  

for (i = 0 ; i < 60 ; i++)
{
    /* doe wat */
    nanosleep(&delay, &delay2);
}
Dat doe wat werd zo netjes elke seconde gedaan (give or take een aantal milliseconden natuurlijk).
Die nanosleep zit dacht ik in time.h

Wil je dit voor altijd doen dan verander je gewoon de loop in for (;;)

[ Voor 8% gewijzigd door Robtimus op 04-11-2004 15:26 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
- gebruik een timer signal
- gebruik een wachtlus zoals hiervoor beschreven
- Indien je niet wil blocken neem je elke scan een timeofday en vergelijk je deze met je vorige timestamp. ( Als je applicatie dat toestaat )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

Voor dit soort problemen zijn itimers uitgevonden, zie de manual van setitimer en getitimer.

Verwijderd

Topicstarter
Ja ik ben nu aan het verdiepen in het VIA eeen timer een signalevent sturen naar een sigAction en deze dan een functie uit te laten voeren, maar ik kan maar geen goeie voorbeelden vinden.

Heeft iemand nog een goed voorbeeld liggen toevallig?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
man setitimer

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Oke heren ik heb nu het volgende :D zit er dicht bij in de buurt denk ik

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

void zendBericht()
{
   printf("hello tweakers :P");
}

void maakTimer(int num_secs, int num_nsecs)
{
   struct sigaction      signaalActie;
   struct sigevent      signaalGebeurtenis;
   sigset_t                 allSigs;
   struct intimerspec  timerSettings;
   timer_t                   timer;

   sigemptyset(&signaalActie.sa_mask);
   signaalActie.sa_flags = SA_SIGINFO;
   signaalActie.sa_sigaction = zendBericht;

   if(sigaction(SIGRTMIN, &signaalActie, NULL)<0)
        printf("fout");
   
   signaalGebeurtenis.sigev_notify = SIGEV_SIGNAL;
   signaalGebeurtenis.sigev_signo = SIGRTMIN;

    if(timer_create(CLOCK_REALTIME,&signaalGebeurtenis,&timer) < 0)
        printf("fout");

   timerSettings.it_value.tv_sec =1;
   timerSettings.it_value.tv_nsec =1;
   timerSettings.it_interval.tv_sec =num_secs;
   timerSettings.it_interval.tv_nsec =num_nsecs;

   if(timer_settime(timer, 0, &timerSettings, NULL) <0 )
      printf("fout");

   sigemptyset(&allSigs);
   while(1)
   {
       sigsuspend(&allSigs);
   }
}

void main()
{
    maakTimer(5,0);
    while(1)
    {}
}


Ik krijg nu een undefined reference to 'timer_create' en to 'timer_settime'
Ik heb het idee dat het te maken heeft met de files die include....
of eventueel meot ik nog iets in de make file toevoegen???

Verwijderd

Topicstarter
Nou ik heb nu gewoon een thread lopen waarin ie x aantal secs sleep doet en dan gewoon een bericht stuurt netzo makkelijk

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Verwijderd schreef op 05 november 2004 @ 14:39:
Nou ik heb nu gewoon een thread lopen waarin ie x aantal secs sleep doet en dan gewoon een bericht stuurt netzo makkelijk
Waarom zou je voor zo'n actie een nieuwe thread gaan aanmaken ( en de administratie die daar bij komt op de koop toe nemen ) als het ook heel goed en makkelijk met een timer gaat?

Anywayz robbie, ik weet niet waar je die functienamen vandaan hebt maar kijk eens naar man setitimer

[ Voor 13% gewijzigd door farlane op 05-11-2004 15:21 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

Verwijderd schreef op 05 november 2004 @ 12:49:
Ik krijg nu een undefined reference to 'timer_create' en to 'timer_settime'
Ik heb het idee dat het te maken heeft met de files die include....
of eventueel meot ik nog iets in de make file toevoegen???
Beide functies zijn op de systemen die ik heb niet aanwezig, en al zeker geen POSIX. Zie verder setitimer, dat is vreselijk simpel in gebruik, en er is zat info over te vinden.

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

NAME
alarm - set an alarm clock for delivery of a signal

SYNOPSIS
#include <unistd.h>

unsigned int alarm(unsigned int seconds);

DESCRIPTION
alarm arranges for a SIGALRM signal to be delivered to the
process in seconds seconds.

If seconds is zero, no new alarm is scheduled.

In any event any previously set alarm is cancelled.
Kijk daar es naar :) Lijkt me in ieder geval veel eenvoudiger.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Zoiets?
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>

void handler(int sig) {
   fprintf(stderr, "handler\n");
   alarm(2);
}

int main(int argc, char* argv[]) {
  int i, j;
  signal(SIGALRM, handler);

  alarm(2);

  for (i=0; i<500; ++i) {
    for (j=0; j<10000000; ++j) {}
  }

  return 0;
}   


(je moet wel uitkijken, dat alles wat je zowel in main als in handler gebruikt te locken oid. Dit zou fout kunnen gaan als main() ook net naar stderr aan het printen was bv.)

[ Voor 26% gewijzigd door Zoijar op 06-11-2004 12:43 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Zoijar schreef op 06 november 2004 @ 12:41:
(je moet wel uitkijken, dat alles wat je zowel in main als in handler gebruikt te locken oid. Dit zou fout kunnen gaan als main() ook net naar stderr aan het printen was bv.)
Hmm, waarom zou dat fout gaan? Het draait toch niet in een andere draad ofzo?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Min of meer wel. Een thread draait ook niet parallel op een single processor systeem. Er komt na een x aantal tijd een interrupt, en dan wordt er een thread gescheduled. Hier gebeurt hetzelfde, de executie gaat over naar een ander adres dmv een clock interrupt na een x aantal seconden. En na return van de signal handler, gaat het weer verder op het punt waar het onderbroken was. Zelfde idee als een task switch, alleen wordt er hier geen environment opgeslagen en restored, maar slechts de program counter veranderd.
Pagina: 1