Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Thread. Thread zugriff verweigert 5. Was passiert da?? (https://www.delphipraxis.net/121366-thread-thread-zugriff-verweigert-5-passiert-da.html)

Thomas83 26. Sep 2008 08:49


Thread. Thread zugriff verweigert 5. Was passiert da??
 
hi zusammen,

hoffe das ich hier richtig bin. Meine Client / Server Anwendung ist in eine Threadklasse.
Jetzt habe ich zum Test einen Text vom Client zum Server, alle 10ms, gesendet und einen Text vom Server an alle Clients, alle 100ms,gesendet um zu testen wie stabil die Anwendung ist.

Habe den Test über Nacht laufen lassen. Start 16 Uhr. Letzter Text am Server gegen 18 Uhr am gleichen Tag.

Heute morgen war dann die Meldung
"Thread zugriff verweigert (5)"

Wie kann ich einen solchen Fehler finden? Weis ja nicht wo dran es liegt. Ist eine Exception in der Execute vom Thread aufgetreten und deswegen hat der Thread sich aufgehangen? ....

thx

sirius 26. Sep 2008 09:20

Re: Thread. Thread zugriff verweigert 5. Was passiert da??
 
Wenn in einem Thread eine Exception auftritt, bekommst du dies ohne Exceptionbehandlung nicht mit. Der thread stürzt einfach ab. Ende.
Du kannst im Ereignis onTerminate die Eigenschaft FataException abfragen. Dann weißt du, was pssiert ist.


(War es das was du fragtest?)

Thomas83 26. Sep 2008 10:05

Re: Thread. Thread zugriff verweigert 5. Was passiert da??
 
super danke, werde ich mal testen.

thx

Xeres 26. Sep 2008 10:11

Re: Thread. Thread zugriff verweigert 5. Was passiert da??
 
Sobald mehrere Client's Daten an den Server senden und er diese in einer Liste verwaltet, musst du sicherstellen, dass nicht 2 Threads gleichzeitig in eine Liste / ein Memo schreiben können. Andersfalls kann es jeder Zeit zu Fehlern kommen.
Dies ist z.B. mit CriticalSections möglich.

Schau dir mal die Klasse TThreadList aus der Classes-Unit an. Diese Kapselt die Klasse TList. Hier wird durch "LockList" und "UnlockList" die CriticalSection erzeugt/geschlossen.
Leider sind die wenigsten Delphi-Klassen Threadsicher.

Selbst IntToStr oder DateTimeToStr schreibt Intern die Werte in eine globale Variable. Dies kann auch zu Fehlern führen, wenn 2 Threads gleichzeitig diese Funktionen nutzen.

Thomas83 26. Sep 2008 14:01

Re: Thread. Thread zugriff verweigert 5. Was passiert da??
 
Aber der Server besteht doch nur aus einen Thread.
Wenn zwei Clients gleichzeitig Daten senden, wird doch erst der eine bearbeitet und dann der andere, oder sehe ich das falsch?

sirius 26. Sep 2008 14:39

Re: Thread. Thread zugriff verweigert 5. Was passiert da??
 
Zitat:

Zitat von Xeres
Selbst IntToStr oder DateTimeToStr schreibt Intern die Werte in eine globale Variable.

Sicher? :gruebel:

messie 26. Sep 2008 15:49

Re: Thread. Thread zugriff verweigert 5. Was passiert da??
 
Könnte auch ein nicht threadsicherer oder nichtsynchronisierter Aufruf sein. Irgendeine Routine macht etwas und wenn sie zurückkommt ist der Thread schon beendet.
Da ist mir dieser Fehler schon untergekommen.

Grüße, Messie

Thomas83 28. Sep 2008 10:39

Re: Thread. Thread zugriff verweigert 5. Was passiert da??
 
solange die Anwendung läuft sollte eigentlich auch mein Thread laufen.....
Habe die Exception abgefangen und bekommen "'' ist keine gültiger Integerwert"
Muss also in meiner Jobverarbeitung bzw. mein Protokoll überarbeiten....

alzaimar 28. Sep 2008 11:03

Re: Thread. Thread zugriff verweigert 5. Was passiert da??
 
Zitat:

Zitat von sirius
Zitat:

Zitat von Xeres
Selbst IntToStr oder DateTimeToStr schreibt Intern die Werte in eine globale Variable.

Sicher? :gruebel:

JA! Hier:
Delphi-Quellcode:
function IntToStr(Value: Integer): string;
asm
        PUSH   ESI
        MOV    ESI, ESP
        SUB    ESP, 16
        XOR    ECX, ECX      // base: 0 for signed decimal
        PUSH   EDX           // result ptr
        XOR    EDX, EDX      // zero filled field width: 0 for no leading zeros
        CALL   CvtInt
        MOV    EDX, ESI
        POP    EAX           // result ptr
        CALL   System.@LStrFromPCharLen
        ADD    ESP, 16
        POP    ESI
end;
Die Variablen, ESI,ESP,ECX,EDX und EAX sind nicht lokal deklariert, also sind es globale Variablen. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 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