Sie sind nicht angemeldet.

1

Freitag, 3. August 2018, 13:05

Thread beenden

Hallo,
ich habe mit MSG_PROCESS_CREATE_EVENT_THREAD einen neuen Thread erzeugt. Dem kann ich dann auch Messages senden und alles klappt prima.

Quellcode

1
@call (((optr)threadHandle)<<16)::MSG_SONSTWAS_ZU_TUN(parameter);

Am Ende will ich den Thread dann wider vernichten. Die Doku sagt, sende ihm ein MSG_META_DETACH.

Quellcode

1
@call (((optr)threadHandle)<<16)::MSG_META_DETACH(0,0);


Das klapp aber nicht, und swat meldet ILLEGAL_HANDLE
In der Big Knowledgebase steht, sende ihm ein MSG_META_QUIT

Quellcode

1
@call (((optr)threadHandle)<<16)::MSG_META_QUIT();


Da stürzt mein GEOS sofort ab (Kr-09) und swat meldet auch ILLEGAL_HANDLE.
Nun lasse ich die Thraeds laufen, aber das koste bei mehrfachem Aufruf des Programm jedes mal ein paar Handles. Irgend eine Idee? Vielleicht muss ich MSG_META_DETACH irgend etwas übergeben?
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

2

Freitag, 3. August 2018, 14:28

Threads and Semaphores: 4.4 Using Multiple Threads: When a Thread Is Finished
| Up: GEOS SDK TechDocs | Up | Prev: 4.3 Handling Errors in a Thread | Next: 5 Synchronizing Threads
--------------------------------------------------------------------------------

ThreadDestroy()
Whenever an application creates an additional thread with MSG_PROCESS_CREATE_EVENT_THREAD or ThreadCreate() , it must be sure that the thread exits when it is finished. Simply exiting the application may not eliminate any additional threads, and these threads can cause GEOS to hang when shutting down the system.

When a thread exits, it should first release any semaphores or thread locks it has locked and free any memory or other resources that are no longer needed. Resources in memory do not have to be freed in the same thread that allocated them, but you should be sure that they are freed before the application exits.

A procedural thread exits by calling ThreadDestroy() with three arguments: an error code, an optr, and a word of data. When the thread exits, it sends (as its last act) a MSG_PROCESS_NOTIFY_THREAD_EXIT to the application's primary thread and a MSG_META_ACK to the object descriptor passed. (ThreadDestroy()'s word of data argument will be passed as the lower word of MSG_META_ACK's optr argument.) Each message has the error code as an argument. In designing a multi-threaded application, you can create methods for MSG_PROCESS_NOTIFY_THREAD_EXIT (in your primary thread's class) or MSG_META_ACK (in any class) for communication among threads, and you may use the error code for any data you choose. The convention is that an error code of zero represents successful completion of a thread's task.

An event-driven thread should not call ThreadDestroy() directly because its event queue must be removed from the system cleanly. Instead, send a MSG_META_DETACH to the thread, passing the same arguments as for ThreadDestroy() . The handler for MSG_META_DETACH in MetaClass cleanly removes the event queue and terminates the thread, sending the same messages as described above. You may write a special handler for MSG_META_DETACH when you subclass ProcessClass , but be sure to end the handler with @callsuper() so the thread exits properly.


--------------------------------------------------------------------------------
| Up: GEOS SDK TechDocs | Up | Prev: 4.3 Handling Errors in a Thread | Next: 5 Synchronizing Threads
d[ 0_O ]b

3

Freitag, 3. August 2018, 14:34

ThreadDestroy()
void ThreadDestroy(
word errorCode, /* Error code to indicate cause of destruction */
optr ackObject, /* Object to receive destruction acknowledgment */
word ackData); /* Additional word of data to pass (as the low
* word of optr for source of MSG_META_ACK) */

This routine causes the current (calling) thread to exit and then destroy
itself. The thread is responsible for ensuring that it has no leftover resources
allocated or semaphores locked.

Pass it an error code or exit code meaningful to the application and the
other threads in the application. This error code will be used by the debugger
to determine the cause of the thread's exit; a null error code usually indicates
successful completion of the thread's task.

Pass also the optr of the object to receive acknowledgement of the thread's
destruction. The object specified will receive MSG_META_ACK after
the calling thread is completely destroyed.

