| Autor | Beitrag | 
| hanibal 
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: Mo 06.11.06 17:46 
 
Mein OSziluskop stottert, wenn ich die Maus aus dem Fenster bewege    Woran kann das liegen?
 Ps: mein formular ist ein formular mit border = none, und an einem bitmap als wenster, und aktivirter transperent color, und natürlich autobuffred := true. | 
|  | 
| Leuchtturm 
          Beiträge: 1087
 
 Win Vista, Knoppix, Ubuntu
 Delphi 7 Pe, Turbo Delphi, C#(VS 2005 Express), (X)HTML + CSS, bald Assembler
 
 | 
Verfasst: Mo 06.11.06 17:56 
 
Was ist ein(e) OSziluskop  _________________ Ich bin dafür verantwortlich was ich sage - nicht dafür was du verstehst.
 | 
|  | 
| jakobwenzel 
          Beiträge: 1889
 Erhaltene Danke: 1
 
 XP home, ubuntu
 BDS 2006 Prof
 
 | 
Verfasst: Mo 06.11.06 18:36 
 
vllt ein sehr falsch geschriebenes Oszilloskop?
 @Topic: Dein Fehler liegt in Z. 157! Jetz ma im ernst, ohne Quelltext wird dir niemand helfen können.
 _________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
 | 
|  | 
| hanibal  
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: Mo 06.11.06 20:21 
 
das ist Der Quelltext des timers(intervall:=33):
 		                       Delphi-Quelltext 
 									| 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:
 
 | procedure TForm1.paint_timeTimer(Sender: TObject);var FFTFata : TFFTData; WaveData  : TWaveData;
 begin
 
 if BASS_ChannelIsActive(unit1.strs[1]) <> BASS_ACTIVE_PLAYING then Exit;
 
 case funktionox of
 0 :
 begin
 BASS_ChannelGetData(unit1.strs[1], @WaveData, 2048);
 CircleScope.Draw (PaintFrame.Canvas.Handle, WaveData,90, 45);
 end;
 
 1 :
 begin
 BASS_ChannelGetData(unit1.strs[1], @WaveData, 2048);
 OcilloScope.Draw (PaintFrame.Canvas.Handle, WaveData, 0, 45);
 end;
 
 2 :
 begin
 BASS_ChannelGetData(unit1.strs[1], @FFTFata, BASS_DATA_FFT1024);
 Spectrum.Draw (PaintFrame.Canvas.Handle, FFTFata, 25, 0);
 end;
 end;
 
 end;
 |  und das ist der aufrufs Quelltext:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 
 | paintframe.Visible:= true;paint_time.Enabled:= true; \\der timer für das oszilluskop
 BASS_Init(-1, 44100, 0, Application.Handle, nil);
 
 CircleScope := TCircleScope.Create(PaintFrame.Width, PaintFrame.Height);
 OcilloScope := TOcilloScope.Create(PaintFrame.Width, PaintFrame.Height);
 Spectrum    := TSpectrum.Create(PaintFrame.Width, PaintFrame.Height);
 CircleScope.Radius := 30;
 CircleScope.Offset := 50;
 OcilloScope.Offset := 30;
 Spectrum.Height := 50;
 spectrum.Mode:= 0;
 spectrum.Width:= 1;
 CircleScope.BackColor:= oszilbackcolor;
 OcilloScope.BackColor:= oszilbackcolor;
 spectrum.BackColor:= oszilbackcolor;
 circlescope.Pen := oszilcolor;
 ocilloscope.Pen := oszilcolor;
 spectrum.Pen := oszilcolor;
 Spectrum.LineFallOff := 2;
 
 CircleScope.SetBackGround(True, BackImageRes.Picture.Graphic);
 OcilloScope.SetBackGround(True, BackImageRes.Picture.Graphic);
 Spectrum.SetBackGround(True, BackImageRes.Picture.Graphic);
 |  | 
|  | 
| Dunkel 
          Beiträge: 682
 
 Mac OS X Snow Leopard
 Xcode 3.1
 
 | 
Verfasst: Di 07.11.06 16:28 
 
Das liegt unter Umständen an der Tranzparenz des Bitmaps, schalte diese mal testweise ab.
 Tranzparenz kostet einiges mehr an Rechenpower, wenn dein System nicht leistungsfähig genug ist könnte es schon mal haken.
 | 
|  | 
| hanibal  
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: Di 07.11.06 17:53 
 
das muss aber transperent sein nichrt der vom oszilluskop, sondern von der form.
 der vom oszilluskop ist nicht tranzperent.
 | 
|  | 
| Dunkel 
          Beiträge: 682
 
 Mac OS X Snow Leopard
 Xcode 3.1
 
 | 
Verfasst: Mi 08.11.06 19:37 
 
Das testweise Abschalten der Tranzparenz des Formulars tut aber trotzdem nicht weh. Unter Umständen bist Du ja dann auch ein wenig schlauer, oder eben nicht. | 
|  | 
| hanibal  
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: Mi 08.11.06 19:57 
 
