Speichern großer Datenmengen

Für allgemeine Fragen zur Programmierung mit PureBasic.
RolandIV
Beiträge: 28
Registriert: 11.09.2004 13:33

Beitrag von RolandIV »

wie würdest du es umsetzen?
finde die idee mit der kugelmaus eigentlich ziemlich genial und gut umsetzbar. andere möglichkeiten wie lichtschranken usw sind zu kompliziert, es funktioniert auch super, bzw hat früher super funktioniert und vollkommen ausgereicht; ich mach schließlich keine kurze präzisionsmessung, die eigentliche präzision wird durch die langzeitmessung erreicht.
Kann damit dann im Endeffekt die Regression der dämpfung berechnen und dann das b-feld der feldspule gut einstellen.
Das Pendel hängt in unserer Schule, und da wär es natürlich auch toll Messungen auszuhängen, die vom pc-programm aus gemacht worden sind
PB-Version: 3.90
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nuja...
> ich würd sowieso das anders umsetzen als über die maus, die zur bedienung da ist...

wenn die Maus als meßgerät das praktischste ist,
wie wärs mit einer alten com-maus und einer art selbstgeschriebenem maustreiber,
der eben die maus-werte nicht zur steuerung des mauszeigers auf dem desktop weiterleitet,
sondern sie in einen globalen speicher schreibt?

auch das mit dem "automatisch nach rechts rücken" würde ich ändern,
ich würde lediglich die y-werte speichern, und beim anzeigen entscheiden,
wie viele werte ich per x-koordinate darstellen will...

