Thread und Klassen

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Jürg Litscher
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Berneck
Danksagung erhalten: 3 Mal
Kontaktdaten:

Thread und Klassen

Beitrag von Jürg Litscher »

Hallo
Kann mir jemand helfen möchte mit Threads arbeiten, bringe es aber nicht zum laufen....
Habe eine Klasse welche ich von Thread geerbt habe, rufe ich nun eine Methode eigene Methode auf,
ist diese noch vorhanden,...
Kennt sich jemand mit Threads besser aus und kann mir einen Tipp geben - danke!
Gruss Jürg


STATIC PROCEDURE SOAPHandler(oClient)
oSoapWorkTH := SoapSrvFunc():New()
oSoapWorkTH:start()
IF !ISMETHOD( oSoapWorkTH, cMethode ) --> OK die Methode exisitiert!!!!
ENDIF
oSoapWorkTH:SOAP_GetDateTime() --> hier die Methode existiert nicht!!!!
RETURN

CLASS SoapSrvFunc FROM Thread
PROTECTED:
METHOD atStart, execute, atEnd
EXPORTED:
METHOD Init
METHOD SOAP_GetDateTime
ENDCLASS

METHOD SoapSrvFunc:Init( )
::Thread:init()

RETURN SELF

METHOD SoapSrvFunc:atStart()
….
RETURN self

METHOD SoapSrvFunc:SOAP_GetDateTime()

RETURN SELF
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh »

Jürg Litscher hat geschrieben: STATIC PROCEDURE SOAPHandler(oClient)
oSoapWorkTH := SoapSrvFunc():New()
oSoapWorkTH:start()
IF !ISMETHOD( oSoapWorkTH, cMethode ) --> OK die Methode exisitiert!!!!
ENDIF
oSoapWorkTH:SOAP_GetDateTime() --> hier die Methode existiert nicht!!!!
RETURN
Wenn das wirklich so drinn steht, wird bei ! nicht abgebrochen und somit immer auf die Zeile nach endif gesprungen.
Gruß
Hubert
Jürg Litscher
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Berneck
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher »

... ist nur ein Codefragment, die Methode bringt .T. zurück ist aber nicht aufrufbar,...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh »

Hi,

ich könnte mir vorstellen, dass er zwar die Methode hat, aber diese nicht im aufrufenden Thread angesprochen werden darf, sondern nur im neuen Thread.
Ein Thread sollte ja möglichst unabhängig vom aufrufenden Programm seine Arbeit erledigen.
DOKU hat geschrieben:Hinweis: Die Programmierung mit Thread-Objekten bzw. die Erzeugung von Threads erfordert eine sorgfältige Kapselung der Programmteile, die in einem separaten Thread ablaufen sollen. Wer noch keine Programme für Multithreading geschrieben hat, sollte vor der Benutzung von Thread-Objekten das Kapitel "Multitasking und Multithreading" in der Xbase++ Dokumentation lesen.
Gruß
Hubert
Jürg Litscher
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Berneck
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher »

Hallo
... habe natürlich schon versucht die Doku zu studieren ;-) auch mit der Kapselung habe ich mir Gedanken gemacht,
habe auch mal einen Breakpoint in der Methode start gesetzt, da sollte ich ja im richtigen Thread sein,
konnte die Methode aber auch nicht ausführen.
Gruss Jürg
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh »

Hi,

in dem Thread hast du aber ::SOAP_GetDateTime() geschrieben, oder ?

Ansonsten bin ich jetzt auch überfragt.
Gruß
Hubert
Jürg Litscher
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Berneck
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher »

.. ja genau,...
Gruss Jürg
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von andreas »

Versuch die Methode über interne Excute-Methode zu starten.
Ungefähr so:

Code: Alles auswählen


METHOD SoapSrvFunc:Execute()

   ::SOAP_GetDateTime()

RETURN SELF

...

oSoapWorkTH:start()

Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Thread und Klassen

Beitrag von AUGE_OHR »

Jürg Litscher hat geschrieben: oSoapWorkTH := SoapSrvFunc():New()
oSoapWorkTH:start()
IF !ISMETHOD( oSoapWorkTH, cMethode ) --> OK die Methode exisitiert!!!!
ENDIF
oSoapWorkTH:SOAP_GetDateTime() --> hier die Methode existiert nicht!!!!
RETURN
das eine Method "existiert" bedeutet noch lange nicht das du die "ansprechen" kannst ...

