AGB  ·  Datenschutz  ·  Impressum  







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

Programm Stop

Ein Thema von Schuby · begonnen am 17. Feb 2021 · letzter Beitrag vom 17. Feb 2021
Antwort Antwort
Seite 1 von 2  1 2      
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

AW: Programm Stop

  Alt 17. Feb 2021, 14:05
Da das Senden der Daten scheinbar eine dauerhafte Aufgabe ist, bietet sich hier ein Thread doch an.
  Mit Zitat antworten Zitat
Schuby

Registriert seit: 25. Dez 2018
102 Beiträge
 
#2

AW: Programm Stop

  Alt 17. Feb 2021, 15:06
Ja ich sende über eine for schleife und bei jeder Zeile die
ich sende warte ich auf eine Antwort von USB auf 'ok'
und sende dann die nächste Zeile




mfg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Programm Stop

  Alt 17. Feb 2021, 15:33
Warum nicht Application.ProcessMessages; verwenden?

Delphi-Quellcode:
procedure WinProcessMessages;
var
  ProcMsg: TMsg;
  Handled: Boolean;
begin
  while PeekMessage(ProcMsg, 0, 0, 0, PM_REMOVE) do
  begin
    { Der Teil fehlt auch alles bei dir, welchen Application.ProcessMessages sonst eigentlich machen würde.
    Handled := False;
    if Assigned(Application.OnMessage) then
      Application.OnMessage(MsgProcMsg, Handled);
    if Application.IsPreProcessMessage(ProcMsg) or Application.IsHintMsg(ProcMsg) or Handled
        or Application.IsMDIMsg(ProcMsg) or Application.IsKeyMsg(ProcMsg) or Application.IsDlgMsg(ProcMsg) then
      Continue;
    }

    if (ProcMsg.message = WM_QUIT) then
    begin
      Application.Terminate; // denn wie soll Delphi sonst das Ende mitbekommen, wenn du alle Messages hier abfängst?
      Break; // oder Exit; ... verlässt Beides diese Prozedur, da nach der Schleife eh Schluß ist
    end;
    TranslateMessage(ProcMsg);
    DispatchMessage(ProcMsg);
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Feb 2021 um 15:44 Uhr)
  Mit Zitat antworten Zitat
Schuby

Registriert seit: 25. Dez 2018
102 Beiträge
 
#4

AW: Programm Stop

  Alt 17. Feb 2021, 16:16
Erstmal Danke für die vielen Antworten, aber jetzt blicke ich nicht ganz durch
wie ich meine Procedure da rein bekomme, ich zeige euch mal meine

Delphi-Quellcode:
procedure TForm1.Btn_GCode_Memo2_sendenClick(Sender: TObject);
var count,i: integer;
begin
  if devOpen then
  begin
        for I:= 1 to Form1.Memo2.Lines.Count do
        begin
          Cmd.typ:= CTRLcmd;
          Cmd.cmd:= $10; //
          if not SendCmd(cmd) then //sende über usb
          begin
            MessageDlg('Sende Fehler.!', mtError, [mbOK], 0);
            Exit;
          end;
          SendeStr:= Form1.Memo2.Lines[i-1];
          //Jetzt Zeile senden
          xx:= Buff_fuellen(SendeStr);
          USBsendData(@TxBuff, count);

          //auf ok warten
          repeat
            EmpfStr:='';
            USB_Read;
            sleep(5);
          until res > 0;
          RxBuff_Daten_To_String;
          Memo1.Lines.Add(EmpfStr);
        end;
  end;
end;

mfg
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: Programm Stop

  Alt 17. Feb 2021, 16:24
Am einfachsten ist es, das einfach in einen Thread auszulagern, damit der Mainthread wieder komplett frei wird.
Wenn du die o.g. Lösung einbaust, hängst du immer in Btn_GCode_Memo2_sendenClick fest.

Nur ein Gedankengang
Delphi-Quellcode:
// var ThreadyThreadObject: TThreadyThread;

procedure TForm2.FormCreate(Sender: TObject);
begin
 ReportMemoryLeaksOnShutdown := True; //

 ThreadyThreadObject := TThreadyThread.Create;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
 ThreadyThreadObject.Destroy;
end;
Delphi-Quellcode:
unit ThreadyThread;

interface

uses
 System.Classes;

type
 TThreadyThread = class(TThread)
 private
  {Private-Deklarationen}
 protected
  procedure Execute; override;
 end;

implementation

{ThreadyThread}

procedure TThreadyThread.Execute;
var
 count, i: integer;
 sl: TStringList;
