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.