Be Sure To: Always clean up before exiting a
thread. Unlock locked resources, free allocated memory, etc. You do not have to
do these things for the application's primary thread; the process object (the
primary thread) will automatically clean up after itself.
d[ 0_O ]b

4

Freitag, 3. August 2018, 14:36

Wenn ich das richtig verstehe, benötigt MSG_META_DETACH dieselben 3 Parameter wie ThreadDestroy...
...aber gab es dafür nicht auch ein Beispielprogramm im SDK_C-Ordner?
d[ 0_O ]b

5

Freitag, 3. August 2018, 14:40

In der Big Knowledgebase steht, sende ihm ein MSG_META_QUIT

Quellcode

1
@call (((optr)threadHandle)<<16)::MSG_META_QUIT();

Vielleicht solltest Du @send statt @call nutzen?! Denn MSG_META_QUIT() wird wohl kaum einen Wert zurückliefern, oder?!
d[ 0_O ]b

6

Freitag, 3. August 2018, 17:08

Hallo Jörg,
1. natürlich hab eich das Handbuch gelesen :-)
2. Ich hab es auch mir prozeduralen Threads versucht, da funktioniert das Killen des Threads mit ThreadDetroy auch. Es gibt aber ein anderes Problem, dass es unmöglich macht, prozedurale Threads für meinen Zweck zu benutzen.
3. ThreadDestroy(0, 0, 0) fuzzt für prozedurale Threads super: Fehlercode Null, keine extra Message an kein Objekt senden.
4. MSG_META_DETACH hat nur 2 Parameter - ein Objekt dass eine Message erhalten soll und eine ID. Ich will aber keine Message irgendwo hin senden.
5. Du hast Recht, bei SDK_C gibt es tatsächlich ein Beispiel. Muss ich mal schauen.

6.
Vielleicht solltest Du @send statt @call nutzen?! Denn MSG_META_QUIT() wird wohl kaum einen Wert zurückliefern, oder?!
Warum nicht? MSG_META_QUIT kehrt sehr wohl zurück, es beendet ja in diesem Fall nicht das aufrudende Programm sondern den Ziel-Thread. Ich hatte natürlich eine Grund für das @call, kann aber trotzdem mal ein send probieren.
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

7

Dienstag, 7. August 2018, 11:26

Und? Konntest Du das Problem lösen? (Bei den Temperaturen habe ich wenig Motivation, auch noch daheim am PC zu sitzen. Ich könnte aber die nächsten Tage mal in meinem "Zeugs" nach Beispielcode suchen...)
d[ 0_O ]b

8

Mittwoch, 8. August 2018, 12:48

Hallo Jörg,
Konntest Du das Problem lösen?

Habe mich erst noch mit anderen Problemen beschäftigt. Werde hier berichten wenn ich neue Erkenntnisse habe.
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

9

Sonntag, 12. August 2018, 12:34

Manche Probleme lösen sich von allein. Und bei einigen davon weiss man nicht warum. Jetzt geht MSG_META_DEATCH sowohl mit @call als auch mit @send, auch durch swat. MSG_META_QUIT hingegen crasht immer. Da liegt die Big Knowledgebase offenbar falsch.

Meine Vermutung geht dahin, dass man wahrscheinlich sicherstellen muss, dass in der Queue des Threads keine anderen Messages mehr warten. Deswegen habe ich ursprünglich auch @call verwendet. Ich löse das Problem nun so, dass ich dem Thread vorher eine Dummy-Message sende (mit @call). Wenn die zurückkommt ist die Queue mit Sicherheit leer.
Aber ganz befriedigt mich das noch nicht, weil ich nicht genau weiß, was ich falsch gemacht hatte. Damit wiederholt man den Fehler möglicherweise.

Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

10

Montag, 13. August 2018, 10:09

Vielleicht liegt der Fehler ja auch an der Implementation des MSG_META_DEATCH im Thread, der geschlossen werden soll... Muss z.B. @callsupper am Anfang oder am Ende aufgerufen werden?! Usw. usf.?
d[ 0_O ]b

11

Gestern, 18:02

Ich überschreibe MSG_META_DETACH im neuen Thread nicht.
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

Zur Zeit ist neben Ihnen 1 Benutzer in diesem Thema unterwegs:

1 Besucher

Ähnliche Themen

Thema bewerten