Announcement

Collapse
No announcement yet.

Tosibeventalerter & Windows 2000

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tosibeventalerter & Windows 2000

    Ich benutze den Eventalerter von Herrn Kosch. Funktioniert soweit ohne Konflikte. Nur die Prozessoraktivität unter Windows 2000 liegt bei der Anwendung welche die Komponente enthält bei 100 %. Hat das seine Richtigkeit oder muß man Sleep(0) ersetzen?

    Gerhard Kimmeringer

  • #2
    Hallo,

    diese Auslastung sollte nichts mit TOSIBEventAlerter zu tun haben. Der Aufruf von <b>Sleep(0)</b> bewirkt nur, dass der Thread beim Zuteilen von CPU-Zeit durch den Scheduler seinen Zeitschlitz sofort wieder abgibt. Nur dann, wenn keine Threads mit gleicher Priorität warten, kehrt Sleep sofort wieder zurück. Eine Schleife arbeitet somit in der Regel sehr effizient.

    Taucht in dieser Anwendung noch an anderer Stelle so etwas wie <b>Application.ProcessMessages</b> auf und wenn ja, wird das in einer Schleife aufgerufen?

    Wenn Application.ProcessMessages nicht verwendet wird, hört sich das nach einem Problem in GDS32.DLL an. Hier tauchte immer wieder das Problem auf, dass dieser Teil nach dem ersten Event-Aufruf bzw. beim Verbindungsabbau hängengeblieben ist

    Comment


    • #3
      Das Problem, sofern es eines ist?, tritt auch bei einer
      Minimalanwendung auf. Wie kann ich das Problem in der GDS32.DLL
      beseitigen?

      Gerhard Kimmeringe

      Comment


      • #4
        Hallo,

        ich habe mir das etwas genauer angeschaut - auch mit meinem Beispielprojekt aus dem Buch (<i>Kapitel 16\IBEvents</i>) kann dieses Verhalten jederzeit reproduziert werden. Obwohl in der Hilfe zum <i>Platform SDK</i> etwas anderes zu lesen ist, scheint nun der Aufruf von Sleep(0) <b>nicht</b> mehr die sparsamste Art zu sein, freiwillig Rechenzeit abzugeben. Mit der Änderung auf <b>Sleep(1)</b> verbrät das Programm keine Rechenzeit mehr - die CPU-Auslastungskurve geht immer dann auf die Null-Linie zurück, wenn nicht mit dem Programm gearbeitet wird.
        <pre>
        procedure TOSEventThread.Execute;
        begin
        Synchronize(RegisterEvents);
        try
        repeat
        Synchronize(QueueEvents);
        while (not EventsReceived) and (not Terminated)
        do <b>Sleep(1)</b>;
        if EventsReceived then
        Synchronize(ProcessEvents)
        else
        Synchronize(CancelEvents);
        until Terminated;
        finally
        Synchronize(UnRegisterEvents);
        end;
        end;
        </pre&gt

        Comment

        Working...
        X