wenn ich den "Namen" deiner Class sehe "denke" ich das du wohl per activeX oder DLL für eine SOAP Verbindung einsetzt.
nun läuft aber "so was" evtl. im GUI Thread und damit kommst du "direkt" nicht ran ... du brauchst einen Handle Event Loop "inside" deiner Class.

wenn du nun eine Method deiner Class "ansprechen" willst tust du es nicht "direkt" sondern "sendest" ein

Code: Alles auswählen

PostAppEvent(Meine_Aktion,mp1,mp2, oMyClassThread)
gruss by OHR
Jimmy
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von andreas »

Wenn es um ActiveX oder fremde DLLs geht, dann kann ich wohl noch was dazu sagen.
Ich habe mal einen Fehler gesucht, warum mein Programm nicht funktionierte,
wobei beim Testen des Quellcodes mit einem kleinen Programm das ganze einwandfrei funktioniert hat.
Der Unterschied war, dass mein Code im wirklichen Programm in einem 2. Thread laufen sollte und im Testprogramm lief es im Hauptthread.
Dann nach mehreren Tests habe ich festgestellt, dass die DLL sich nicht mit Threads benutzen lässt.
Als ich die Funktion in meinem Programm im Hauptthread laufen lies, lief alles so wie es seine sollte.
Gruß,

Andreas
VIP der XUG Osnabrück
Jürg Litscher
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Berneck
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher »

hi
... bin wieder im Büro, danke für eure Rückmeldungen!

Der Versuch mit dem Aufruf innerhalb Execute()

METHOD SoapSrvFunc:Execute()
::SOAP_GetDateTime()
RETURN SELF

gibt auch den Fehler "Methode ist für dieses Objekt unbekannt" obwohl diese Methode von der selben Klasse
wie execute() ist,... laut debugger befinde ich mich auch im richtigen Thread! Die Methode execute() wird
ja erst nach der Methode start() aufgerufen, das Objekt sollte als ferti ertstellt sein!

Der Aufruf erfolgt aus einer Procedure, welche wie Webservice aufgerufen wird,
also nicht aus einem ActiveX (auf jeden Fall nicht direkt),...

Gruss Jürg
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh »

Hi,

manchmal liegt es nicht an der Methode selbst, sondern an der Sichtbarkeit der Variablen.
Du hast eine STATIC PROCEDURE verwendet, lass doch mal das STATIC hier weg.
Gruß
Hubert
Jürg Litscher
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Berneck
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher »

hi,
habe ich auch schon versucht :-( interessant ist auch, dass wenn ich die Methode proteced mache,
kommt die Meldung Aufruf dieser Methode nicht erlaubt,...
Gruss Jürg
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh »

Hi,

bei meinen Experimenten mit der QuickPDF() erhielt ich ab und an die Fehlermeldung,
dass die Funktion dllcall() bzw. die aus der OT4XB nicht vorhanden ist.
Was natürlich nicht stimmte, aber die Funktion in der externen DLL, die ich aufrufen wollte war falsch geschrieben.
Eventuell liegt also der Fehler tiefer !
Gruß
Hubert
Benutzeravatar
Friedhelm
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 46
Registriert: Sa, 08. Apr 2006 17:20
Wohnort: Leverkusen
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Friedhelm »

Hallo Jürg,

Hast Du es mal mit einer Sync METHOD probiert?

Code: Alles auswählen

CLASS SoapSrvThread FROM Thread
 PROTECTED:
   METHOD atStart, execute, atEnd
 EXPORTED:
   METHOD Init
   SYNC METHOD SOAP_GetDateTime
ENDCLASS

METHOD SoapThreadThread:Init( )
  ::Thread:init()
RETURN self

METHOD SoapSrvThread:atStart()
RETURN self

METHOD SoapSrvThread:SOAP_GetDateTime()
LOCAL cResult := DtoC(Date()) + " " + Time() 
RETURN cResult

PROCEDURE Main
LOCAL SoapTh 
   SoapTh := SoapSrvThread():New()
   SoapTh:Start()
   //...

   cDateTime := SoapTh:SOAP_GetDateTime()
  //...



Ich frag mich nur was das soll??? Es fehlt die Execute Methode des Threads, die eigentliche Ausführung routine des Threads.
Gruß Friedhelm
Jürg Litscher
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Berneck
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher »

Sali Friedhelm
... danke für die Info, die Execute Mehtode ist schon vorhanden,
nur nicht im Codeausschnitt mitkopiert. Werde es mal mit der Synch Methode probieren.
Gruss Jürg
Antworten