Hallo,
mir ist was merkwürdiges aufgefallen. Hat man einen Timer, beispielsweise auf 50ms, prüft darin mittels
GetKeyState ob die linke Maustaste gedrückt ist und ruft dann mit
ShellExecute eine URL auf, dann geht die nicht nur einmal, sondern 20x auf. Das folgende
Sleep oder ähnliche Delays werden vollkommen ignoriert. Ich halte bewusst die Maustaste eine kurze Zeit lang gedrückt. Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if GetKeyState(VK_LBUTTON) AND 128 = 128 then begin MainForm.Memo1.Lines.Add('Test 1'); ShellExecute(MainForm.Handle, 'open', 'http://www.heiliger-damm.de', nil, nil, SW_SHOW); Sleep(1000); MainForm.Memo1.Lines.Add('Test 2'); end; |
Logischerweiße müsste er
ShellExecute ausführen, dann
Sleep(1000); und erst danach die Prozedur erneut aufrufen. Das würde ja im Memo wie folgt aussehen (und das tut es auch, wenn ich
ShellExecute weglasse (
!)):
Zitat: |
Test 1
Test 2
Test 1
Test 2
Test 1
Test 2 |
Was passiert aber in Wirklichkeit?
Zitat: |
Test 1
Test 1
Test 1
Test 2
Test 2
Test 2 |
Die Prozedur wird drei Mal aufgerufen ohne den Rest zu beachten.
Sleep zieht erst danach. Wie oben erwähnt, habe ich dieses Verhalten nicht, wenn
ShellExecute weggelassen wird.
Kann sich einer erklären, in wie fern
ShellExecute den Programmablauf beeinflusst? Wieso wird es plötzlich möglich, dass die Prozedur mehrmals gleichzeitig aufgerufen wird? Eine Notlösung ist die, dass ich am Anfang eine Boolean-Variable auf False setze und die Prozedur sofort verlasse, falls diese False ist. Dann wird das ganze auch nur einmal aufgerufen.
Bei Bedarf kann ich auch mal ein Testprojekt anhängen.
Grüße
GTA-Place
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)