begin
 if devOpen then
  begin
   sl := TStringList.Create;
   try
    TThread.Synchronize(nil,
     procedure
     begin
      sl.AddStrings(Form1.Memo2.Strings);
     end);;

    for i := 1 to sl.count do
     begin
      if Terminated do
       Break; // Stop hier

      Cmd.typ := CTRLcmd;
      Cmd.Cmd := $10; //
      if not SendCmd(Cmd) then // sende über usb
       begin
        MessageDlg('Sende Fehler.!', mtError, [mbOK], 0);
        Exit;
       end;

      TThread.Synchronize(nil,
       procedure
       begin
        SendeStr := Form1.Memo2.Lines[i - 1];
       end);

      // Jetzt Zeile senden
      xx := Buff_fuellen(SendeStr);
      USBsendData(@TxBuff, count);

      // auf ok warten
      repeat
       EmpfStr := '';
       USB_Read;
       sleep(5);
      until res > 0;
      RxBuff_Daten_To_String;

      TThread.Synchronize(nil,
       procedure
       begin
        Memo1.Lines.Add(EmpfStr);
       end);
     end;
   end;
  finally
   sl.Free;
  end;

end.
Am Rande: Form1.Memo2.Lines[i-1]; kann Form1.Memo2.Lines[i]; werden, wenn du in der Schleife bis count-1 zählst und bei 0 statt 1 anfängst.

Geändert von DieDolly (17. Feb 2021 um 16:33 Uhr)
  Mit Zitat antworten Zitat
Schuby

Registriert seit: 25. Dez 2018
102 Beiträge
 
#6

AW: Programm Stop

  Alt 17. Feb 2021, 18:40
Danke für eure Hilfen, ich habe mir das hier mal in Ruhe durchgelesen.
Jetzt gehts

https://wiki.delphigl.com/index.php/...Multithreading


mfg schuby
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

AW: Programm Stop

  Alt 17. Feb 2021, 18:53
Warum nicht Application.ProcessMessages; verwenden?

Delphi-Quellcode:
procedure WinProcessMessages;
var
  ProcMsg: TMsg;
  Handled: Boolean;
begin
  while PeekMessage(ProcMsg, 0, 0, 0, PM_REMOVE) do
  begin
    { Der Teil fehlt auch alles bei dir, welchen Application.ProcessMessages sonst eigentlich machen würde.
    Handled := False;
    if Assigned(Application.OnMessage) then
      Application.OnMessage(MsgProcMsg, Handled);
    if Application.IsPreProcessMessage(ProcMsg) or Application.IsHintMsg(ProcMsg) or Handled
        or Application.IsMDIMsg(ProcMsg) or Application.IsKeyMsg(ProcMsg) or Application.IsDlgMsg(ProcMsg) then
      Continue;
    }

    if (ProcMsg.message = WM_QUIT) then
    begin
      Application.Terminate; // denn wie soll Delphi sonst das Ende mitbekommen, wenn du alle Messages hier abfängst?
      Break; // oder Exit; ... verlässt Beides diese Prozedur, da nach der Schleife eh Schluß ist
    end;
    TranslateMessage(ProcMsg);
    DispatchMessage(ProcMsg);
  end;
end;
Da fehlt gar nichts denn meine Version ist NONVCL.
Application und dein Handle gibt es bei mir nicht.
Nur zur Info!

Zitat:
Wenn du die o.g. Lösung einbaust, hängst du immer in Btn_GCode_Memo2_sendenClick fest.
Das ist quatsch denn dann dürfte WM_PAINT und alle anderen Messagen nicht mehr arbeiten.
überlege doch mal was Application.ProcessMessages; oder meine Version für NONVCL denn macht.

Aber egal es läuft ja jetzt scheinbar bei ihm und Thema erledigt.

Geändert von venice2 (17. Feb 2021 um 18:59 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

AW: Programm Stop

  Alt 17. Feb 2021, 19:05
Zitat:
Das ist quatsch
Ist es nicht.

- button click
-- for-schleife in button click
--- for-schleife arbeit
-- for-schleife ende
- button click ende


Man hängt so lange im button fest/drin, bis das Ende der Schleife erreicht ist. Deshalb ein Thread.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: Programm Stop

  Alt 17. Feb 2021, 19:10
Zitat:
Das ist quatsch
Ist es nicht.

- button click
-- for-schleife in button click
--- for-schleife arbeit
-- for-schleife ende
- button click ende


Man hängt so lange im button fest/drin, bis das Ende der Schleife erreicht ist. Deshalb ein Thread.
Du verstehst es nicht.
So wie du es widergibst müßte die Anwendung innerhalb der schleife hängen tut sie aber nicht unter Verwendung von Application.ProcessMessages;
Deshalb brauche ich dafür nicht extra einen Thread.

Geändert von venice2 (17. Feb 2021 um 19:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Programm Stop

  Alt 17. Feb 2021, 19:31
@venice2:
Nur daß dein NonVCL aber sein VCL kaputt macht, wenn er das einfach so verwendet, da er garantiert die VCL benutzt und dann dadurch mehr Probleme bekommen kann, als es löst.

Zitat:
nicht unter Verwendung von Application.ProcessMessages;
Jupp, wenn das oder Ähnliches verwendet wird, dann hängt es nicht.



Wir haben bei uns eine Variante von Application.ProcessMessages (ähnlich deinem NonVCL-Code), die aber keine Tastatur und Mausereignisse verarbeitet (überschpringt sie und lässt sie in der MessageQueue, für später ... oder Löscht sie, falls gewünscht), damit z.B. nicht während der Schleife "nochmal" auf diesen Button geklickt werden kann.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Feb 2021 um 19:37 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 12:30 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