Thread und Klassen

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Jürg Litscher
Rookie
Rookie
Beiträge: 18
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Rebstein
Kontaktdaten:

Thread und Klassen

Beitrag von Jürg Litscher » Mi, 11. Mai 2011 7:13

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: 14466
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh » Mi, 11. Mai 2011 8:59

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
Rookie
Rookie
Beiträge: 18
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Rebstein
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher » Mi, 11. Mai 2011 9:40

... ist nur ein Codefragment, die Methode bringt .T. zurück ist aber nicht aufrufbar,...

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14466
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh » Mi, 11. Mai 2011 9:59

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
Rookie
Rookie
Beiträge: 18
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Rebstein
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher » Mi, 11. Mai 2011 10:33

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: 14466
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh » Mi, 11. Mai 2011 10:40

Hi,

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

Ansonsten bin ich jetzt auch überfragt.
Gruß
Hubert

Jürg Litscher
Rookie
Rookie
Beiträge: 18
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Rebstein
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher » Mi, 11. Mai 2011 10:58

.. ja genau,...
Gruss Jürg

Benutzeravatar
andreas
Foren-Moderator
Foren-Moderator
Beiträge: 1727
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Kontaktdaten:

Re: Thread und Klassen

Beitrag von andreas » Mi, 11. Mai 2011 14:58

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
Beisitzer des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11298
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Thread und Klassen

Beitrag von AUGE_OHR » Fr, 13. Mai 2011 8:09

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
Foren-Moderator
Foren-Moderator
Beiträge: 1727
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Kontaktdaten:

Re: Thread und Klassen

Beitrag von andreas » Fr, 13. Mai 2011 9:04

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
Beisitzer des Deutschsprachige Xbase-Entwickler e. V.

Jürg Litscher
Rookie
Rookie
Beiträge: 18
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Rebstein
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher » Di, 17. Mai 2011 10:59

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: 14466
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh » Di, 17. Mai 2011 11:40

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
Rookie
Rookie
Beiträge: 18
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Rebstein
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher » Di, 17. Mai 2011 11:51

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: 14466
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Thread und Klassen

Beitrag von brandelh » Di, 17. Mai 2011 13:20

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 » Di, 17. Mai 2011 22:00

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
Rookie
Rookie
Beiträge: 18
Registriert: Do, 11. Okt 2007 9:12
Wohnort: Rebstein
Kontaktdaten:

Re: Thread und Klassen

Beitrag von Jürg Litscher » Mi, 18. Mai 2011 7:03

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