Autor Beitrag
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
2:
3:
      ......     
      TScanThread.Create(mychan1, xzoom);
      .....

Thread arbeitet alles ab ruft zum Schluss Sycronize auf
ausblenden 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'); //ist nur für mich
    .....
    .....
    .....
    OutputDebugString('daten können abgeholt werden');//ist nur für mich
    Synchronize(UpdatePeaks);
    OutputDebugString('bin Fertig'); // ist nur für mich
    Terminate;
end;

procedure TScanThread.UpdatePeaks;
begin
    Form3.UpdatePeaks(FpeaksL, FpeaksR);
end;

In Form3 die Procedure zum abholen der Daten.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
//die Arrays pL, pR sind mit den daten gefüllt 
procedure TForm3.UpdatePeaks(pL, pR: array of smallint);
var i: integer;
//testL: array of smallint;               // zum testen!!
begin
     //setlength(testL,2600);            //zum Testen!!
     
     for i:= low(pL) to high(pL) do
     begin
         //testL[i]:= pl[i]             //zum testen  funct!!
         //Main.Listbox1.items.add(inttostr(pl[i]))  //funct!!
        //hier wavebufL, wavbufR und Listbox1 EAccesViolation???
         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: user profile iconLucky 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 27.07.10 14:42 
Hast du das Ding mal debuggt und geguckt wo und warum die AV auftritt?
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 27.07.10 15:20 
zeig mal die Zuweisung an die Variable Form3 und die Stelle, wo du Form3 erstellst
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 27.07.10 15:33 
Jo, in der MainForm
ausblenden volle Höhe 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:
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;
// in NewForm = Form3-------------------
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);//max witdh |muss noch genau bestimmt werden;
       setlength(wavebufR, 2600);//max width |also Auflösung 2monitore usw.;

       ....
       ....
   end
   else
   exit;
end;

//irgend wann click auf die scrollbox----------------------------------
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 27.07.10 16:05 
und dir ist dabei nichts aufgefallen? auch nicht an meiner formulierung?

ausblenden Delphi-Quelltext
1:
    Form3.UpdatePeaks(FpeaksL, FpeaksR);					

ausblenden Delphi-Quelltext
1:
NewForm:= TForm3.Create(self);					


fällt dir was auf?
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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 :gruebel: Mir geht kein Licht auf. :lupe:
Mh.....

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 27.07.10 17:42 
user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
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 :oops: 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) :wink:
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 :wink:

Auch wenn Du schon den Zaunpfahl draussen hattest :mrgreen: habe ich es einfach nicht geschnallt!!
Ansonsten ein Big :beer: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 27.07.10 18:58 
verwenden ist doch ganz leicht. Ist doch nur eine variable mit nem wert.
also:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
//irgend wann click auf die scrollbox----------------------------------
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 27.07.10 19:49 
Jo, wie immer ganz einfach. Wenn man es mindestens schon einmal gemacht hat :wink:
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 :wink:
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 :les: und :lupe:

Bin halt ein laaaaaaangsam Denker :rofl:
Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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 :autsch:
Ich glaube, wenn ich vorher dran gedacht hätte, mh....... :think:
Egal :)

Die Erklärung ist jedenfalls :zustimm: Auch dies hatte ich mal gewusst, alles wieder vergessen.
Bin halt nur ein gelegenheits Proger und fange immer wieder bei NULL, NIL an :mrgreen:

Ansonsten Super Hilfe

Gruss Alf
PS: könntest mein Lehrer sein :wink:

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!