Einzelnen Beitrag anzeigen

Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

AW: Prozedur mit Parametern an Thread übergeben

  Alt 2. Apr 2014, 10:46
*angestaubten Thread hochhol*
Hallo,

da mein Anliegen dem Thread sehr ähnlich ist möchte ich keinen Neuen öffnen.
Vorweg: Ich habe bis jetzt noch nicht mit Threads gearbeitet. Ich habe nun schon eine ganze Weile mehrere Foren und Tutorials durchgeguckt aber so richtig klar ist mir das ganze noch nicht. Ich bin mir auch nicht 100%ig sicher, ob ein Thread für mich die richtige Lösung ist, da mein Programmablauf trotzdem sequentiell bleiben soll.

Ausgangssituration:
Ich habe eine Procedure in Unit A, welche einen Funktion in Unit B aufruft. Dieser Funktion werden Werte übergeben aufgrund dessen ein Gerät angesteuert wird, welches Messwerte liefert. Diese Messwerte werden dann wieder in den Werten gespeichert. Der Ablauf der Funktion dauert je nach Einstellungen 5-30 Sekunden. In dieser Zeit ist das Hauptprogramm nicht bedienbar. Das ist das Problem. So soll es z.B. auch möglich sein die Messung vorzeitig zu beenden. Ich habe mal versucht den Aufbau auf das nötigste zu beschränken.
Delphi-Quellcode:
unit Main

interface

uses
  Data;
{...}
procedure TMain.Messung;
var
  FData: TData;
  i: integer;
  Messzeit: integer;
  Messwert: double;
begin
  FData := TData.Create;

  for i := 0 to 5 do
  begin
    {Einlesen von Messparametern}
    Messzeit := 5;
    Messwert := 0;
    FData.Messen(Messzeit, Messwert);
    {Weiterarbeiten mit wirklicher Messzeit und Messwert}
  end;

  FreeAndNil(FData);
end;
Delphi-Quellcode:
unit Data
{...}

type
  TData = class
  public
    function Messen(var Messzeit: integer; var Messwert: double): boolean;
  end;
Es handelt sich also um eine Funktion mit var-Parametern. Die Schleife in der Main-Unit soll auch erst weiterlaufen, wenn die funktion "Messen" abgeschlossen ist.
Das ganze muss ich für viele verschiedene Funktionen mit unterschiedlichen Parametern machen. Gibt es da eine Allround-Lösung?

Wenn ich die Funktion als Procedure schreibe und das Beispiel von himitsu in Beitrag #9 verwende erhalte ich folgenden Fehler beim Aufruf von TMyThread.CreateThread(Procedure):
Inkompatible Type: 'TThreadProcedure' und 'procedure, untyped pointer or untyped parameter'

Ich habe auch versucht der Klasse TMyThread die Parameter über Properties vorher zu übergeben, dann den Thread zu starten und später wieder auszulesen. Leider wird der Execute-Abschnitt nicht sofort ausgeführt und meine Schleife läuft bereits weiter, bevor die Werte berechnet wurden.

Die Beispiele im Internet sind leider auch alle sehr allgemein gehalten und viele Dokumente, auf die in Foren verwiesen wurde, existieren nicht mehr.

Ich hoffe Ihr könnt mir einen Denkanstoß geben

Grüße
Headbucket
  Mit Zitat antworten Zitat