es liegt an transperenzcolor := true, aber ich kann das nicht ausschalten, da ich dann ja wieder eine eckige form hab    | 
|  | 
| Dunkel 
          Beiträge: 682
 
 Mac OS X Snow Leopard
 Xcode 3.1
 
 | 
Verfasst: Do 09.11.06 19:32 
 
Tja, shit happens!
 Dein Code ist auf jeden Fall OK, großartig optimieren kannst Du via BASS auch nicht.
 
 Hilft wohl nichts, Du mußt wohl entweder ein eckiges Formular nehmen, oder Dich ein wenig mit der OnDraw bzw. Paint Methode des Formulars auseinandersetzen.
 Machbar ist das, keine Frage. Es steckt aber ein wenig mehr Arbeit dahinter, als nur eine Variable auf True zu setzen.
 
 Tschaka, Du schaffst das! Das Forum hier kann Dir bestimmt weiterhelfen!
 | 
|  | 
| hanibal  
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: Fr 10.11.06 15:55 
 
und wie funktioniert das mit dem ondraw usw?
 ich weiß im mom überhaubt nicht, wonach ich suchen soll    | 
|  | 
| Dunkel 
          Beiträge: 682
 
 Mac OS X Snow Leopard
 Xcode 3.1
 
 | 
Verfasst: Fr 10.11.06 16:21 
 
Schau Dir zum Beispiel mal dieses Tutorial  an.
 Aber wie schon geschrieben, einfaches zusammenklicken von Formularen ist dann nicht mehr. | 
|  | 
| hanibal  
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: Fr 10.11.06 18:22 
 
ich glaub,das das noch ein bisschen hoch für mich ist    muss ich mal schaune, was an da sonst machen kann.
 ist das villeicht mit threads möglich?
 also multitasting? | 
|  | 
| Dunkel 
          Beiträge: 682
 
 Mac OS X Snow Leopard
 Xcode 3.1
 
 | 
Verfasst: Sa 11.11.06 00:30 
 
Probier es aus!
 Nimm den Code aus TCircleScope, TOcilloScope & TSpectrum und pack den in ein TThread-Object (die Draw-Procedure der Units kann fast ohne Änderungen in die Execute-Methode übernommen werden). Das _kann_ mit SingleCore-Prozis ein wenig bringen, auf MultiCores sollte es ohne Probleme flüssig laufen (tut es zumindest bei mir; auch ohne dass diese in einem eigenen Thread laufen).
 
 Alternativ kannst Du den Code aus den oben genannten Units noch ein wenig optimieren/umprogrammieren.
 
 Ansonsten mußt Du halt mit einer stotternden Visualisierung leben, oder ein stink-normales Formular benutzen.
 
 
 btw.
 Was hast Du für Hardware vor Dir stehen? Selbst mit meinem 4 Jahre altem Notebook laufen ähnliche Sachen bei mir problemlos. Sind die Treiber Deiner GraKa auf dem aktuellen Stand?
 
 
 Edit(h) flüstert mir gerade:
 Wie groß machst Du die Visuallisierung? Im FullScreen (bzw. ab einer gewissen Größe) ist TCanvas mehr als nur unperformant. Versuch mal die Visuallisierung via DirectX oder OpenGL zu machen, das sollte flüssiger laufen.
 | 
|  | 
| hanibal  
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: Sa 11.11.06 14:10 
 
die canvas ist 183*97 Pixel groß, also relativ klein.
 ich hab die visualisirung genau so gemacht, wie im beispiel prog von bass.
 wie funktioniert das mit threads?
 ich hab das noch nie gemacht     Und das komische bei der ganzen geschichte ist ja, dass das erst stottert, wenn die maus nichtmehr auf dem fenster ist.
 Auf allen anderen computern die getestet hab, is das genau so     PS: Processor: AMD Athlon 64 3000+
     Grafikkarte: Nvidea GeForce 6600 GT 128 MB
     Speicher: 512 MB
     Win XP Professional | 
|  | 
| Dunkel 
          Beiträge: 682
 
 Mac OS X Snow Leopard
 Xcode 3.1
 
 | 
Verfasst: Sa 11.11.06 20:26 
 
Wenn das Fenster nicht im Vordergrund ist, bzw. nicht aktiv ist, wird vom Windows-Sheduler weniger Rechenzeit dem Programm zugewiesen, das erklärt das Stottern. 
 Oben rechts ist eine Lupe abgebildet, rechts daneben steht 'Suche'. Schon mal da drauf geklickt?
 Google listet auch jede Menge Seiten mit z.T. guten Tutorials und Beispielprogrammen.
 Beide Male in das Suchefld sowas wie 'TThread', 'Thread execute' oder ähnliches eingegeben sollte Dir weiterhelfen!
 | 
|  | 
| hanibal  
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: So 12.11.06 11:59 
 
hab da ein sehr ausführliches tourial von lucki gefunden     Muss ich mich nurnoch reinarbeiten... | 
|  | 
| hanibal  
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: So 12.11.06 15:57 
 
