| Autor |
Beitrag |
uko
      
Beiträge: 220
Erhaltene Danke: 1
Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
|
Verfasst: 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
|
Verfasst: Fr 23.01.09 16:37
uko hat folgendes geschrieben : | | 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
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Fr 23.01.09 16:37
In deiner Hauptschleife
Delphi-Quelltext 1:
| Application.ProcessMessages; |
aufzurufen, bringt nichts? (oder gibt das auch die Buttons frei?)
|
|
uko 
      
Beiträge: 220
Erhaltene Danke: 1
Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
|
Verfasst: 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.
@Maweki: das würde Callbacks in der Speicherroutine bedeuten die ich nicht einbauen kann.
Grüße,
Uli
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 23.01.09 18:43
_________________ 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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 23.01.09 18:45
|
|
uko 
      
Beiträge: 220
Erhaltene Danke: 1
Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
|
Verfasst: 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
|
Verfasst: Fr 23.01.09 23:35
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 220
Erhaltene Danke: 1
Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
|
Verfasst: Sa 24.01.09 08:19
Ja, ich werd mir das mit dem modalen Fenster und Helperthread genauer anschauen. Jetzt aber erst mal Wochenende!
@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.
Grüße,
Uli
|
|
|