Thread und Klassen
Moderator: Moderatoren
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Do, 11. Okt 2007 9:12
- Wohnort: Berneck
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Thread und Klassen
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread und Klassen
Wenn das wirklich so drinn steht, wird bei ! nicht abgebrochen und somit immer auf die Zeile nach endif gesprungen.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
Gruß
Hubert
Hubert
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Do, 11. Okt 2007 9:12
- Wohnort: Berneck
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Thread und Klassen
... ist nur ein Codefragment, die Methode bringt .T. zurück ist aber nicht aufrufbar,...
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread und Klassen
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.
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
Hubert
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Do, 11. Okt 2007 9:12
- Wohnort: Berneck
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Thread und Klassen
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
... 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
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread und Klassen
Hi,
in dem Thread hast du aber ::SOAP_GetDateTime() geschrieben, oder ?
Ansonsten bin ich jetzt auch überfragt.
in dem Thread hast du aber ::SOAP_GetDateTime() geschrieben, oder ?
Ansonsten bin ich jetzt auch überfragt.
Gruß
Hubert
Hubert
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Do, 11. Okt 2007 9:12
- Wohnort: Berneck
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
- andreas
- 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
Versuch die Methode über interne Excute-Methode zu starten.
Ungefähr so:
Ungefähr so:
Code: Alles auswählen
METHOD SoapSrvFunc:Execute()
::SOAP_GetDateTime()
RETURN SELF
...
oSoapWorkTH:start()
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Thread und Klassen
das eine Method "existiert" bedeutet noch lange nicht das du die "ansprechen" kannst ...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
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
Jimmy
- andreas
- 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
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.
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.
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Do, 11. Okt 2007 9:12
- Wohnort: Berneck
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Thread und Klassen
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
... 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
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread und Klassen
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.
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
Hubert
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Do, 11. Okt 2007 9:12
- Wohnort: Berneck
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Thread und Klassen
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread und Klassen
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 !
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
Hubert
- Friedhelm
- Cut&Paste-Entwickler
- Beiträge: 46
- Registriert: Sa, 08. Apr 2006 17:20
- Wohnort: Leverkusen
- Kontaktdaten:
Re: Thread und Klassen
Hallo Jürg,
Hast Du es mal mit einer Sync METHOD probiert?
Ich frag mich nur was das soll??? Es fehlt die Execute Methode des Threads, die eigentliche Ausführung routine des Threads.
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
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Do, 11. Okt 2007 9:12
- Wohnort: Berneck
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Thread und Klassen
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
... 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