Threadübergreifend

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Threadübergreifend

Beitrag von Manfred »

mir fällt kein besserer Titel ein.
Folgendes Szenario:
Ich habe ein Menue, in dem ein Browse mit Dataobjects angezeigt wird. In dem Browse kann ich einen Satz auswählen, der dann in einem neuen Thread berbeitet werden kann. Wenn der Thread beendet wird, dann soll in dem ersten Menue ein Update auf das Dataobject nebst dem Browse erfolgen. Clever wie ich war, habe ich den Thread über einen Button aufgerufen, die Änderung gemacht und dann ein Update auf das Dataobject machen wollen, was aber kläglich scheiterte, weil die DBF aus dem 1. Menu im neuen Thread nicht zur Verfügung stehen. Ok, dachte ich mir sei schlau, ruf über den Action Slot des Buttons den Thread auf und wenn der vorbei ist, dann die Updateroutine des 1.Menue. Tja, da mußte ich dann feststellen, das es ja auch nicht geht, weil der neue thread ja parallel aufgerufen wird und sofort die Updateroutine durchläuft. Ist ja nicht wie ein Aufruf von verschiedenen Funktionen nacheinander.
Gibt es für mein Problem eine unkomplizierte Lösung?
Eine Idee wurde mir vorgeschlagen, dem 1. Menu ein Event aus dem Thread zuzuschustern, auf das dann das 1.Menue reagieren kann und selbstständig bei jeder Änderung ein Refresh durchführt bei jeder gemachten Änderung im Thread. Das finde ich auch nicht schlecht, aber wie programmiere sowas unter express++? Kann man im DCREAG Gui sowas angeben? Muß ich dafür einen Handlerblock anlegen? Wie verhält sich dann der urspüngliche Eventhandler? Muß ich was beachten?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Threadübergreifend

Beitrag von Tom »

Du hängst ein oThread:Synchronize(0) direkt nach dem oThread:Start() in den Action-Codeblock, dann wartet der Codeblock an dieser Stelle, bis der Thread beendet ist. Allerdings ist das aufrufende Fenster dann auch stillgelegt. Warum man in einem solchen Szenario mit Threads arbeitet, statt für die Bearbeitung des Datensatzes einfach ein modales Fenster aufzumachen, ist mir allerdings nicht ganz klar.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Threadübergreifend

Beitrag von Manfred »

HI Tom,
der Ursprung war eigentlich ganz anders geplant.
Es wird ein Fenster aufgemacht, in dem beantragte Urlaube angezeigt werden. Wenn man jetzt möchte, dann kann man den Satz anklicken um dann eine Ergebnisliste zu sehen, in der alle vergebenen/geplanten/abgelehnten Urlaube für den Bereich stehen, in dem der ausgewählte Mitarbeiter seinen Urlaub beabtragt hat. Das Ergebnis was hier angezeigt wird, wird jedesmal neu ermittelt (wenn der Thread aufgerufen wird), weil es variieren kann. Deshalb kann ich auch mMn nicht direkt zu Anfang einen Dummy erstellen, der einfach nur versteckt und später stattdessen angezeigt wird. Ich müßte sonst 365 + x Tage leer erstellen.
So, jetzt haben wir den 2. Bildschirm mit der Anzeige. Dort kann nach Bedarf eine Zeile angeklickt werden und dann im gesamten Rutsch der jeweilige Urlaub angenommen, oder abgelehnt oder teilweise bearbeitet werden. Egal, ob angenommen, oder abgelehnt, der Ursprungseintrag verschwindet auf jeden Fall aus der 1. Ansicht, nach Schließung des Threads, oder direkt über Event im Hintergrund.
Das mit dem Thread war so geplant, weil es aus einem anderen Teil so übernommen wurde. Soll aber jetzt anders laufen. Deshalb ja meine Frage, wie ich das dann umsetzen kann, von Thread auf Nichtthread.
DCREAD GUI macht ja jedesmal ein neues Fenster auf, welches man dann verschieben kann. Wenn ich einen Dummyrahmen anlegen könnte, in dem nur ein DCBROWSE mit den Standardgrundspalten steht um es später zu erweitern, oder zu verkleinern, wäre das auch schon schön. Aber da fällt mir auf die Schnelle nichts zu ein. Der Bereich der angezeigt wird, kann mal 1 Woche und muß auch manchmal > 4 Wochen sein. Das ergibt sich aber immer aus den Intervallen, die ein Mitarbeiter als Urlaub beantragt. Ich hatte anfänglich das komplette Jahr angezeigt, das hat den Anwender aber total kirre gemacht.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Threadübergreifend

Beitrag von Manfred »

Tom,
Du hast nicht ganz unrecht. Ich habe das wohl anfänglich falsch ausgedacht. Das mit dem thread werde ich vergessen, anders scheint es auch zu klappen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Threadübergreifend

Beitrag von Herbert »

Gut, hast du das erkannt.
Warum macht man Threads? Da sollen Aufgaben erledigt werden, die das eigentliche Arbeiten nicht behindern sollen, einige interne Ressourcen brauchen und irgendwann ein Ergebnis liefern.
Wenn man eine Sache anklickt und daraus direkt eine Antwort erwartet, kann nur ein Query oder eine sonstige Routine Sinn machen. In diesem Fall verursacht der Thread dem Programm viel mehr Eigenverwaltung und wirkt daher verlangsamend.
Grüsse Herbert
Immer in Bewegung...
Antworten