In einem Trehad ein Dialog auf rufen und wieder schließen ?
-
- Lazarusforum e. V.
- Beiträge: 7192
- 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 ?
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.
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
Michael Springwald
Was machst denn du schon wieder?
Ich kann kein Problem erkennen.
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;
-
- 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
In einem Thread darfst Du keine LCL-Aufrufe machen - zumindest keine, die irgendetwas auf dem Bildschirm veranstalten.pluto hat geschrieben:seit Tagen versuche ich ein Dialog(From3) in einem Thread auf zu rufen, was aber einfach nicht klappen möchte.
Wenn Du im Thread auf das Ergebnis des Dialogs warten willst, musst Du Syncronize verwenden.
-Michael
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
habe ich gerade eben versucht. auf gerufen wird es aber geschlossen wird es nicht wieder.
also mein Qulleocde sieht dazu so aus:
Edit:
die nachricht bei Progress wird noch nicht mal ausgeben.
Edit1:
in der Terminel steht folgendes:
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;
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
Michael Springwald
-
- 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:
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/" onclick="window.open(this.href);return false;
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.
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/" onclick="window.open(this.href);return false;
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
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.pluto hat geschrieben:lw ist eine Variable.
muss ich denn alles Synchronized ?
ich Greife auf ein paar Goable Variablen zu
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.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
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.
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
Michael Springwald
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?
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?
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
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.
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
Michael Springwald