Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Threads 'n Arrays


Default112 - Do 04.03.04 01:51
Titel: Threads 'n Arrays
Ok, mein Problem steckt in folgendem Code:


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 - 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:

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:



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


Motzi - 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)


AndyB - 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.


Default112 - 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 - 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.