AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Multitasking Interna verstehen

Ein Thema von delphifan2004 · begonnen am 15. Jul 2020 · letzter Beitrag vom 22. Jul 2020
Antwort Antwort
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
277 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Multitasking Interna verstehen

  Alt 21. Jul 2020, 20:47
Ich will gerade das hier durchspieln, um Übung in der Programmierung mit Threads unter Windows zu kriegen. Das ist aus Luckies Thread Tutorioal von Seite 12:

Delphi-Quellcode:
type
  TThreadParams = packed record
    Number: Integer;
    Text: String;
  end;
  PThreadParams = ^TThreadParams;


function ThreadFunc(tp: PThreadParams): Integer;
var Number : Integer; Text : string; s : string;
begin
  // Parameter lokalen Variablen zuweisen.
  Number := PThreadParams(tp)^.Number; Text := PThreadParams(tp)^.Text;
  s := ’Zahl: ’ + IntToStr(Number) + #13#10 + ’Text: ’ + Text;
  
  // ExitCode enthält Rückgabewert der Messagebox.
  Result := MessageBox(0, PChar(s), ’Thread’, MB_YESNO or MB_ICONINFORMATION);
  // Reservierten Speicher für Parameter wieder freigeben.
  Dispose(tp);
end;

procedure RunThread;
var
  tp : PThreadParams;
  Thread : THandle;
  ThreadID : Cardinal;
  ExitCode : Cardinal;

begin
  // Speicher für Struktur reservieren.
  New(tp); // Daten den feldern der Struktur zuweisen.
  tp.Number := 42;
  tp.Text := ’Die Antwort.’;
  
  // Thread erzeugen.
  
  Thread := BeginThread(nil, 0, @ThreadFunc, tp, 0, ThreadID);
  
  // Auf Beendigung des Threads warten.
  
  WaitForSingleObject(Thread, INFINITE);
  // Rückgabewert ermitteln...
  GetExitCodeThread(Thread, ExitCode);
  // ...und auswerten.
  case ExitCode of
    IDYES: Writeln(’Benutzer hat "Ja" angeklickt.’);
    IDNO: Writeln(’Benutzer hat "Nein" angeklickt.’);
  end; // Thread-Handle schliessen udn somit das Thread-Objekt zerstören.
  CloseHandle(Thread);
end;
Wo stehen die Zahlenwerte für die Konstanten IDYES und IDNO? In der Unit Windows?

Der Grund ist, in der Case Anweisung wird für die Ausgabe Writeln verwendet, in der Threadfunc aber die Messagebox. In einer VCL Anwendung aber mit writeln hantieren?

Ich will deshalb anstelle der Messagebox eine Funktion unter Verwendung von Readln schreiben, die mir diese beiden Werte erzeugt. Aber dazu brauche ich ja diese Werte. Wenn die in der Windows Unit stehen passt alles. Wenn nicht, wo stehen sie dann? Dann kann ich für meine Thread Gehversuche eine Konsolenanwendung anlegen.

