Autor Beitrag
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Fr 23.01.09 16:31 
Hallo,

ein Programm von mir benötigt beim Speichern der Daten einiges an Zeit, wo das GUI keine Meldung bekommmt. Unter Vista bedeutet das nun, daß immer die Meldung 'Keine Rückmeldung' im Programmfenster erscheint. :)
So, die Lösung, das Speichern in einen Thread auszulagern, geht nicht, da ich das HauptGUI wirklich sperren muß für jede Art von Eingaben (insbesondere Mausevents). Auch die Variante mit CallBacks scheidet aus, da ich auf die Speicherroutine keinen wirklichen Zugriff habe und dort nichts selbst einbauen kann (und keine Callbacks vorhanden sind).
Frage: gibt es irgendeine Möglichkeit, einen zweiten Thread zu starten, der dann VISTA mitteilt, das das Programm noch aktiv ist?
Bis jetzt hab ich versucht, aus dem zweiten Thread jede Sekunde ein nicht verbrauchendes PeekMessage aufzurufen, aber das hat nicht geholfen (gab's da nicht was mit getrennten Message-Queues?).


Grüße,
Uli
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.01.09 16:37 
user profile iconuko hat folgendes geschrieben Zum zitierten Posting springen:
da ich das HauptGUI wirklich sperren muß für jede Art von Eingaben

Dann deaktivier doch einfach die Kontollelemente, die nicht benutzt werden dürfen während der Thread arbeitet.
Maweki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: Fr 23.01.09 16:37 
In deiner Hauptschleife
ausblenden Delphi-Quelltext
1:
Application.ProcessMessages;					

aufzurufen, bringt nichts? (oder gibt das auch die Buttons frei?)
uko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Fr 23.01.09 16:48 
@Luckie: das geht leider nicht: ich arbeite mit InkOverlays aus Microsofts Ink Komponenten und die reagieren teilweise sehr allergisch mit Hängern, wenn sie nicht aus dem Hauptthread aufgerufen werden bzw. wenn man sie mal eben deaktiviert. :evil:

@Maweki: das würde Callbacks in der Speicherroutine bedeuten die ich nicht einbauen kann.

Grüße,
Uli
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 23.01.09 18:43 
user profile iconuko hat folgendes geschrieben Zum zitierten Posting springen:
@Luckie: das geht leider nicht: ich arbeite mit InkOverlays aus Microsofts Ink Komponenten und die reagieren teilweise sehr allergisch mit Hängern, wenn sie nicht aus dem Hauptthread aufgerufen werden bzw. wenn man sie mal eben deaktiviert. :evil:

Bugreport an Microsoft und andre Komponenten suchen. Komponenten, die nicht stabil laufen, haben nichts in einem Programm zu suchen! Punkt.

user profile iconuko hat folgendes geschrieben Zum zitierten Posting springen:
@Maweki: das würde Callbacks in der Speicherroutine bedeuten die ich nicht einbauen kann.

Grüße,
Uli

Du kannst deine gesamte Form deaktivieren (gegen Eingaben) oder mit ShowModal ein Fortschrittsfenster öffnen, was so eine nichtssagende Vista-Fortschritsbalken-Animation abspielt. Das ShowModal verhindert, dass irgendein anderes Formular außer dem aktiven, den Fokus erhalten kann, oder Eingaben erhält. Die Animation läuft dabei im Hauptthread über nen Timer, dein Hauptprogramm bleibt dabei aktiv. Das eigentliche Speichern wird im Hintergrund ausgeführt (von deinem zusätzlichen Thread). Das modale Fenster kannst Du dann über eine Synchronize-Meldung vom Thread am Ende schließen lassen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 23.01.09 18:45 
user profile iconuko hat folgendes geschrieben Zum zitierten Posting springen:
ich arbeite mit InkOverlays aus Microsofts Ink Komponenten und die reagieren teilweise sehr allergisch mit Hängern, wenn sie nicht aus dem Hauptthread aufgerufen werden bzw. wenn man sie mal eben deaktiviert. :evil:
Hast du da vielleicht eine kleine Demo? Vielleicht lässt sich ja herausfinden warum das bei dir so ist.
uko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Fr 23.01.09 22:19 
Generelles Problem hier: die Fehler bekomme ich von Kunden rein, aber keiner kann davon auf unseren Testsystemen nachvollzugen werden, selbst bei identischer Hardware. Und die Aktionen sind einfach: normales Scrollen oder auch nur das Umschalten in den Vollbildmodus (hier kann man nichts anders bedienen als die Kunden). Die MadExcept-Reports sagen entweder OLEFehler (mit Fehlernummer zu der man nichts findet) oder das Programm stürzt z.T. so komplett ab, daß nicht mal mehr Fehlerreports produziert werden.
Deswegen will ich auch unbedingt im Hauptthread speichern. Nur so kann ich sicher sein, daß mir nichts ins InkOverlay reinfunkt. Auch kein Repaint oder ähnliches.

@BenBE: sagst Du so einfach, die Komponenten zu ersetzen. Es gibt meines Wissens zu den Inks keine Alternative. Und die erste Version des Programms ist eigentlich sehr stabil gelaufen. Das Problem ist mit der neuen Version: hier arbeiten wir sehr viel mehr mit den InkOverlays. Und da gibt es nun anscheinend Probleme.

@jaenicke: Eine wirkliche Demo hab ich nicht. Ich hab mir zwar ein Testprogramm gebastelt, mit dem so ähnliche Fehler wie in der richtigen Anwendung auftreten (d.h. man hat eine reelle Chance, daß sie bei mehreren Versuche wenigstens einmal auftreten), aber selbst hier ist es fast nicht reproduzierbar. Und den eigentlichen Fehler ist bisher nur einmal damit reproduziert worden.

Das Problem ist halt: keiner dieser Fehler ist permanent reproduzierbar. Mal geht's , mal geht's nicht. Das Problem ist vermutlich: InkObverlays senden ihre Events aus einem eigenen Thread heraus. Die Message Handler werden dann aber wiederum im Context des Hauptthreads ausgeführt. Somit hab ich zwei Message Queues die in der Anwendung unter einen Hut zu bringen sind: Problem hier: während z.B. die VCL schon weiter Scroll-Messages abarbeitet, ist vom InkOverlay aber vieleicht noch nicht mal die erste losgeschickt worden. Und wenn diese dann kommt, trifft sie auf einem Zustand der nicht mehr dem ursprünglichen entspricht und das Overlay ist schon in einem Zustand der dem Event widerspricht.

Aber jetzt wird's wohl reichlich OT :) Bei Interesse mach ich eine neue Frage auf.

Grüße,
Uli
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.01.09 23:35 
user profile iconuko hat folgendes geschrieben Zum zitierten Posting springen:
@Luckie: das geht leider nicht: ich arbeite mit InkOverlays aus Microsofts Ink Komponenten und die reagieren teilweise sehr allergisch mit Hängern, wenn sie nicht aus dem Hauptthread aufgerufen werden bzw. wenn man sie mal eben deaktiviert. :evil:

Dann deaktivier die Steuerelemnete aus dem Hauptthread bevor du den Thread startest, dann startest du den Thread und wenn der fertig ist aktivierst du sie wieder aus dem Hauptthread. Das ist sowieso für mich die übliche Vorgehensweise. Alles, was mit der GUI zu tun hat wird aus dem Thread der GUi gemacht und der Rest aus einem abgespalteten Thread.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 24.01.09 01:30 
Bliebe ein Versuch des ShowModal-Weges, ob der sauber funzt.

@Ersetzen: Manchmal bringt es halt nichts, an Dingen festzuhalten, wenn diese nicht funktionieren ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
uko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Sa 24.01.09 08:19 
Ja, ich werd mir das mit dem modalen Fenster und Helperthread genauer anschauen. Jetzt aber erst mal Wochenende! :party:
@BenBE: Glaub nicht, daß Cheffe da sehr begeistert wäre; mit dem Programm wir dienen wir einen Großteil unseres Gelds. Und es läuft ja bei einem Großteil der Kunden stabil. :D

Grüße,
Uli