| Autor |
Beitrag |
LonghornUser
      
Beiträge: 796
|
Verfasst: Mo 18.09.06 14:01
Hallo,
ich habe mal eine Frage:
Mein Programm (im Autostart) liest nach dem Programmstart Daten aus einer INI-Datei und es hat sich gezeigt, dass, wenn es besonders viele Daten sind, etwas verloren geht. Dies passiert aber nur, wenn auch besonders viele andere Programme im Autostart sind.
Ist es möglich, mein Programm erst dann zu starten, wenn alle anderen Programme des Autostartes vollständif geladen sind ?
Geht sowas ?
Mfg LHUser
Zuletzt bearbeitet von LonghornUser am Mi 21.02.07 17:31, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 18.09.06 14:11
Es gibt Application.OnIdle, das wird ausgelöst sobald der Rechner nix zu tun hat.
Aber: Selbst wenn 100 andere Programme gleichzeitig geladen werden, darf das Programm nicht falsch funktionieren! Du musst einen Fehler beim Programmieren gemacht haben...
Dass der Fehler genau dann auftritt kann verschiedene Ursachen haben (benutzt du beispielsweise Threads?), ist aber wohl eher Zufall.
Du solltest vielleicht mal deinen Quelltext zeigen, vielleicht lässt sich das Problem ja lösen...
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mo 18.09.06 14:36
Mhm. Also ich registriere nacheinander sehr viele Hooks (also systemweite ShortCuts).
Diese werden aus einer Tabelle (Gridview) geladen, die von einer INI-Datei gefüllt wird. Das Füllen funktioniert immer problemlos.
Nur funktionieren die ShortCuts nicht. Erst nach einem Neustart des Programmes gehen sie wieder. Dies tritt mysteriöserweise aber nur ab und zu auf. Nicht immer. Es hat aber den Anschein als träte es immer dann auf, wenn der Rechner beim Autostart besonders viel zu tun hat.
Hir die Schleife dafür:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| u := 0; for u := 0 to GridView1.RowCount-1 do begin ShortCuts[u] := GlobalAddAtom(PChar('ShortCut'+inttostr(u))); Case Combobox14.Items.IndexOf(GridView1.Cells[0,u]) of 0: Zusatz := 0; 1: Zusatz := MOD_ALT; 2: Zusatz := MOD_SHIFT;
end; Case Combobox2.Items.IndexOf(GridView1.Cells[1,u]) of 1: RegisterHotKey(Handle, ShortCuts[u], Zusatz, Ord('0'));
59: RegisterHotKey(Handle, ShortCuts[u], Zusatz, VK_RETURN); |
Woran könnte es liegen ? Das Problem tritt auch nicht bei mir auf, sondern nur bei ein paar Kumpels.
Ich denke, es geht einfach dann nicht, wenn besonders viele ShortCuts gesetzt wurden. Aber eigentlich sollte doch auch das kein Problem sein, oder ?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 18.09.06 21:37
Moment, was machst du jetzt? Hooks im System registrieren oder Shortcuts (Fenster spezifische Zugrifftasten) bzw. HotKeys (globale Zugriffstasten) definieren? Bei den HotKeys gilt, wer zu erst kommt, mahlt zu erst. Und ein Programm, wa smir dutzende von Hooks ins System einbaut, würde auf meinem Rechner nicht lange überleben, da jeder Hook das System weiter ausbremst und eine zusätzliche Fehlerquelle ist, wenn er nicht sauber programmiert wurde.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mo 18.09.06 22:04
Es werden HotKeys gesetzt. Das Programm setzt sie übrigens, weil es der Nutzen des Programmes ist, Hot Keys zu setzen, um so die Handhabung von Windows zu vereinfachen. Also wieviele HotKeys gesetzt werden, hängt vom User ab.
Aber kannst du auch was zu meinem Problem sagen, Luckie ?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 19.09.06 13:50
Habe ich doch getan. Lies meinen Beitrag aumerksam und du wirst die Stelle finden.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Di 19.09.06 14:14
Meinst du
| Zitat: |
Bei den HotKeys gilt, wer zu erst kommt, mahlt zu erst.
|
Falls ja, glaube ich das eher nicht, denn bei meinen beiden Kumpels geht ja gar kein HotKey, auch die nicht, die sozusagen overruled werden.
Wenn das Programm nach dem Autostart anschließend manuell neugestartet wird, geht alles ohne Probleme, alle HotKeys funktionieren.
Woran liegt das nur ? 
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Di 19.09.06 14:44
LonghornUser hat folgendes geschrieben: | Hallo,
ich habe mal eine Frage:
Mein Programm (im Autostart) liest nach dem Programmstart Daten aus einer INI-Datei und es hat sich gezeigt, dass, wenn es besonders viele Daten sind, etwas verloren geht. Dies passiert aber nur, wenn auch besonders viele andere Programme im Autostart sind.
Ist es möglich, mein Programm erst dann zu starten, wenn alle anderen Programme des Autostartes vollständif geladen sind ?
Geht sowas ?
Mfg Dennis Patzer |
Hallo,
um zur Ursprungsfrage zurückzukommen: starte doch deine Software probehalber mit einem Batchfile und sleep 200 vor dem Programmstart, dann weisst du bald, ob es mit Verzögerung funktioniert. Warten ist eh die einzige Möglichkeit, es gibt keine Windowsmeldung "so, fertig mit dem Starten" (kann es auch nicht geben).
Falls ja, kannst du die Verzögerung ja einprogrammieren.
Gruss Reinhard
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Di 19.09.06 15:46
Naja, aber ist das nicht die Notlösung ?
Warum geht es denn von meinem Quellcode aus nicht ? Es werden alle Hot Keys ordentlich registriert.
Kann es sein, dass Windows die Funktion fürs HotKeys registrieren erst nach ein paar Sekunden in den RAM lädt ?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.09.06 09:48
Ähh, das dürfte wohl nicht das Problem sein. Ich vermute folgendes:
Du verwendest GlobalAddAtom, wobei ich mich frage weshalb???
Jedenfalls gibt das eventuell einen Wert größer als 0xBFFF (49151) zurück, eine Atom-ID ist ja schließlich ein Integer. RegisterHotKey darf aber als Id keinen größeren Wert erhalten!
Normalerweise benutzt man RegisterHotKey in Verbindung mit einer selbstdefinierten Konstante, die ja dann in der Message WM_HOTKEY angegeben wird.
Du könntest beispielsweise einfach einen Wert zwischen 0 und 49151 nehmen und dazu Combobox2.Items.IndexOf(GridView1.Cells[1,u]) addieren. Dann hättest du ne schöne Konstante. Oder du definierst für jeden Wert eine spezielle Konstante.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mi 20.09.06 11:20
Mhm, kann ja alles sein, dass es an sowas liegt aber dann würde es doch beim zweiten Versuch genauso wenig gehen, wie beim ersten, oder ? Warum geht es beim ersten nicht (Autostart) und beim manuellen Start schon ?
|
|
OldGrumpy
      
