![]() |
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: ![]() Bei mir sieht das ganze so aus:
Delphi-Quellcode:
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.
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; ... Ich gehe daher davon aus, das etwas mit dem Threadkram nicht stimmt... nur was? Gruß Mr_G |
Re: Thread in Objekt starten
Benutze doch die Thread-Klasse!
|
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... |
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:
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.
...
//So nicht: activeComSockets := ComSockets; timeout.tv_usec := 100; if select(0, @activeComSockets, nil, nil, @timeout) = SOCKET_ERROR then HandleError ... Frage: Wieso so komische Fehler und wie bekomme ich den Thread vernünftig ans laufen? |
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: |
Re: Thread in Objekt starten
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz