Autor Beitrag
Default112
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

Win XP
D6 Prof
BeitragVerfasst: Do 04.03.04 01:51 
Ok, mein Problem steckt in folgendem Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
GetMem(p1,sizeof(TThreadParameter));
  PtthreadParameter(p1)^.bbearbeitet := StaticText1;
  PtthreadParameter(p1)^.bsuchzeit := StaticText2;
  PtthreadParameter(p1)^.bbpromin := StaticText3;
  CloseHandle(BeginThread(nil0, @fstatistik,p1, 0, ThreadID));
  GetMem (p2,sizeof(TBiberParameter));
  PBiberParameter(p2)^.bnr := nr;
  //PBiberParameter(p2)^.bprogramm := programm;
  //PBiberParameter(p2)^.bprog := prog;
  //PBiberParameter(p2)^.bnextval := nextval;
  CloseHandle(BeginThread(nil0, @starte, p2, 0, starteID));


Der auskommentierte Teil wirft den Fehler "inkompatible Typen" auf. Das verstehe ich nicht, denn sowohl "bprogramm, bprog, bnextval" als auch "programm, prog und nextval" sind Array von je derselben Länge.

Also ich hatte mir Luckies Tutorial zu Threads durchgelesen und mal versucht, den code nachzustricken. Im Grunde funktioniert alles gut, nur das Problem mit den Arrays verstehe ich nicht.

Danke für Antworten.
Gruss
Def

Moderiert von user profile iconDeCodeGuru: Topic verschoben
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 04.03.04 02:26 
"Array gleicher länge"

Du verlangst da eine ganze Menge von dem Compiler. Er soll dir mehr als einen "einfachen" Typ kopieren. Versuch das mal in C/C++ zu machen. Aber du hast Glück: Delphi kann das. Dazu muss du aber bestimmte Voraussetzungen erfüllen. Alle beteiligten Variablen/Felder müssen den selben Typ haben. Dazu reicht es nicht, dass zu zwei Variablen/Felder gleich deklarierst:
ausblenden Delphi-Quelltext
1:
2:
3:
var
  t1: array[0..9of Integer;
  t2: array[0..9of Integer;

Für das Auge sieht es so aus, als ob t1 und t2 den gleichen Datentyp haben. Für den Compiler sind das aber zwei unterschiedliche Typen. Hierfür gibt es nun zwei Lösungen:
  • Du deklarierst einen eigenen Typ
    ausblenden Delphi-Quelltext
    1:
    2:
    3:
    4:
    5:
    type
      TIntArray10 = array[0..9of Integer;
    var
      t1: TIntArray10;
      t2: TIntArray10;


  • Du deklarierst die beiden Variablen/Felder in der selben Zeile:
    ausblenden Delphi-Quelltext
    1:
    2:
    var
      t1, t2: array[0..9of Integer;




Bei dynamischen Arrays funktioniert das ganze aber nicht. Bei diesen ist eine Zuweisung nur eine Zeigerzuweisung.

_________________
Ist Zeit wirklich Geld?
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 04.03.04 13:41 
AndyB hat folgendes geschrieben:
Bei dynamischen Arrays funktioniert das ganze aber nicht. Bei diesen ist eine Zuweisung nur eine Zeigerzuweisung.

Aber auch das lässt sich (mit ein bisschen Mehrarbeit) per Move oder CopyMemory machen.. (vorher muss natürlich sichergestellt werden, dass genug Speicher reserviert ist)

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 04.03.04 18:58 
Motzi hat folgendes geschrieben:
Move oder CopyMemory

Doch nicht bei dyn. Arrays. Dafür hat Borland extra die Copy() Funktion erweitert.

_________________
Ist Zeit wirklich Geld?
Default112 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

Win XP
D6 Prof
BeitragVerfasst: Do 04.03.04 21:59 
Das Problem hat sich jetzt erledigt, nun hab ich aber schon das nächste.....

Ich hab nu 2 Threads, überhaupt keine Proble damit, aber: Wenn ich das Programm, während die Threads arbeiten, d.h. auf Variablen zugreifen/schreiben, beende, bekomm ich manchmal eine Fehlermeldung. Das passiert aber nich immer, daher bin ich überracht. Gibt es nicht irgendwie eine (möglichst einfache ;) Möglichkeit alle Threads zu schliessen?
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Fr 05.03.04 12:01 
Also ich gebe Threads immer folgender weise frei:

ThreadObj.Terminate; // signalisiert beendigung
ThreadObj.WaitFor; // wartet auf bereitschaft
ThreadObj.Free; // Freigeben

du musst natürlich dafür sorgen das alle Threadobj auch freigeben werden.

wenn du die Thread dynamisch zur Laufzeit erzeugst und ihre Zahl variable ist, kann eine TThreadList oder TObjectList sehr nützlich sein. Die ObjectList kann die ihr zugewiesenen Objekte bei ihrer eigenen Freigebung mit beenden (freigeben), ist von der boolischen Parameter der Create Prozedure abhängig.

_________________
mfg
Tana´Ri