Beiträge: 82
|
Verfasst: Mi 20.09.06 16:30
Statt lange rumzudiskutieren lässt sich das doch ganz einfach verifizieren. Zwei Zeilen Code mehr in der Registrierungsschleife und schon weisst Du, ob beim Start unzulässige Werte vorkommen. Du kannst ja z.B. auch mit OutputDebugString() jeden von GlobalAddAtom gelieferten Wert mitprotokollieren und so genau sehen, was passiert.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mi 20.09.06 16:57
OK, habe jetzt mal eine Liste der Wete erstellt, die GlobalAddAtom vergibt:
Bei 2 Hot Keys werden vergeben:
49263
49264
Was sagt das nun aus ? Müssen die Wete niedriger sein ?
Falls ja wäre das sehr seltsam, denn die HotKeys funktionieren mit diesen Werten.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Sa 23.09.06 19:04
Hilfe ? 
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Sa 23.09.06 23:39
LonghornUser hat folgendes geschrieben: | | Was sagt das nun aus ? Müssen die Wete niedriger sein ? |
| PSDK hat folgendes geschrieben: | If the decimal value specified is 0x0000 or is greater than or equal to 0xC000, the return value is zero, indicating an error.
[...]
If the function fails, the return value is zero. To get extended error information, call GetLastError. |
So, lesen hilft weiter (PSDK).
Die Werte müssen also kleiner sein, der Rest steht etwas weiter oben von OldGrumpy.
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: So 24.09.06 12:29
Ich habe jetzt einfach vom GlobalAddAtom 40000 abgezogen. Damit sind die Werte im Feld ShortCuts kleiner als 49000 und somit im grünen Bereich.
Kann man das so machen oder denke ich da zu einfach ?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| u := 0; for u := 0 to GridView1.RowCount-1 do begin [b] ShortCuts[u] := GlobalAddAtom(PChar('ShortCut'+inttostr(u)))-40000;[/b] Case Combobox14.Items.IndexOf(GridView1.Cells[0,u]) of 0: Zusatz := 0; 1: Zusatz := MOD_ALT; 2: Zusatz := MOD_SHIFT;
end; Case Combobox2.Items.IndexOf(GridView1.Cells[1,u]) of 1: RegisterHotKey(Handle, ShortCuts[u], Zusatz, Ord('0'));
59: RegisterHotKey(Handle, ShortCuts[u], Zusatz, VK_RETURN); |
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: So 24.09.06 12:37
Hallo,
rufst du eigentlich am Ende vom Programm GlobalDeleteAtom auf. Automatisch werden diese nämlich nicht gelöscht!
Ansonsten geht es nicht so, da die Zahl ja die Identifikationsnummer des registrierten Strings ist und wenn du davon 40000 abziehst, dann landet er bei einem ganz anderen oder gar keinem registrierten String.
Ich denke, dieser Abschnitt sollte dir weiterhelfen:
| PSDK hat folgendes geschrieben: | | If the lpString parameter has the form "#1234", GlobalAddAtom returns an integer atom whose value is the 16-bit representation of the decimal number specified in the string (0x04D2, in this example). If the decimal value specified is 0x0000 or is greater than or equal to 0xC000, the return value is zero, indicating an error. If lpString was created by the MAKEINTATOM macro, the low-order word must be in the range 0x0001 through 0xBFFF. If the low-order word is not in this range, the function fails. |
Und jetzt bitte selber mal die Hilfe benutzen, da steht wirklich alles drin: GLOBALADDATOM und REGISTERHOTKEY.
Gruß Hape!
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: So 24.09.06 13:23
wulfskin hat folgendes geschrieben: | Hallo,
rufst du eigentlich am Ende vom Programm GlobalDeleteAtom auf. Automatisch werden diese nämlich nicht gelöscht!
|
Ja, mache ich.
| Zitat: |
Ansonsten geht es nicht so, da die Zahl ja die Identifikationsnummer des registrierten Strings ist und wenn du davon 40000 abziehst, dann landet er bei einem ganz anderen oder gar keinem registrierten String.
|
Das versteh ich schon.
Die Artikel in MSDN hab ich mal durchgelesen aber etwas neues hat sich mir leider nicht erschlossen.
Ich habe jetzt ein paar Tests gemacht und die zugewiesenen IDs protokolliert. Und sie waren nach jedem Programmstart jeweils exakt gleich und größer als 49151, weil ja der Hot Key derselbe ist (denke ich mal).
Nur warum funktionieren die Hot Keys nach einem manuellen Neustart des Programmes, nachdem sich eigentlich gar nichts geändert hat ??? Es sind die gleichen IDs sowohl nach dem Autostart als auch nach dem manuellen Zeitstart.
Sorry für die Fragerei aber ich kapier nicht so richtig, was mir zB. in der MSDN wohl eigentlich auffallen müsste  Eine konkrete Antwort zu meinem 6 Zeilen weiter oben beschriebenen Problem wäre klasse.
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: So 24.09.06 13:45
LonghornUser hat folgendes geschrieben: | | Nur warum funktionieren die Hot Keys nach einem manuellen Neustart des Programmes, nachdem sich eigentlich gar nichts geändert hat ??? |
Ich weiss es (momentan) nicht. Hab damit noch nie was gemacht.
Mach doch mal folgendes: Leg dir eine Konstante an (z.B. 30100) von welche Wert an du deine Hotkeys registieren möchtest. Dann registierst du die mit GlobalAddAtom in der Form '#zahl'. Dann wertest du den Rückgabewert aus: Wenn die Funktion fehlgeschlagen ist, dann erhöhe die Zahl und versuche es erneut.
So sollte zumindest mal GlobalAddAtom deine Id registrieren.
Dann registrier deinr Hotkey und werte wieder den Rückgabewert aus, dann sollten die erfolgreich registrierten Hotkeys auch funktionieren.
Gruß Hape!
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: So 24.09.06 14:10
So, habe jetzt einmal das ganze umprogramiert und bemerkt, dass die Funktion 0 ausgibt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| HotKeys[u] := GlobalAddAtom(PChar(konstante+u)); if not GlobalAddAtom(PChar(konstante+u)) = 0 then Listbox1.Items.Add(inttostr(HotKeys[u])); Case Combobox14.Items.IndexOf(GridView1.Cells[0,u]) of 0: Zusatz := 0; |
Das heißt, die Listbox bleibt leer. Entferne ich die Zeile 2, dann steht in der Listbox schön 30000 und 30001 bei 2 HotKeys.
Warum failed die Funktion (gibt 0 aus) bei 30000 und 30001 ?
|
|
|