PS:
mal'n bissel rumprobiert:

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
OpenWindow(0,0,0,600,300,"Werte Display", #PB_Window_ScreenCentered | #PB_Window_SystemMenu ) 
OpenWindowedScreen(WindowID(0),0,0,600,300,0,0,0) 
Global Dim Werte.l(999999) 
For n=0 To 999999 : f.f = n : Werte(n) = Sin(#PI * f / 5000)*150 + 150 : Next 
Pos = 5000 : ValPerX = 12 
Repeat 
  ExamineKeyboard() 
  EVT = WindowEvent() 
  If KeyboardPushed(#PB_Key_Left) And Pos > 0 : Pos -40 : EndIf 
  If KeyboardPushed(#PB_Key_Right) : Pos +40 : EndIf
  If Pos > 999999 - 600 * ValPerX : Pos = 999999 - 600 * ValPerX : EndIf
  If KeyboardReleased(#PB_Key_PageDown) And ValPerX > 4 : ValPerX - 4  : EndIf 
  If KeyboardReleased(#PB_Key_PageUp) And ValPerX < 1000 : ValPerX + 4  : EndIf 
  
  If KeyboardPushed(#PB_Key_Escape) Or EVT = #PB_Event_CloseWindow : EXIT = 1 : EndIf 
  ClearScreen($402010) 
  StartDrawing(ScreenOutput()) 
    FrontColor($80C020)
    DrawingMode(1)
    count = 1
    XPos = 0
    Repeat
      APos = Pos + count + XPos * ValPerX 
      Plot(XPos,Werte(APos))
      count +1 : If count > ValPerX : count = 1 :XPos + 1: EndIf
      
    Until XPos = 600
    DrawText(0, 0,"ValPerX = "+Str(ValPerX))
    DrawText(0,12,"Pos = "+Str(Pos))
  StopDrawing() 
  FlipBuffers() 
Until EXIT = 1
PageUp/PageDown ändert die anzahl werte pro screen-x...
bei über 100 werten pro x wirds langsam....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
RolandIV
Beiträge: 28
Registriert: 11.09.2004 13:33

Beitrag von RolandIV »

eben es wird langsam, das wären etwa 20 schwingungen schätznugsweise, die sind bei unserem pendel in etwa 160 sekunden, also knapp 3 minuten rum.... es wäre cool, wenn man während der aufnahme sieht, wie stark die dämpfung ist, damit man eventuell schon mal das magnetfeld während der messung einstellen kann und den effekt gleich sieht...
wobei da wäre eine idee, man sieht die aktuellen schwingungen, vllt etwa 10 und die erste schwingung wird dabei immer angezeigt, um einen vergleich zur ursprungsschwingung zu haben.

das mit dem maustreiber kann ich nicht, so viel ahnung hab ich von PB nicht.

wenn ich nur die y-koordinate speichere und die x-koordinate dazu berechne ist das natürlich flexibler, das setzt allerdings voraus, dass die mauswerte gleichmäßig ausgelesen werden, damit die richtige schwingung näherungsweise dargestellt wird. wenn die allerdings unregelmäßig, also mal in 10ms abstand dann wieder in 20ms ausgelesen wird, hat das keinen sinn
PB-Version: 3.90
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du musst unterscheiden...

die messung ist fortlaufend.
die wird zuverlässig in einem thrad durchgeführt in korrekten zeitabständen,
und die ergebnisse füllen nach und nach das array.

wenn euer pendel so langsam schwingt, dass 20 schwingungen 160 sec brauchen,
dann dauert es nunmal so lange, bis soviel daten vorhanden sind,
aber trotzdem kannst du soviel wie du willst von den werten schon auf dem bildschirm darstellen.

Darstellung und Messung sind unabhängig voneinander.

das, was so lange dauert bei dem mini-beispiel ist lediglich das auslesen
und zeichnen von > 60.000 punkten (600 screenbreite, 100 pro pix)

die messung findet fortlaufend im hintergrund statt und wird nicht davon beeinflusst.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
RolandIV
Beiträge: 28
Registriert: 11.09.2004 13:33

Beitrag von RolandIV »

okay. also wenn die darstellung anfängt zu ruckeln aufgrund von zu vielen punkten beispielsweise, wird die messung im eigenen thread trotzdem noch problemlos weitergemacht? also werden die mauswerte noch in SELBEN zeitabständen gespeichert wie ohne ruckeln? der rest is klar
PB-Version: 3.90
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> wird die messung im eigenen thread trotzdem noch problemlos weitergemacht?
ja
> also werden die mauswerte noch in SELBEN zeitabständen gespeichert wie ohne ruckeln?
ja

deshalb sollst du ja einen thread verwenden,
dessen priorität hochsetzen, und den präzisionstimer verwenden.

...für die beiden letzten punkte sollten wir jedoch nochmal ts-soft konsultieren,
der kennt sich damit konkret besser aus als ich.
ich weiß was theoretisch machbar ist, er weiß wie es geht.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

HighresTimer gibts in PBOSL!

oder hier: http://www.purebasic.fr/german/viewtopi ... ghrestimer
Zuletzt geändert von ts-soft am 23.02.2007 20:14, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
RolandIV
Beiträge: 28
Registriert: 11.09.2004 13:33

Beitrag von RolandIV »

supi danke
PB-Version: 3.90
RolandIV
Beiträge: 28
Registriert: 11.09.2004 13:33

Beitrag von RolandIV »

ich komme mit den threads nicht zurecht...

hier mal ein Code auszug

Code: Alles auswählen

;
;[...]
  Repeat
    ExamineKeyboard()  
     ClearScreen(...)    
     StartDrawing(ScreenOutput())
       FrontColor(0,0,0)
       DrawTextEx(0,0,"Aufnahme-Modus [P]: "+Str(AUFNAHME_MODUS))
     StopDrawing()
        
    FlipBuffers()
    
    ;Starten/Beenden der Aufnahme   
          If KeyboardReleased(#PB_KEY_P)
            Select AUFNAHME_MODUS
              Case 0 ;Aufnahme wird nun gestartet
                AUFNAHME_MODUS=1
                thid=CreateThread(@Aufnahme(),0)
              Case 1 ;Aufnahme lief und wird nun beendet
                AUFNAHME_MODUS=0   
                KillThread(thid)
            EndSelect
          EndIf
  ;[...]
  Until KeyboardPushed(#PB_KEY_ESCAPE)

;[...]
Procedure Aufnahme()
   For a=0 To MESSDAUER*80
;      ExamineMouse()
;      YWerte(a)=MouseDeltaY()
   Next
EndProcedure
Wenn ich Aufnahme() per CreateThread() aufrufe und in der Funktion passiert nix, stürzt es nicht ab. Wenn allerdings die Schleife innerhalb der Funktion durchläuft, selbst wenn in ihr keine ausführungen stattfinden, stürzt das Programm ab.
Hat das irgendwas mit Speicherzugriffen zu tun, wegen der laufvariable a?
PB-Version: 3.90
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ist wenig zu erkennen, mit den aussparungen.
du hast die proc hinten stehen, also nehm ich mal an, du du sie declared hast.
und so sachen wie das Array YWerte() und die variable MESSDAUER dürftest du wohl global haben.

also, es ist nicht so unbedingt anzuschätzen, wo der fehler hängt...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten