AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Programm friert trotz Thread ein (waitforsingleobject)
Thema durchsuchen
Ansicht
Themen-Optionen

Programm friert trotz Thread ein (waitforsingleobject)

Ein Thema von TheMiller · begonnen am 16. Mär 2007 · letzter Beitrag vom 17. Mär 2007
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Programm friert trotz Thread ein (waitforsingleobject)

  Alt 16. Mär 2007, 19:49
Hallo,

ich habe einen Thread, damit mein Hauptprogramm (Hauptthread) nicht einfriert. Jetzt muss ich allerdings auf die Beendigung der Prozedur aus dem Thread warten und nutze dazu "wairforsingleobject". Doch dabei friert mir ja wieder das Programm ein. Wie kann ich das unterbinden?

Danke im Voraus
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Programm friert trotz Thread ein (waitforsingleobject)

  Alt 16. Mär 2007, 23:10
Moin DJ-SPM,

lass Dir doch von Deinem Thread eine Message (siehe, z.B., Hier im Forum suchenRegisterWindowMessage) schicken, wenn er fertig ist.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

Re: Programm friert trotz Thread ein (waitforsingleobject)

  Alt 17. Mär 2007, 00:05
Auf die Idee bin ich nicht gekommen. Aber ich habe eine Boolean-Variable gesetzt und im Hauptprogramm ein

Delphi-Quellcode:
while not (fertig) do
  Application.ProcessMessages
gesetzt. Ist das auch ok?
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Programm friert trotz Thread ein (waitforsingleobject)

  Alt 17. Mär 2007, 00:07
nicht, wenns nicht threadsicher ist (z.B. per Hier im Forum suchenCritical Sections)
Lukas Erlacher
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#5

Re: Programm friert trotz Thread ein (waitforsingleobject)

  Alt 17. Mär 2007, 11:23
Zitat:
gesetzt. Ist das auch ok?
Ansich ja, nur das du damit den Vorteil des Threads global gesehen wieder zerstörst Du hast ja den Thread gebaut damit effektiv gesehen keine unnötigen Prozessorresourcen, sprich CPU-Zeit, verschwendet wird, weil man auf igrendein Ereignis warten muß.

Dein Loop macht aber nun exakt dies. Sie pollt permanant und wartet das der Thread fertig wird. Sie vernichtet damit CPU-Zeit wweil sie die meiste Zeit nur while not fertig do; ausführt.

Ausgehend von diesem Source http://www.delphipraxis.net/internal...elay+revisited kann man das verbesseren.

Delphi-Quellcode:
function WaitFor(Event: THandle): Boolean;
begin
  Result := False;
  while not Result do
    case MsgWaitForMultipleObjects(1, Event, False, INFINITE, QS_ALLINPUT) of
      WAIT_OBJECT_0:
        Result := True;
      WAIT_OBJECT_0 +1:
        begin
          Application.ProcessMessages;
          if Application.Terminated then Exit;
        end;
    else
      RaiseLastWin32Error;
    end;
end;
Diese Funktion wartet auf ein Event, zb. Thread.Handle wird terminiert, und würde mit TRUE turückkehren. Solange dieses Event nicht eintritt wartet sie auf Nachrichten im Messagesqueue der Anwendung. Sind welche da so werden diese mit Application.ProcessMessages abgearbeitet. Sollte dabei die Anwendung beendet worden sein kehrt die Funktion mit FALSE zurück. Die restliche Zeit wo NICHTS passiert legt MsgWaitForMultipleObjects() den Mainthread der Anwendung Schlafen -> sowas wie Sleep(). Das führt dazu das diese CPU-Zeit dem Gesamtsystem zur Verfügung gestellt wird OHNE das deine eigene Rechnerzeit sinken würde.
Wenn zb. deine Mainthread und dein Arbeitsthreahd sich zu 50% die komplette CPU-Zeit teilen müssten soe würde nach deiner Methode die 50% des Mainthreades in einer sinnlosen Schleife verbraten. Der Arbeitsthread kann nur 50% der Rechnerzeit arbeiten. Mit obiger Variante würde der Mainthread aber wirklich nur arbeiten wenn 1. der Arbeitsthread fertig ist oder Messages vorliegen, also sagen wir mal 1% der 50% der Zeit. Die restliche Zeit kommt nun deinem Arbeitsthreah zugute. Dieser würde nun 99% der CPU Zeit bekommen und ergo doppelt so schnell fetig sein.

Obwohl man den Unterschied nicht wahrnimmt stellt WaitFor() die Bearbeitung im Program von einem Polling in ein Ereignisorientiertes System um. Dh. nur wenn ein Ereignis das wir wünschen eintritt werden wir aktiv. Beim Polling sind wir immer aktiv und fragen tausendemal einen Zustand ab der nur bveim 1001 mal tatsächlich eintrifft.

Gruß Hagen

PS: übrigens -> Thread.WaitFor; dürfte exakt das selbe machen
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Programm friert trotz Thread ein (waitforsingleobject)

  Alt 17. Mär 2007, 13:09
Moin Hagen,

Zitat von negaH:
PS: übrigens -> Thread.WaitFor; dürfte exakt das selbe machen
tut es aber nicht.
Wenn Du TThread.WaitFor aufrufst, reagiert das Programm nicht mehr, bis WaitFor zurückkehrt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#7

Re: Programm friert trotz Thread ein (waitforsingleobject)

  Alt 17. Mär 2007, 14:43
@Christian Seehase: Das ist ja genau mein Problem gewesen. Diesen Thread habe ich ja nur erstellt, damit der MainThread nicht hängt. Der Thread braucht keine großartige Rechenleistung und dauer auch i.d.R nur 2-3 Sekunden. Deswegen habe ich mich für die fetig-Boolean-Variable entschieden...
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:33 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