| Autor |
Beitrag |
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 27.07.10 14:15
Was EAccesViolation mir damit mitteilt weiss ich, nur nicht warum??
Info dazu:
MainForm erzeugt zur Laufzeit Form3.
Form3=MDIChild.
Aufruf des Threads in Form3.
Delphi-Quelltext 1: 2: 3:
| ...... TScanThread.Create(mychan1, xzoom); ..... |
Thread arbeitet alles ab ruft zum Schluss Sycronize auf
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TScanThread.Execute; var ...... begin OutputDebugString('ich arbeite'); ..... ..... ..... OutputDebugString('daten können abgeholt werden'); Synchronize(UpdatePeaks); OutputDebugString('bin Fertig'); Terminate; end;
procedure TScanThread.UpdatePeaks; begin Form3.UpdatePeaks(FpeaksL, FpeaksR); end; |
In Form3 die Procedure zum abholen der Daten.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm3.UpdatePeaks(pL, pR: array of smallint); var i: integer; begin for i:= low(pL) to high(pL) do begin Listbox1.items.add(inttostr(pl[i])) wavebufL[i]:= pL[i]; wavebufR[i]:= pR[i]; end; end; |
Die Arrays wavbufL, wavebufR sind als privat deklariert. Auch wenn ich sie global mache, der gleich Fehler!!
Rufe ich diese Procedure UpdatePeaks, irgendwo zum Test, in der Form3 selber auf klappt alles!
Fülle ich die arrays wavbufL, wavebufR, direkt über den Thread(was man ja nicht machen soll) werden die Arrays gefüllt, müssen aber dafür Global sein, was wiederum nicht geht!!!
Also, was mach ich denn schon wieder Falsch!!
Anbei: Lucky sein VCL ThreadDemo ist einfach super als Anleitung!!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 27.07.10 14:42
Hast du das Ding mal debuggt und geguckt wo und warum die AV auftritt?
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 27.07.10 14:52
Jo hab ich, die beiden Variablen selbst die Listbox in Form3 sind nicht da!!!!
Was mir allerdings die CPU Meldung sagt???
Kann es sein, da Form3 ja nicht der MainThread ist das er deshalb nicht die dortigen Arrays findet???
Hab mal die CPU meldung mit angehangen
Gruss Alf
Einloggen, um Attachments anzusehen!
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 27.07.10 15:00
würde ja fast sagen, dass das Form3 noch nicht (richtig) erzeugt wurde.
Wie/Wann wird es erzeugt und wo/wann wird der Thread gestartet?
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 27.07.10 15:08
Egal wann und wo ich den Thread in Form3 starte, es kommt immer die selbe Meldung!!!
Mache ich in der Procedure vor den Arrays // kommt es zu keiner Fehlermeldung!! Aber die Arrays sind leer, klar. Die anderen Test Funktionieren ja!!??
Rätsel über Rätsel!!!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 27.07.10 15:20
zeig mal die Zuweisung an die Variable Form3 und die Stelle, wo du Form3 erstellst
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 27.07.10 15:33
Jo, in der MainForm
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:
| procedure TEdit_Audio.OpenDateiClick(Sender: TObject); var NewForm: TForm3; begin if OpenDialog1.Execute then begin files:= OpenDialog1.Filename; filename:= ExtractFileName(files);
NewForm:= TForm3.Create(self); ..... ..... end; end; procedure TForm3.FormCreate(Sender: TObject); begin xzoom:= 1; yzoom:= 1; maxxzoom:= 0; sec:= 0; if filename <> '' then begin Caption:= filename; myfile:= filename; Width:= 746; scrollx.Width:= zoomx.Left; ....... ........ setlength(wavebufL, 2600); setlength(wavebufR, 2600); .... .... end else exit; end;
procedure TForm3.ScrollXScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin ....... .......
TScanThread.Create(mychan1, xzoom); end; |
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 27.07.10 16:05
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 27.07.10 16:32
Mh...
FpeaksL, FpeaksR sind die arrays aus dem Thread selbst.
Form3 stammt von TForm3 ab
NewForm ebenfalls von TForm3.
Würde fast sagen Fehler, Form3.UpdatePeaks(FpeaksL, FpeaksR);
kann nicht mehr denken  Mir geht kein Licht auf.
Mh.....
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 27.07.10 16:42
uff...
Ich hab doch schon mit dem kompletten Gartenzaun gewunken. Lies meine letzten beiden posts
BTW: Form3 und NewForm stammen nicht davon ab sondern sind Variablen, die Instanzen des Typs TForm3 halten (können)
Du Rufst auf: Form3.UpdatePeaks(FpeaksL, FpeaksR);
aber beim Erstellen weißt du das form so zu: NewForm:= TForm3.Create(self);
-->Du weißt Form3 NIE einen Wert zu. Trotzdem verwendest du es. Kein Wunder das dort keine Komponenten existieren: Das Formular unter der Variable existiert einfach mal nicht.
Variante 1: Form3 auch verwenden.
Variante 2: Wenn du mehrere Instanzen von TForm3 brauchst, dann gib die Instanz, für die der thread laufen soll, dem thread als parameter mit. Aber aufpassen: Du hast es in ner lokalen Variable erstellt. Wenn der Aufruf aus TForm3 kommt, dann kannst du das nur mit "self" retten.
Für diesen Beitrag haben gedankt: ALF
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 27.07.10 17:42
Flamefire hat folgendes geschrieben : | | BTW: Form3 und NewForm stammen nicht davon ab sondern sind Variablen, die Instanzen des Typs TForm3 halten (können) |
Sorry für den falschen Ausdruck  Ich meine doch Var.
Der Fehler,
Habe nicht mehr geschaut was ich links schreibe. War einfach nur auf den blöden Thread fixiert! Hauptsache der Thread funktioniert, alles andere hab ich gar nicht mehr gesehen, nicht bemerkt (gewusst)
Brauchen tu ich die Variante2. Hab auch irgendwo gelesen wie man das macht, die Instance mit zu übergeben. Glaube im DT. Hab aber nie rausgefunden wie der Thread die Instanc dann auch nutzt.
Bzw. wie Du schon schreibst, 'Aufpassen lokale Variable' , und was da wieder alles zu beachten ist!
Mal sehen wie viele Tage ich brauche um das wieder zu verstehen
Auch wenn Du schon den Zaunpfahl draussen hattest  habe ich es einfach nicht geschnallt!!
Ansonsten ein Big  für die prompte Hilfe, Erklärung!
Gruss Alf
PS: Meist vergess ich sowas wieder leider!!!
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 27.07.10 18:58
verwenden ist doch ganz leicht. Ist doch nur eine variable mit nem wert.
also: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm3.ScrollXScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin ....... .......
TScanThread.Create(mychan1, xzoom,self); end; |
in dem Create speicherst du dir das argument in ne lokale variante und verwendest es stattdessen...
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 27.07.10 19:49
Jo, wie immer ganz einfach. Wenn man es mindestens schon einmal gemacht hat
Ich kann jetzt auch , wenn jemand fragt, sagen wie ein Thread funktioniert was mit Sychronize gemacht wird, bezogen auf den MainThread, wie man Parameter übergibt. Ich habs einmal gemacht
Das was Du sagst ist mir theoretisch klar, aber die Umsetzung mh....
Hab ja schon überlegt die classe mit zu übergeben TForm3, ist aber nur theoretisch, deswegen wüsste ich immer noch nicht, was schreib ich Form3.UpdatePeaks(FpeaksL, FpeaksR) an dieser Stelle. Bin also weit entfernt, zwischen Theorie und Paxis!!!
Also viel  und
Bin halt ein laaaaaaangsam Denker
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 27.07.10 20:02
ja offensichtlich...
was ist Form3? --> Eine Referenz auf das Formular (Zumindest, wenn du die Zuweisung richtig mit Form3:=TForm3.Create() gemacht hättest)
Danach kannst du mit Form3.Methode() da drauf zugreifen.
Was passiert bei frmFOO:=Form3 ? Richtig: Nichts. Es wird nur die Referenz auf das Formular kopiert.
frmFOO.Methode() ist also das gleiche wie oben.
Was passiert wenn man in TForm3.ButtonClick(...) self.Methode() aufruft? Das gleiche wie oben. Denn "self" ist in den Klassen-Methoden von TForm3 eine Referenz auf die Instanz/Formular.
Also erst mal überlegen was du machen willst:
Du willst mehrere Formulare (-Instanzen) vom Typ TForm3 erstellen. Bei nem Klick auf den Button von einem davon, soll ein Thread gestartet werden, der irgendwann mal was an genau diesem Formular ändert.
Also muss der Thread die Instanz kennen, die ihn erstellt hat. Also muss man dem Thread das mal sagen (Parameter im Konstruktor)
Und was haben wir oben gelernt? Man muss ihm eine Referenz auf die Instanz mitgeben.
Darum TThread.Create(...,self)
Der Thread speichert das sich in einer Variable formBAR:TForm3 mittels formBar:=...
Und schon kannst du im Thread auf die Instanz zugreifen, die den Thread erstellt hat.
Für diesen Beitrag haben gedankt: ALF
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 27.07.10 21:18
Thx, dabei hoffe ich nur das ich alles richtig gemacht habe!!!
Ich hatte vergessen zu erwähnen, das ja der Thread in einer anderen Unit liegt!
Hab mir natürlich dadurch, weil nicht mehr dran gedacht( wie immer), Problem eingehandelt das die Unit, TForm3 ja nicht kennt!!!! musste also erst mal wieder was umbauen
Ich glaube, wenn ich vorher dran gedacht hätte, mh.......
Egal
Die Erklärung ist jedenfalls  Auch dies hatte ich mal gewusst, alles wieder vergessen.
Bin halt nur ein gelegenheits Proger und fange immer wieder bei NULL, NIL an
Ansonsten Super Hilfe
Gruss Alf
PS: könntest mein Lehrer sein 
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
|