Das ist der Thread quelltext:  												| 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:
 54:
 55:
 56:
 57:
 58:
 59:
 60:
 61:
 62:
 63:
 64:
 65:
 66:
 67:
 68:
 69:
 70:
 71:
 72:
 73:
 74:
 75:
 76:
 77:
 78:
 79:
 80:
 81:
 82:
 83:
 
 | unit Unit17;
 interface
 
 uses
 Windows,Classes,circle_vis,
 osc_vis,CommonTypes,spectrum_vis,bass,Forms,messages,dialogs;
 
 type
 tmythread = class(TThread)
 private
 
 hbtest : hdc;
 procedure UpDateLVCaption;
 protected
 procedure Execute; override;
 public
 FIndex: Integer;
 hstream1 : hstream;
 end;
 
 implementation
 uses unit1;
 
 
 
 
 
 procedure tmythread.Execute;
 var
 r1 : integer;
 FFTFata : TFFTData;
 WaveData  : TWaveData;
 begin
 
 
 
 repeat
 
 case FIndex of
 0 :
 begin
 BASS_ChannelGetData(hstream1, @WaveData, 2048);
 CircleScope.Draw (hbtest, WaveData,90, 45);
 end;
 
 1 :
 begin
 BASS_ChannelGetData(hstream1, @WaveData, 2048);
 OcilloScope.Draw (hbtest, WaveData, 0, 45);
 end;
 
 2 :
 begin
 BASS_ChannelGetData(hstream1, @FFTFata, BASS_DATA_FFT1024);
 Spectrum.Draw (hbtest, FFTFata, 25, 0);
 end;
 end;
 if Terminated then
 break;
 Synchronize(UpdateLVCaption);
 sleep(33);
 until r1 = 123;
 
 
 end;
 
 procedure tmythread.UpDateLVCaption;
 begin
 form1.UpdateLVCaption(hbtest);
 end;
 
 end.
 |  und das der aufrufquelltext:
 		                       Delphi-Quelltext 
 									| 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:
 
 | BASS_Init(-1, 44100, 0, Application.Handle, nil);
 CircleScope := TCircleScope.Create(unit1.form1.PaintFrame.Width, unit1.form1.PaintFrame.Height);
 OcilloScope := TOcilloScope.Create(unit1.form1.PaintFrame.Width, unit1.form1.PaintFrame.Height);
 Spectrum    := TSpectrum.Create(unit1.form1.PaintFrame.Width, unit1.form1.PaintFrame.Height);
 CircleScope.Radius := 30;
 CircleScope.Offset := 50;
 OcilloScope.Offset := 30;
 Spectrum.Height := 50;
 spectrum.Mode:= 0;
 spectrum.Width:= 1;
 CircleScope.BackColor:= oszilbackcolor;
 OcilloScope.BackColor:= oszilbackcolor;
 spectrum.BackColor:= oszilbackcolor;
 circlescope.Pen := oszilcolor;
 ocilloscope.Pen := oszilcolor;
 spectrum.Pen := oszilcolor;
 Spectrum.LineFallOff := 2;
 CircleScope.SetBackGround(True, unit1.form1.BackImageRes.Picture.Graphic);
 OcilloScope.SetBackGround(True, unit1.form1.BackImageRes.Picture.Graphic);
 Spectrum.SetBackGround(True, unit1.form1.BackImageRes.Picture.Graphic);
 
 thread1:= tmythread.Create(True);
 thread1.hstream1 := strs[1];
 thread1.FIndex:= funktionox;
 
 Thread1.Priority := tpnormal;
 thread1.FreeOnTerminate := True;
 thread1.Resume;
 |  und das ist die funktion in unit 1 zum parameter über geben:(sie ist als puplic deklariert)
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 
 | procedure tform1.UpdateLVCaption(htest : hdc);begin
 PaintFrame.Canvas.Handle := htest;
 
 end;
 |  warum zeigt der kein oszilluskop an, wenn ich das starte?
 kommt keine fehlermeldung, started alles ganz nomal, nur das der kein oszilluskop anzeigt    | 
|  | 
| hanibal  
          Beiträge: 157
 
 Win xp
 d7 eterprise
 
 | 
Verfasst: Mo 13.11.06 17:35 
 | 
|  | 
| Dunkel 
          Beiträge: 682
 
 Mac OS X Snow Leopard
 Xcode 3.1
 
 | 
Verfasst: Mo 13.11.06 18:10 
 
Die ganzen X.Draw-Aufrufe würde ich in die Synchronize-Methode packen. Diese interagieren ja mit der visuellen Komponente des Hauptformulars.
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 
 | procedure TMyThread.Execute;begin
 while not Terminated do
 begin
 BASS_ChannelGetData(AudioStream, @GlobalWaveData, 2048);
 Synchronize(ZeichneMich);
 end;
 end;
 
 procedure TMyThread.ZeichneMich;
 begin
 X.Draw(HDC, GlobalWaveData, x, y);
 end;
 |  Nicht getestet! | 
|  |