![]() |
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 |
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; |
AW: Programm Stop
Zitat:
Ideen: - lager es in einen Thread aus |
AW: Programm Stop
Zitat:
WinProcessMessages reicht vollkommen aus. Es sorgt dafür das andere Messagen weitergeleitet werden
Delphi-Quellcode:
WinProcessMessages;
if bBreak then Break else SendtoUsb; |
AW: Programm Stop
Da das Senden der Daten scheinbar eine dauerhafte Aufgabe ist, bietet sich hier ein Thread doch an.
|
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 |
AW: Programm Stop
Warum nicht
Delphi-Quellcode:
verwenden?
Application.ProcessMessages;
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; |
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 |
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:
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.
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. |
AW: Programm Stop
Danke für eure Hilfen, ich habe mir das hier mal in Ruhe durchgelesen.
Jetzt gehts :-D:-D:-D ![]() mfg schuby |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 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