Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm Stop (https://www.delphipraxis.net/207019-programm-stop.html)

Schuby 17. Feb 2021 13:50

Delphi-Version: 5

Programm Stop
 
Hallo, ich habe ein Problem mit meinen Programm
Mein Programm sendet über USB Zeile für Zeile einer Datei an meinen CNC Controller.
Das haut auch Super hin, nur kann ich nicht anderes mehr mit meinen Programm machen
bis die File abgearbeitet ist.

Ich hätte gerne ein Break Taste drin, aber das Programm nimmt keine Befehle
an bis die file gesendet wurde.

Ich brauche Ideen wie ich das besser Programmieren könnte.
Wäre Dankbar für Antworten.

mfg

venice2 17. Feb 2021 13:54

AW: Programm Stop
 
Addiere diese procedure und verwende diese innerhalb deiner Send Procedure..

Delphi-Quellcode:
procedure WinProcessMessages;
var
  ProcMsg: TMsg;
begin
  while PeekMessage(ProcMsg, 0, 0, 0, PM_REMOVE) do
  begin
    if (ProcMsg.message = WM_QUIT) then
      Exit;
    TranslateMessage(ProcMsg);
    DispatchMessage(ProcMsg);
  end;
end;

DieDolly 17. Feb 2021 13:54

AW: Programm Stop
 
Zitat:

Ich hätte gerne ein Break Taste drin, aber das Programm nimmt keine Befehle
an bis die file gesendet wurde.
Wie sendest du die Zeilen? In einer For-Schleife?

Ideen:
- lager es in einen Thread aus

venice2 17. Feb 2021 13:57

AW: Programm Stop
 
Zitat:

Zitat von DieDolly (Beitrag 1483196)
Zitat:

Ich hätte gerne ein Break Taste drin, aber das Programm nimmt keine Befehle
an bis die file gesendet wurde.
Wie sendest du die Zeilen? In einer For-Schleife?

Ideen:
- lager es in einen Thread aus

Warum so kompliziert?
WinProcessMessages reicht vollkommen aus.
Es sorgt dafür das andere Messagen weitergeleitet werden

Delphi-Quellcode:
WinProcessMessages;
if bBreak then
  Break
else
SendtoUsb;

DieDolly 17. Feb 2021 14:05

AW: Programm Stop
 
Da das Senden der Daten scheinbar eine dauerhafte Aufgabe ist, bietet sich hier ein Thread doch an.

Schuby 17. Feb 2021 15:06

AW: Programm Stop
 
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

himitsu 17. Feb 2021 15:33

AW: Programm Stop
 
Warum nicht
Delphi-Quellcode:
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;

Schuby 17. Feb 2021 16:16

AW: Programm Stop
 
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

DieDolly 17. Feb 2021 16:24

AW: Programm Stop
 
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.

Schuby 17. Feb 2021 18:40

AW: Programm Stop
 
Danke für eure Hilfen, ich habe mir das hier mal in Ruhe durchgelesen.
Jetzt gehts :-D:-D:-D

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


mfg schuby


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr.
Seite 1 von 2  1 2      

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