AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Thread in Objekt starten

Ein Thema von Mr_G · begonnen am 27. Jul 2008 · letzter Beitrag vom 9. Okt 2008
Antwort Antwort
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#1

Thread in Objekt starten

  Alt 27. Jul 2008, 17:40
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
Jan
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Thread in Objekt starten

  Alt 27. Jul 2008, 19:00
Benutze doch die Thread-Klasse!
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Thread in Objekt starten

  Alt 27. Jul 2008, 19:06
Da ich bis jetzt nonVCL geschrieben habe, würde ich gerne dabei bleiben.
So schwer dürfte das ja eigentlich nicht sein...
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Thread in Objekt starten

  Alt 28. Jul 2008, 10:26
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?
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Thread in Objekt starten

  Alt 9. Okt 2008, 16:46
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!
Jan
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Thread in Objekt starten

  Alt 9. Okt 2008, 17:20
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
Sebastian Jänicke
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:07 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