Geändert von delphifan2004 (21. Jul 2020 um 20:50 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Multitasking Interna verstehen

  Alt 22. Jul 2020, 08:00
Immer dieses Rumraten und "Wo steht denn das und dies, ich weiß nicht wie man danach sucht"?

Einfach mal IDE auf und machen, zack zack zack! *Peitschen-Smiley*

Hier, der Bequemlichkeit halber musst du das nur kopieren.
Und nein, der Aufruf von MessageBox hat nichts mit der VCL zu tun, das ist der direkte Aufruf auf die WinAPI-Funktion (https://docs.microsoft.com/en-us/win...ser-messagebox).

Ja, das ist ein Konsolenprojekt.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils,
  Windows;

type
  TThreadParams = packed record
    Number: Integer;
    Text: String;
  end;
  PThreadParams = ^TThreadParams;


function ThreadFunc(tp: PThreadParams): Integer;
var Number : Integer; Text : string; s : string;
begin
  // Parameter lokalen Variablen zuweisen.
  Number := PThreadParams(tp)^.Number;
  Text := PThreadParams(tp)^.Text;
  s := 'Zahl: ' + IntToStr(Number) + #13#10 + 'Text: ' + Text;
  
  // ExitCode enthält Rückgabewert der Messagebox.
  Result := MessageBox(0, PChar(s), 'Thread', MB_YESNO or MB_ICONINFORMATION);
  // Reservierten Speicher für Parameter wieder freigeben.
  Dispose(tp);
end;

procedure RunThread;
var
  tp : PThreadParams;
  Thread : THandle;
  ThreadID : Cardinal;
  ExitCode : Cardinal;

begin
  // Speicher für Struktur reservieren.
  New(tp); // Daten den feldern der Struktur zuweisen.
  tp.Number := 42;
  tp.Text := 'Die Antwort.';
  
  // Thread erzeugen.
  
  Thread := BeginThread(nil, 0, @ThreadFunc, tp, 0, ThreadID);
  
  // Auf Beendigung des Threads warten.
  
  WaitForSingleObject(Thread, INFINITE);
  // Rückgabewert ermitteln...
  GetExitCodeThread(Thread, ExitCode);
  // ...und auswerten.
  case ExitCode of
    IDYES: Writeln('Benutzer hat "Ja" angeklickt.');
    IDNO: Writeln('Benutzer hat "Nein" angeklickt.');
  end; // Thread-Handle schliessen udn somit das Thread-Objekt zerstören.
  CloseHandle(Thread);
end;

begin
  try
    RunThread;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
277 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Multitasking Interna verstehen

  Alt 22. Jul 2020, 08:20
Ok, danke, also kann ich das als Konsolenprojekt machen. Ich dachte, die messagebox sei schon VCL, aber klar, viele Windows Objekte sind ja schon in der API enthalten, stimmt ja auch wieder. Und die Konstantenwerte stehen also in der Windows Unit. Das war es was ich wissen wollte. Wenn ich IDYES im Delphi Editor eingebe kommt keine Hilfe dazu. Ok, ich hätte es mit der Windows Unit auch einfach ausprobieren können, bei fehlerfreier Übersetzung ist alles gut. Aber manchmal weiß es einer hier schon ohne erst groß selber nachzuschauen.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#4

AW: Multitasking Interna verstehen

  Alt 22. Jul 2020, 09:26
Wo stehen die Zahlenwerte für die Konstanten IDYES und IDNO?
Und die Konstantenwerte stehen also in der Windows Unit. Das war es was ich wissen wollte. Wenn ich IDYES im Delphi Editor eingebe kommt keine Hilfe dazu.
Wenn man nicht weiß, wo etwas definiert ist, einfach Strg drücken und mit der Maus auf das Wort klicken. Schon kommt man genau an der Stelle raus, wo das Ding definiert ist. Das funktioniert mindestens mit Variablen und Konstanten, bei Funktionen bin ich grad nicht sicher (hab seit Wochen kein Delphi benutzt).

Gerade die von der Win32 API definierten Werte stehen nicht in der Delphi-Hilfe, weil sie eben von MS definiert sind und nicht von Delphi.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#5

AW: Multitasking Interna verstehen

  Alt 22. Jul 2020, 11:47
> Code Insight

Man kann auch die Maus drüber halten und sieht im Hint den Wert stehen.

Für die WinAPI kann man Online im MSDN bzw. docs.microsoft.com suchen (aber oft/manchmal stehen in deren Hilfe auch keine Werte ... manchmal doch, untendrunter in den Kommentaren)
oder man läd sich das Windows SDK runter (da sind nahezu alle C-Header-Dateien zu allen möglichen Windows-DLLs enthalten, samt Definition der APIs (exportierte Funktionen und nötige Typen, Enums, Konstanten, ...)
Oder man fragt eine Suchmaschine des Vertrauens nach der Konstante und findet irgendwo was.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz