AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mutithreading: Konsolenausgabe hakt

Ein Thema von iphi · begonnen am 5. Apr 2017 · letzter Beitrag vom 5. Apr 2017
Antwort Antwort
Seite 1 von 2  1 2      
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 11:06
Ok, hier der Minimalcode, der das Problem zeigt:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TPoll = class(TThread)
  private
    { Private declarations }
    POnData : TNotifyEvent;
  protected
    constructor Create(OnData: TNotifyevent);
    procedure Notify;
    procedure Execute; override;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    i: integer;
    P: TPoll;
    procedure PData(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TPoll.Create(OnData: TNotifyevent);
begin
  inherited Create(true);
  Suspended:=false;
  FreeOnTerminate:=true;
  POnData:=OnData;
end;

procedure TPoll.Notify;
begin
if assigned(POnData) then POnData(nil);
end;

procedure TPoll.Execute;

begin
repeat
  sleep(500);
  Synchronize(Notify);
  until terminated;
end;

procedure TForm1.PData(Sender: TObject);
begin
inc(i);
writeln('data packet ',i);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
P:=TPoll.Create(PData);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
P.Terminate;
end;

end.
Das ist eine ganz normale Delphi7-Fensteranwendung mit einem Fenster (Form1, leer), wobei bei den Linkeroptionen "Generate Console Application" angeklickt sein muss.
Nach meinem Verständniss müsste alle 0,5s eine Zeile auf die Konsole ausgegeben werden. Solange die Maus sich nicht bewegt, bleibt der Thread allerdings unerklärlicherweise stehen und es kommt nix.
Hoffentlich ist die Kristallkugel jetzt überflüssig...
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.303 Beiträge
 
Delphi 12 Athens
 
#2

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 11:28
Moin...
Warum verpaßt du dem Thread nicht ein Event mit den "Arbeitsdaten".

...ungetestet:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

type
  TWorkEvent = procedure(Sender: TObject; WorkStep: Integer);

  TPoll = class(TThread)
  private
    FStep: Integer;
    FOnWork: TWorkEvent;
    procedure SyncWork;
  protected
    constructor Create;
    property OnWork: TOnWorkEvent read FOnWork write FOnWork;
    procedure Execute; override;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FPoll: TPoll;
    procedure DoOnWork(Sender: TObject; WorkStep: Integer);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TPoll.Create;
begin
  inherited Create(True);
  Suspended := False;
  FreeOnTerminate := True;
  FStep := 0;
end;

procedure TPoll.Execute;
begin
  repeat
    sleep(500);
    Synchronize(SyncWork);
    // weitere Steps
  until terminated;
end;

procedure TPoll.SyncWork;
begin
  if Assigned(FOnWork) then
  begin
    FOnWork(Self, FStep);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FPoll := TPoll.Create;
  FPoll.OnWork := DoOnWork;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FPoll.Free;
end;

procedure TForm1.DoOnWork(Sender: TObject; WorkStep: Integer);
begin
  writeln('data packet ', WorkStep);
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 11:29
OK - Du gibst also nicht in ein Consolenfenster aus sondern es IST ein consolen Application?!?

Wofür dann das Form?

Hat ein Consolenprogramm überhaupt einen UI-Thread?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.044 Beiträge
 
Delphi 12 Athens
 
#4

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 11:40
Hat ein Consolenprogramm überhaupt einen UI-Thread?
In der Regel nicht. Dafür gibt es eine Abfrage in TApplication.CreateHandle auf IsConsole.

Wenn es lediglich um die Ausgabe geht, würde sich ein separates Form anbieten in dem die Ausgabe erfolgt. Das wäre dann wenigstens konsistent.

Solche Misch-Applikationen haben schon immer für Ärger gesorgt, da sie von Windows überhaupt nicht unterstützt werden (was natürlich manche Leute nicht davon abhält es trotzdem zu machen).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 11:51
(was natürlich manche Leute nicht davon abhält es trotzdem zu machen).
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.114 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 11:57
Was ist denn da jetzt der Unterschied in den Projektoptionen das zu setzen (habe ich noch nie gemacht)

und zum Test einfach mal mit WinApi.Windows.AllocConsole() ein Konsolenfenster aufzumachen in welches man dann mit WriteLn(..) einfach Dinge reinwirft?

Ich mache das gerne
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 12:15
(was natürlich manche Leute nicht davon abhält es trotzdem zu machen).
Andersrum geht es problemlos.

Also VCL-Anwendung und da dann selber eine Console anzeigen (MSDN-Library durchsuchenAllocConsole)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.303 Beiträge
 
Delphi 12 Athens
 
#8

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 12:19
Soviel zum Testen...
Korrekt:
TWorkEvent = procedure(Sender: TObject; WorkStep: Integer) of object;
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.432 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 11:56
CheckSynchronize wird vom Applikationsobjekt einer VCL-Anwendung regelmäßig aufgerufen.
Dadurch werden Synchronize-Anforderungen von Threads verarbeitet.
In einer Konsolenanwendung muss man selbst für den regelmäßigen Aufruf dieser Methode sorgen.

Bei dieser Methode der Datenübergabe muss sowohl der Threaad als auch die Mainthread seine Arbeit unterbrechen.
Deshalb ist es besser asynchron mit Threads zu komunizieren, allerdings auch etwas aufwendiger.
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#10

AW: Mutithreading: Konsolenausgabe hakt

  Alt 5. Apr 2017, 12:01
@ haentschman:

 FPoll.OnWork := DoOnWork; Mein D7-Compiler sagt da:
[Error] Unit1.pas(68): Incompatible types: 'regular procedure and method pointer'

@ Mavarik:

Zitat:
OK - Du gibst also nicht in ein Consolenfenster aus sondern es IST ein consolen Application?!?
Nein, ist sie nicht. Die Konsole habe ich nur zm Debuggen offen.

Zitat:
Wofür dann das Form?
Hab im Beispielprogramm alles bis auf die leere Form rausgeschmissen, da für die Erklärung des Problems unwesentlich.

@ Der schöne Günter:

Zitat:
und zum Test einfach mal mit WinApi.Windows.AllocConsole() ein Konsolenfenster aufzumachen
Hmmm, interessant. Wenn ich mit dieser Variante das Konsolenfenster aufmache, ist das Problem weg.

Geändert von iphi ( 5. Apr 2017 um 12:16 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 04:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz