AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi QueueUserWorkItem wie sieht es in Delphi aus?
Thema durchsuchen
Ansicht
Themen-Optionen

QueueUserWorkItem wie sieht es in Delphi aus?

Ein Thema von Luckie · begonnen am 17. Sep 2005 · letzter Beitrag vom 19. Sep 2005
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

Re: QueueUserWorkItem wie sieht es in Delphi aus?

  Alt 18. Sep 2005, 15:18
Die erste Lösung klingt doch schon mal gut. Besten Dank.

Sollte das dann so aussehen?
QueueUserWorkItem(@Thread, ThreadParams, WT_EXECUTELONGFUNCTION or 2 * $10000) Weil das funktioniert irgendwie nicht:
Delphi-Quellcode:
function Thread(p: Pointer): Integer; stdcall;
var
  LBIndex : Cardinal;
  Cnt : Cardinal;
begin
  LBIndex := PThreadParams(p)^.LBIndex;
  for cnt := 0 to 99 do
  begin
    TListbox(Form1.FindComponent('Listbox' + IntToStr(LBIndex))).Items.Add(IntToStr(cnt));
    sleep(50);
  end;
  result := 0;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadParams : PThreadParams;
  i : Integer;
begin
  New(ThreadParams);
  for i := 1 to 6 do
  begin
    sleep(10);
    ThreadParams.LBIndex := i;
    if QueueUserWorkItem(@Thread, ThreadParams, WT_EXECUTELONGFUNCTION or 2 * $10000) = 0 then
      ShowMessage(SysErrorMessage(GetLastError));
  end;
end;
Es werden doch alle sech Listboxen gleichzeitig ausgefüllt. Und ohne das Sleep(10) kommt er sogar durcheinander und füllt die letzte mehrmals aus.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: QueueUserWorkItem wie sieht es in Delphi aus?

  Alt 19. Sep 2005, 09:00
Ich habe mal eine bessere Demoanwendung geschrieben:

Sie besteht aus einem Empfänger und einem Sender. Der Sender schickt eine Anforderung an den Empfänger, der daraufhin eine Listbox füllen soll. Auf dem Empfänger-Formular befinden sich sechs Listboxen, der Sender gibt dem Empfänger jeweils mit, welche Listbox gefüllt werden soll. Der Empfänger erzeugt dann entweder, je nach Auslastung, einen neuen Thread im Thread-Pool oder wartet bis ein Thread fertig ist und die Anforderung übernehmen kann.

Klicke ich zum Beispiel vier mal auf die Schaltfläche des Senders werden erst zwei Listboxen gefüllt und die verbleibenden zwei erst, wenn die Threads der ersten zwei Listboxen fertig sind. Dabei sollte man immer mal die Statusleiste des Empfängers beobachten, die die Anzahl der Threads anzeigt und gucken, wie die Listboxen gefüllt werden. Und wartet man bis die ersten Threads fertig sind und sendet dann eine weitere Anforderung, wird man sehen, dass keine weiteren Threads im Thread-Pool erzeugt werden.

Dann sollte man mal den Flag WT_EXECUTEDEFAULT durch den Flag WT_EXECUTELONGFUNCTION austauschen und wieder das Verhalten des Empfängers beobachten. WT_EXECUTELONGFUNCTION teilt dem System mit, dass der aufgerufene Thread etwas länger braucht bis er zurückkehrt, was das Erstellen von neuen Threads im Thread-Pool durch das System beeinflusst. Es neigt dann nämlich eher dazu einen neuen Thread zu starten.

Die Anzahl der Threads soll man so:
QueueUserWorkItem(@Thread, ThreadParams, WT_EXECUTEDEFAULT or 5 + $10000) beeinflussen können. In diesem Fall sollten jetzt nur maximal fünf Threads gestartet werden. Bei mir hat das aber noch nicht so ganz geklappt, glaube ich.

Demo im Anhang.
Angehängte Dateien
Dateityp: zip queueuserworkitem_493.zip (4,6 KB, 47x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#13

Re: QueueUserWorkItem wie sieht es in Delphi aus?

  Alt 19. Sep 2005, 09:54
Zitat von MSDN:
By default, the thread pool has a maximum of 512 threads per process. To raise the queue limit, use the WT_SET_MAX_THREADPOOL_THREAD macro defined in Winnt.h.
Da steht nicht explizit, dass niedrigere Grenzen eingehalten werden (bei Thread-Pools gelten die Grenzen AFAIK als 'Empfehlung').
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

Re: QueueUserWorkItem wie sieht es in Delphi aus?

  Alt 19. Sep 2005, 09:56
Ah, OK, also kann man es nicht so beeinflussen, wie ich dachte, dass man es könnte. Kann man eigentlich die Threads wieder irgendwie aus dem Thread-Pool löschen? Oder hängen die jetzt bis zum Prozessende da drinn? Verbrauchen die eigentlich Ressourcen im Thread-Pool?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#15

Re: QueueUserWorkItem wie sieht es in Delphi aus?

  Alt 19. Sep 2005, 10:27
Es empfiehlt sich die Jedi-Apilib zu verwenden (JwaWinBase.pas). http://jedi-apilib.sf.net
Dort ist die Funktion mit einem korrekten Typen fuer den Callbackparameter deklariert.

Wer den Zugriff auf das CVS nicht scheut der bekommt jetzt auch noch ein JwaWindows.pas das die einzelnen Teilfiles per Include vereinigt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#16

Re: QueueUserWorkItem wie sieht es in Delphi aus?

  Alt 19. Sep 2005, 10:41
Danke für den Hinweis, das beantwortet aber leider nicht meine abschließende Frage.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz