Avatar billede rbjensen Nybegynder
10. juni 2003 - 10:10 Der er 11 kommentarer og
1 løsning

C++ I/O, med millisekunders mellemrum.

Jeg skal have skrevet et program der skriver nogle data ud til en port med mellem 1 og 20 millisekunders mellemrum, dog sandsynligvis for det meste hvert 5. ms.
Jeg har selve koden kørende, men jeg ved ikke nok om "real time programmering" til at optimere programmet, hvorfor jeg nu anmoder om hjælp.
Som det er nu har jeg hele programmet i en stor GUI, med en justerbar High Resolution Timer der aktiverer portskrivningen når den "fyrer".
Problemet er at det kræves at hele programmet kører i Real Time Priority, hvilket naturligvis ikke er særligt "pænt" - men hvis jeg ikke kører i RealTime affyres min timer ikke stabilt bare jeg scroller i IE.
Bare for at gøre det hele endnu sværere skal programmet kunne compiles under Borland C++ Builder 4.
En ekstra "bonus"opgave kunne være: hvordan formindsker jeg RAM-forbruget ? 4 MB er lige i overkanten.

Håber at nogen kan hjælpe.
Avatar billede segmose Nybegynder
10. juni 2003 - 11:38 #1
Er det muligt at dele programmet op i tråd med hver sin prioritet?

Bruger du exceptions? hvis ikke så kan du vist vælge at bruge en .lib stub der hedder noehl.lib eller lignende, ligeledes debug info fylder en hel del.
Avatar billede rbjensen Nybegynder
10. juni 2003 - 23:36 #2
Det er sikkert absolut muligt at dele programmet op i tråde - og så kun køre selve "skrivtilporten" tråden i RealTime Pr, ikke ?
Problemet er bare at jeg ikke lige aner hvordan jeg skal gøre ;P
De tre primære problemer er :
1: Hvordan får jeg overhovedet oprettet en tråd ?
2: Hvordan får jeg kommunikeret mine data (selve portnummeret, en integer og andre småting) fra den "primære tråd" (GUI) til skrivetråden ?
3: Hvordan får jeg skrivetråden til at skrive til porten hvert til hvert 20. millisekund ?
- da min eksisterende High Resolution Timer er en nonvisuel komponent i GUI - som derfor stadig ville kræve at GUI kørte med RealTimeP. for at den blev kaldt stabilt...

Ja ja, jeg ved godt jeg er en newbie - det er derfor jeg beder ydmygt om hjælp ;P
Om ønsket skal jeg da gerne tildele flere point - jeg har stærkt brug for lidt (meget) hjælp.

/DT
Avatar billede segmose Nybegynder
11. juni 2003 - 08:24 #3
Du skal se på TThread, specielt på TThreadAttr. Se din hjælp på TThread min help er måske ikke den samme version.

struct TThreadAttr {
  int __detachstate;
  int __schedpolicy;
  TSchedParam __schedparam;
  TSchedParam __inheritsched;
  int __scope;
  TSize_T __guardsize;
  int __stackaddr_set;
  int * __stackaddr;
  TSize_T __stacksize;
} ;
Avatar billede segmose Nybegynder
11. juni 2003 - 09:01 #4
Derudover skal du så til at tænke

Reentrant
- kan de funktioner du kalder fra din thread klare at blive kaldt fra flere tråde eller skal du skrive dem om eller beskytte dem med mutex.

Deadlock
- hvis du venter på resoucer skal du også tage høje for om andre tråde (hoved programmet er også en tråd) kunne finde på at få fat i denne/disse resource(r).

Delte variable
- skal de være volotile eller beskyttes af mutex.
Avatar billede rbjensen Nybegynder
11. juni 2003 - 12:34 #5
Hmm, jeg har tilsyneladende fået løst problem 1, at få oprettet en tråd.
Hvordan får jeg denne tråd til at udføre en funktion med de nævnte mellemrum ?
Jeg tror godt jeg kan flytte selve I/O funktionen over i tråden, men hvordan får jeg så implementeret en timer i tråden så den kaldes med de nævnte mellemrum ?
Ideen er at min GUI skal tage sig af at ændre bitmønstret i den integer der angiver portværdien (jeg skriver til parallelporten), og så skal min "skrivetråd" med de nævnte mellemrum udføre den aktuelle skrivning til porten.
Hele opgaven er "blot" at smide nogle data ud til parallelporten - men jeg sidder temmelig fast...
Avatar billede segmose Nybegynder
11. juni 2003 - 12:39 #6
Du kunne lave en timer der resumer thread'en hver 5ms,og threaden suspender sig selv når den er færdig med at sende, eller hvis det ikke behøver at være så nøjagtig findes der vist en sleepthread du kan fodre med 5ms.
Muligvis kan du slippe afsted med at declare din variable

volatile int value;

og så skriver/læser begge tråd så bare værdien når de er til.
Avatar billede rbjensen Nybegynder
11. juni 2003 - 12:48 #7
Jeg har sandsynligvis misforstået et eller andet - men den eneste timer jeg har adgang til lige nu er en non-visuel VCL komponent som ligger i mit GUI og som derfor er nødt at køre i RealTime Pr. for at blive kaldt stabilt..
Uuuh - mener du at jeg skal lave min tråd som et GUI (med en skjult form), så smide timeren derpå, og så aktivere skrivemetoden ved hver OnTimer event ?
Avatar billede segmose Nybegynder
11. juni 2003 - 12:55 #8
Du kan jo finde inspiration her http://www.eksperten.dk/spm/360008
Avatar billede segmose Nybegynder
11. juni 2003 - 13:11 #9
Og jeg mente en timer med noget callback, kan ikke lige husk hvordan TTimer virker.
Avatar billede rbjensen Nybegynder
20. juni 2003 - 11:49 #10
Segmose, du forvirrede mig meget, men jeg har dog fået tingene til at virke "indirekte" med din hjælp.
Mange tak.
Avatar billede segmose Nybegynder
23. juni 2003 - 11:20 #11
Hvilken løsning valgte du så?
Avatar billede rbjensen Nybegynder
23. juni 2003 - 11:56 #12
To tråde, den ene er GUI, den anden er selve skrivetråden, som deler data vha. "extern int".

Skrivetråden kører i en uendelig løkke og bliver "pauset" med et kald til "Sleep(interval)" mellem hver skriveoperation.

Det er sikkert ikke særlig 'elegant', men det virker glimrende og synes ikke at kræve målelige CPU-ressourcer ifølge mine benchmark programmer.

Det skulle bruges til dette projekt:
http://www.overclocking.dk/litteratur.asp?id=1842&type=guide
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester