In einem Trehad ein Dialog auf rufen und wieder schließen ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

In einem Trehad ein Dialog auf rufen und wieder schließen ?

Beitrag von pluto »

Hallo,
seit Tagen versuche ich ein Dialog(From3) in einem Thread auf zu rufen, was aber einfach nicht klappen möchte.

Das Aufrufen habe ich hinbekommen, und zwar bevor der Thread startet wird jetzt das Dialog aufgerufen.

Aber das schließen bekomme ich nicht hin. Habe alles versucht.

Ich habe heute sogar ein Timer gestartet der das Dialog wieder schließen sollte.
Aber egal was ich versuche: Entweder passiert gar nicht oder was meistens der Fall ist das Programm hängt. dann hilft nur noch STRG+F6 und das Programm per kill zu beenden.

Bei meinem Letzten versuch musst ich sogar mein Rechner neu starten per Reset Taste.
Ich weiß einfach nicht warum das nicht geht.

Ich weiß nur das es ein allgmeines Problem ist.
Aber die Vorschläge aus den andren Foren klappen leider auch nicht.

z.b. eine Procedere aufzurufen die die Extern also nicht im Thread Denifert.
Ich hoffe ihr könnt mir weiter helfen.

Was ich erreichen möchte ist:
Das sobald der Thread gestartet wird, ein Dialog kommt und sobald der Thread beendet ist, sich das Dialog schließt und im Dialog soll per Abbrechen Button der Vorgang abbrechen lassen.

Eigentlich nicht weiter schwierig doch leider ist der Thread im Weg.
Wenn das nicht geht, muss ich auf den Thread versichten.

Es geht dabei um meine 7z Oberfläche für Linux.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Was machst denn du schon wieder?
Ich kann kein Problem erkennen.

Code: Alles auswählen

procedure MyThrd.Execute;
begin
  Synchronize(@ShowForm);
  Sleep(2000);
  Synchronize(@HideForm);
end;
 
procedure MyThrd.ShowForm;
begin
  Form2.Show;
end;
 
procedure MyThrd.HideForm;
begin
  Form2.Hide;
end;

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: In einem Trehad ein Dialog auf rufen und wieder schließe

Beitrag von mschnell »

pluto hat geschrieben:seit Tagen versuche ich ein Dialog(From3) in einem Thread auf zu rufen, was aber einfach nicht klappen möchte.


In einem Thread darfst Du keine LCL-Aufrufe machen - zumindest keine, die irgendetwas auf dem Bildschirm veranstalten.

Wenn Du im Thread auf das Ergebnis des Dialogs warten willst, musst Du Syncronize verwenden.

-Michael

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

habe ich gerade eben versucht. auf gerufen wird es aber geschlossen wird es nicht wieder.
also mein Qulleocde sieht dazu so aus:

Code: Alles auswählen

procedure TBackupThread.StopTimer;
begin
  Form3.Show;
end;
 
procedure TBackupThread.Progress;
begin
  writeln('OK0000');
  Form3.Hide;
end;
 
procedure TBackupThread.Execute;
const
  READ_BYTES = 1;//2048;
var
  S: TStringList;
  M: TMemoryStream;
  P: TProcess;
  n: LongInt;
  BytesRead: LongInt;
  str,fz:String;
  t:Boolean;
  dir:TDir;
begin
  Synchronize(@StopTimer);
  writeln('OK');
 
  //MakeProgress('');
  M := TMemoryStream.Create; BytesRead := 0;
  s:=TStringlist.Create; P := TProcess.Create(nil);
 
  P.CommandLine := '7za '+Para; P.Options := [poUsePipes];
  P.Execute; t:=False;
  str:=''; SetLength(fz,3);
  lw.BeginUpdate;
  if (dirlevel > 1) then begin
    with lw.Items.Add do begin
      dir:=TDir.Create;
      dir.dir:='..';
      dir.TempName:='';
      caption:='[..]';
      data:=dir;
    end;
  end;
 
  while P.Running do begin
 
    M.SetSize(BytesRead + READ_BYTES);
 
    n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
    m.Read(fz[1],1);
 
    if fz[1] <> #10 then
      str:=str+fz[1]
    else begin
      if Pos('Path',str) > 0 then t:=True;
      if str = '' then begin
        t:=False;
    //    Writeln(s.Text);
    //    writeln('.');
        AddLV(lw,s,dirLevel);
        s.Clear;
      end;
 
      if t = True then s.add(str);
      str:='';
    end;
 
    if n > 0 then Inc(BytesRead, n) else Break;
 //   if BytesRead >=9000 then break;
  end;
  lw.EndUpdate;
 
   repeat
    M.SetSize(BytesRead + READ_BYTES);
 
    n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
    m.Read(fz[1],1);
 
    if fz[1] <> #10 then
      str:=str+fz[1]
    else begin
      if Pos('Path',str) > 0 then t:=True;
      if str = '' then begin
        t:=False;
    //    Writeln(s.Text);
        AddLV(lw,s,dirLevel);
        s.Clear;
      end;
 
      if t = True then s.add(str);
      str:='';
    end;
 
    if n > 0 then Inc(BytesRead, n) else Break;
  until n <= 0;
  M.SetSize(BytesRead);
 
//  FreeAndNil(p); FreeAndNil(m);
  p.Free; m.Free;
  Synchronize(@Progress);
