So rufen Sie eine Funktion / Prozedur in Delphi (ohne Komponenten) asynchron auf

7

Ich versuche, eine Funktion oder eine Prozedur in Delphi asynchron auszuführen, aber ohne eine Komponente zu verwenden, gibt es eine Möglichkeit, dies mit Delphi-Kernfunktionen zu tun?

    
Sebastian 02.12.2009, 04:06
quelle

2 Antworten

4

Sie können auch Ihre Prozedur in einem Thread ausführen. Verwenden Sie dann das OnTerminate-Ereignis, um das Ergebnis zu erhalten. Ja, in diesen Tagen von .NET und C # sind wir irgendwie mit der einfachen und bequemen Form der asynchronen Ausführung von Methoden verwöhnt, aber so funktioniert es in Delphi.

    
Lobuno 02.12.2009, 08:12
quelle
16

Wenn Sie fragen, ob die VCL etwas wie BeginInvoke in .NET Out-of-the-Box, dann ist die Antwort nein. Sie können jedoch etwas Ähnliches in Form einer kleinen Einheit erhalten, die Sie mit Ihrem Programm verknüpfen, dem AsyncCalls Bibliothek von Andreas Hausladen. Es ist keine Komponente, also denke ich, es qualifiziert sich. Es unterstützt auch Delphi ab Version 5. Sehr empfehlenswert.

Bearbeiten:

Ich füge ein Beispiel hinzu, da Sie es nicht ausgeführt haben. Wenn Sie in Ihrem aufrufenden Code blockiert werden, besteht Ihr Problem darin, dass kein Verweis auf den von der Funktion zurückgegebenen IAsyncCall -Schnittstellenzeiger beibehalten wird. Das Objekt, das die Schnittstelle implementiert, wird daher sofort zerstört, wenn die temporäre Referenz den Gültigkeitsbereich verlässt. Der Destruktor wird im Kontext des VCL-Threads aufgerufen und ruft WaitForSingleObject() oder eine ähnliche Funktion auf, um auf den Abschluss des Worker-Threads zu warten. Das Ergebnis ist, dass Ihr VCL-Thread blockiert.

Sie erhalten das richtige Verhalten, wenn Sie einen Verweis auf den Schnittstellenzeiger pflegen:

%Vor%

Stellen Sie den Timer so ein, dass er deaktiviert wird, und lassen Sie ihn sehr kurz Interval , sagen wir 50 ms. Der Klick auf die Schaltfläche startet den asynchronen Vorgang:

%Vor%

Während der Vorgang aktiv ist, kann kein anderer gestartet werden. Nach Abschluss ermöglicht es dem Zeitgeber, das Formular zu benachrichtigen und die Schnittstellenreferenz zurückzusetzen:

%Vor%

Beachten Sie, dass es sogar möglich ist, direkt von der aufgerufenen Methode aus auf das Formular zuzugreifen, indem Sie EnterMainThread() und LeaveMainThread() verwenden.

Der obige Code ist nicht das absolute Minimum, sondern nur einige Ideen.

    
mghie 02.12.2009 04:50
quelle

Tags und Links