AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Timeout für sich aufhängenden Thread/Timeout allgemein
Thema durchsuchen
Ansicht
Themen-Optionen

Timeout für sich aufhängenden Thread/Timeout allgemein

Ein Thema von s.h.a.r.k · begonnen am 18. Mär 2009 · letzter Beitrag vom 20. Mär 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 18. Mär 2009, 21:41
guten abend,

ich hab mal wieder ein "problem" mit threads... oder generell gesagt mit timeouts.

wie ich auf das problem gekommen bin: ich nutze anydac 1.x und connecte zu einer datenbank. soweit, so gut... nur wenn der server nicht vorhanden ist (falschen server angegeben), so hängt sich das programm beim connecten auf, da sich anydac aufhängt.

nun gut, eigentlich doch einfach: die connectenmethode in einen thread auslagern, dann einen timeout drum herum programmieren und eine meldung an den user ausgeben, wenn es nicht geklappt hat. aber pustekuchen... denn entweder mache ich was falsch, oder das was ich will klappt so nicht.

ich habe das wie folgt (pseudocode):
Code:
initialisiereDaten;
starteThread;
while (not Timeout) and (not Answer) do
  warte
if Teimout then
  [b]TerminateThread(x)[b]
else
 allesOk
wie man im pseudocode sehen kann ist die verwendete methode, um den thread zu beenden, oder eher abschießen, die TerminateThread-methode. ob das aber die richtige ist, weiß ich nicht wirklich, da die hilfe etwas davor warnt. ich laufe dabei auch in das problem, dass der thread sich nicht wirklich beendet, da das programm sich danach nicht mehr schließen lässt. ich glaube, dass immer noch auf die beendigung gewartet wird.

meine frage ist nun: ist das eine richtige timeout-programmierung oder wie geht man sowas denn nun wirklich an?

bevor ihr nun daher kommt und mein, dass ich anydac ersetzen soll: nein, das geschieht nicht, da ich nicht die zeit dazu habe! das problem lässt sich ja auch darauf reduzieren, dass sich der thread aufhängt (endlosschleife oder sonst was).

ich hoffe, ihr könnte mir helfen!

mfg
armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#2

Re: Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 18. Mär 2009, 22:46
Guten Abend,
das Problem kenne ich nur zu gut.
Ich kenn mich zwar mit "anydac" nicht aus aber,
Ich habe eine Kommunikation, wo sich der Thread auch ab und zu "aufhängt" und ich habe auch keine wirkliche lösung gefunden. Mit "TerminateThread" setzt man ja nur eine interne Variable (Terminate := True).Nur über diese function kann man einen Thread nicht wiklich "Zwangsweise" beenden.Bei mir konnte ich das Problem nur so lösen, das ich den Thread in einen anderen Process ausgelagert habe und diese Prozess bei bedarf per TaskKill abgeschoßen habe. Aber das bringt ja in diesem Fall nichts, da du ja die DB-Verbingung in dem Prozess benötigst.

Was man aber eventuell versuchen könnte:
in einem extra Prozess versuchen ob man eine DB-Verbindung aufbauen kann
--> wenn dies gelingt dann im HauptProgramm die eigentliche Verbindung aufbauen
--> wenn es nicht gelingt dem Anwender eine Info geben.
Aber ich finde, das ist keine wirklich schöne Lösung aber sie funzt (ich sprech hier aus Erfahrung).

Dies ist vieleicht keine richtige hilfe aber eventuell ein Lösungsansatz.
mfg
Jens
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 18. Mär 2009, 22:51
Du kannst doch auch ein Event starten, was beim erfolgreichen Verbinden zur Datenbank gesendet wird. Auf dieses Event warest du mit WaitForSingleObject(EventHandle, TIMOUT); Mit TIMOUT gibts du die Millisekunden an, die gewartet wird.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 18. Mär 2009, 22:55
Zitat von Pro_RJ:
Bei mir konnte ich das Problem nur so lösen, das ich den Thread in einen anderen Process ausgelagert habe und diese Prozess bei bedarf per TaskKill abgeschoßen habe.
Warum denn das? Man kann einen Thread auch mit der API-Funktion MSDN-Library durchsuchenTerminateThread hart beenden, was aber möglichst vermieden werden sollte.

Ich würde übrigens mit MSDN-Library durchsuchenWaitForSingleObject auf den Thread warten bzw. mit MSDN-Library durchsuchenMsgWaitForMultipleObjects um noch auf Ereignisse reagieren zu können.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#5

Re: Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 19. Mär 2009, 07:48
Zitat von Luckie:
Zitat von Pro_RJ:
Bei mir konnte ich das Problem nur so lösen, das ich den Thread in einen anderen Process ausgelagert habe und diese Prozess bei bedarf per TaskKill abgeschoßen habe.
Warum denn das? Man kann einen Thread auch mit der API-Funktion MSDN-Library durchsuchenTerminateThread hart beenden, was aber möglichst vermieden werden sollte.


Nun mit "TerminateThread"konnte ich in meinem Fall den Thread nicht beenden, deshalb habe ich den Thread ausgelagert.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

Re: Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 19. Mär 2009, 08:50
das problem ist doch, wie pro_rj schon richtig erkannt hat, dass sich der thread, auf den gewartet wird (egal in welcher art und weise), sich aufhängt, egal aus welchen gründen.

wie kann ich so einen thread auf normale art und weise beenden?

das habe ich schon getestet und das geht nicht:
- Thread.Free;
- FreeAndNil(Thread);
- Thread.Terminate();
- Thread.DoTerminate;
- TerminateThread(ThreadHandle, 0);

diese WaitFor...-methode bringt hier ja auch nichts, da der thread dadurch ja auch nicht zwangsweise beendet und dessen speicher wieder freigegeben wird.

wie könnte ich sonst noch an das problem heran gehen, außer den umweg über einen externen prozess?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 19. Mär 2009, 09:02
Was für eine Fehlermeldung bekommst du bei TerminateThread?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#8

Re: Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 19. Mär 2009, 09:21
Das Problem ist, selbst wenn WaitFor irgendwann wieder zurück kommt hängt der Thread immernoch und man steht wieder vor dem gleichen Problem.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#9

Re: Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 19. Mär 2009, 10:07
wie pro_rj gesagt hat: keine fehlermeldung, lediglich ein stehen bleiben des programms. das einzige was dabei plausibel schien war den thread abschießen, also inkl code aus dem speicher entfernen, nur MSDN-Library durchsuchenTerminateThread() macht das leider nicht...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#10

Re: Timeout für sich aufhängenden Thread/Timeout allgemein

  Alt 19. Mär 2009, 10:41
TerminateThread() schickt ja auch nur an den Trhead ein signal alla "Schau mal das du in nächster Zeit Fertig wirst" das funst aber nur, wenn der QuellText des Threads Beendet ist. Da er aber nie Beendet wird läuft er immer weiter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 01:32 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