end;


Edit:
die nachricht bei Progress wird noch nicht mal ausgeben.

Edit1:
in der Terminel steht folgendes:
[TCustomForm.WMSize] Form1:TForm1 Message.SizeType=128 Message.Width=640 Message.Height=480
[TCustomForm.WMSize] saving restored bounds Form1:TForm1 640x480
TControl.BeginDrag ListView1:TListView Immediate=False
TControl.BeginDrag ListView1:TListView Immediate=False

[TCustomForm.WMSize] Form3:TForm3 Message.SizeType=128 Message.Width=108 Message.Height=51
[TCustomForm.WMSize] saving restored bounds Form3:TForm3 108x51
Xlib: unexpected async reply (sequence 0x2389)!


MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Icg glaub mehr LCL Aufrufe kann man in nen Thread auch nicht mehr reinpacken oder ?
Pluto du darfst aus nem Thread nichts aufrufen was was mit dem Mainprogramm zu tun hat. Lass lieber die Finger von Threads.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Gut, dann muss ich es ohne Thread machen. Schade !
Es geht um meine 7Z Oberfläche.

Aber ein Aufruf auf ein andres Form geht auch nicht. Warum geht dann der erste ?
also das Formula wird angezeigt.mehr leider nicht.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Das Problem liegt nicht am Formular, dass hast du ja ordentlich Synchronized nach meinem Beispiel.
Aber du machst da alles Mögliche mit Komponenten auf dem Formular, was du nicht Synchronized hast.
Mit lw. und so. Da kackt der ab.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

lw ist eine Variable.
muss ich denn alles Synchronized ?
ich Greife auf ein paar Goable Variablen zu
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Pluto, wie wäre es, wenn du dich mit dem Thema threads mal ausgiebig beschäftigst?

Die Synchronize-Geschichte ist dir doch immernoch nicht klar, und das zählt dabei schon fast zu den Grundlagen. Und ich wette, das sich dann auch noch mehr Probleme lösen, wenn du dich damit beschäftigst.
Ich bin ja auch bei weitem kein Profi bei Threadgeschichten, aber zumindest Synchronize sollte eigentlich klar sein, eh man sich an solchen Konstrukten versucht.

Ich kenn nur ein gutes Tutorial dazu, aber das ist leider sehr Windows-lastig, weil für Delphi geschrieben, aber schau es dir halt mal an: http://www.michael-puff.de/dirindex.php ... Tutorials/
Damit hab ich mir das ganze angeeignet.


Und wieso soll der Dialog überhaupt im Thread geschlossen werden? Solange du auf Nutzereingaben wartest, brauchst keinen Thread, der nutzer wird eh langsamer als 20ms sein.
Also mach die Benutzerinteraktion und starte dann den Thread mit den entsprechenden Eigenscahften. Und beschränke die Kommunikation auf ein Minimum, wenn du mich fragst, auf eine reine Fortschrittsausgabe, damit der anwender nicht denkt, da passiert nichts.
Zuletzt geändert von monta am Do 26. Apr 2007, 22:55, insgesamt 1-mal geändert.
Johannes

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:lw ist eine Variable.
muss ich denn alles Synchronized ?
ich Greife auf ein paar Goable Variablen zu


Was heisst hier Variable? lw ist allem Anschein nach ein TListView oder sowas, und das läuft im Mainthread und der Zugriff darauf muss synchronisiert werden.
Aber auch den Zugriff auf einfache globale Variablen müsstest du eigentlich schützen z.B. mit TCriticalSection.

Monta hat recht. Lies mal was darüber.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Das Tutorial hatte ich schonmal gelesen.
Mal sehen. Ob es weiter hilft. Dachte nicht das es so schwer wird, eben so ein Dialog einzubinden.

Wobei ich glaube das hat nichts mit dem Dialog zu tuen Weil so weit kommt selten. Du hast recht LW ist ein Zeiger auf einer ListView. Die gefühlt werden soll.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Es hat nichts mit dem Dialog zu tun. Du hantierst da einfach innerhalb der Thread Methode mit dem TListView, als würde das im selben Thread laufen.
Ich weiss, dass Monta dir empfohlen hat, die Sache in einem extra Thread abzuwickeln. Ich halte es in diesem Fall nicht unbedingt für nötig.
Mach ein paar Application.Processmessages in die read-cycles und dann geht das auch. Dein Progi wird ja während des Einlesens des Archivs kaum noch viel anderes gleichzeitig machen wollen, oder?

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

naja, nicht gerade in dieser Version. aber ich habe ja vor eine neue Version wo das schon von Vorteil währe, wenn die Anwendung mehrer Sachen gleichzeitig machen könnte.

Ich meine die Version mit Mehren Fenstern. Wo dann auch auch mehrer Archive gleichzeitig geöffnet werden könne, oder noch Dateien Kopiert oder Verschoben werden könnten und der gleichen. Und genau für dieser Version erstelle ich diese Test Anwendung.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:Ich meine die Version mit Mehren Fenstern.


Mehrere Fenster haben mit mehreren Threads nicht viel zu tun.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

doch bei mir schon, weil ich pro Fenster z.b. ein Archiv Öffnen kann/möchte oder aber halt Dateien Verschieben, Kopieren und gleichzeitig ein Neues Archiv erstellen.
MFG
Michael Springwald

Antworten