Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread in Objekt starten (https://www.delphipraxis.net/117896-thread-objekt-starten.html)

Mr_G 27. Jul 2008 17:40


Thread in Objekt starten
 
Hallo zusammen,

ich spiele im Moment ein bisschen mit den Sockets rum, die ich via WinAPI anspreche. Ich habe mir eine Klasse geschrieben, die die Serverfunktionalität kapseln soll. Bisher habe ich ein Objekt der Klasse in einem Thread erzeugt, der somit beschäftigt war Daten zu empfangen. Der Code hat dabei wunderbar funktioniert. Nun möchte ich aber innerhalb dieses Objekts einen Thread starten, der sich um das Empfangen der Nachrichten kümmert. Ziel ist, dass man so ein Objekt der Klasse dann auch "parallel" zum senden nutzen können soll.

Ich bin dann einfach so vorgegangen, dass ich eine Methode hinzugefügt habe die das Empfangen starten soll. Diese ezeugt einen Thread, der wiederum die bisherige Methode zum empfangen aufruft. Ich bin also vorgegangen wie es Sir Thornberry hier vorgeschlagen hat: http://www.delphipraxis.net/internal...=758329#758329

Bei mir sieht das ganze so aus:
Delphi-Quellcode:
procedure TMyTCPServer.BindServer(Port: Integer);
begin
...
  FListenThreadHandle := BeginThread(nil, 0, @MyTCPServerListenThread, Self, 0, FListenThreadId);
...
end;

function MyTCPServerListenThread(Param: Pointer): Integer;
begin
  TMyTCPServer(Param).ListenThread;
  Result := 0;
end;
...
Mein Problem: Mir fliegt nun dauernd das Programm innerhalb von ListenThread um die Ohren und ich kann nicht wirklich ausmachen warum. ListenThread wurde bisher einfach direkt aufgerufen und wurde nicht verändert. Mir ist bewusst, dass ich im Unterschied zu vorher schreibende Zugriffe auf Variablen des Objekts synchronisieren müsste aber diese finden gar nicht statt.

Ich gehe daher davon aus, das etwas mit dem Threadkram nicht stimmt... nur was?

Gruß Mr_G

dominikkv 27. Jul 2008 19:00

Re: Thread in Objekt starten
 
Benutze doch die Thread-Klasse!

Mr_G 27. Jul 2008 19:06

Re: Thread in Objekt starten
 
Da ich bis jetzt nonVCL geschrieben habe, würde ich gerne dabei bleiben.
So schwer dürfte das ja eigentlich nicht sein...

Mr_G 28. Jul 2008 10:26

Re: Thread in Objekt starten
 
Auf der Suche nach dem Fehler sehe ich meinen Verdacht bestätigt:
Es handelt sich um einen Service. Ich versuche daher den Fehler mit MessageBoxes einzugrenzen, doch verschwindet oder verändert sich der Fehler wenn ich mit meinen Nachrichten näher komme!!!
Beispielsweise habe ich bei Socketoperationen öfter den Fehler "Socket operation on nonsocket." bekommen. Nachdem ich mir Infos über entsprechende Sockethandles hab ausgeben lassen hats funktioniert:
Delphi-Quellcode:
...
//So gehts:
activeComSockets := ComSockets;
MessageBox(0, PChar('Debug 4.5: '+ IntToStr(activeComSockets.fd_count)), 'JIS', MB_SERVICE_NOTIFICATION);
timeout.tv_usec := 100;
if select(0, @activeComSockets, nil, nil, @timeout) = SOCKET_ERROR then
  HandleError
...
Delphi-Quellcode:
...
//So nicht:
activeComSockets := ComSockets;
timeout.tv_usec := 100;
if select(0, @activeComSockets, nil, nil, @timeout) = SOCKET_ERROR then
  HandleError
...
Lustigerweise handelt es sich bei allen Variablen im Codeausschnitt um lokale Variablen der procedure ListenThread. Das ganze tritt an mehreren Stellen in dieser Form auf.

Frage: Wieso so komische Fehler und wie bekomme ich den Thread vernünftig ans laufen?

Mr_G 9. Okt 2008 16:46

Re: Thread in Objekt starten
 
So...
Nach einer wiederaufgenommenen Fehlersuche und einigen ergänzenden Fragen habe ich nun wohl die Lösung gefunden. Was soll ich sagen - es lag natürlich nicht an den Threads. Das funzt alles super.
Ich glaube (sicher bin ich mir nicht), dass es an einem nicht initialisierten Array gelegen hat, welches ich an eine API-Funktion übergeben habe. Warum das dann teilweise funktionierte als ich mit den Messageboxen gearbeitet habe ist mir schleierhaft. Ich gehe nun zumindest davon aus, dass der Fehler behoben ist, denn ich bekomme das Programm einfach nicht zum Absturz.
An dieser Stelle nochmal: Danke für die Hilfe in den diversen Threads! :dp:

jaenicke 9. Okt 2008 17:20

Re: Thread in Objekt starten
 
Zitat:

Zitat von Mr_G
Warum das dann teilweise funktionierte als ich mit den Messageboxen gearbeitet habe ist mir schleierhaft.

Das habe ich in diesem Thread versucht zu erklären, da ging es um ein ähnliches Problem ;-):
http://www.delphi-forum.de/viewtopic...=527021#527021


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