# Preemptives Multitasking

**URL:** <https://forum.xojo.com/t/preemptives-multitasking/48537>\
**Category:** Deutsch\
**Created:** [May 15, 2019, 2:36pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537 "2019-05-15T14:36:22Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Stefan\_Mettenbrink](https://forum.xojo.com/user_avatar/forum.xojo.com/stefan_mettenbrink/32/750_2.png) [@Stefan\_Mettenbrink](https://forum.xojo.com/u/Stefan_Mettenbrink)\
**Post date:** [May 15, 2019, 2:36pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/1 "2019-05-15T14:36:22Z")

</div>

Ich hatte meine Frage im internationalen Bereich gestellt, deshalb jetzt hier erneut. Sorry.  
Hallo in die Runde.  
Ich muss gestehen, dass ich mir bislang die Language Reference bezüglich der Threads nur oberflächlich angesehen habe. Hat ja auch gereicht, um es zum Laufen zu bringen.  
Jetzt habe ich (eher zufällig) mitbekommen, dass die Threads in Xojo ein rein kooperatives Multitasking bieten. Es wird also nicht schneller, wenn ich Arbeit auf mehrere Threads aufteile. ☹

Habe ich das korrekt verstanden?

Ich habe bei den MBS-Plugnis den Hinweis auf preemtives Multitasking gefunden. Das scheint mir genau das zu sein, was ich mir eigentlich gedacht hatte. Leider stehe ich mit der Dokumentation irgendwie auf dem Kriegsfuß. Ich finde kein einfaches Beispiel. Gefunden habe ich “CGImageSource Thumbnails Threaded.xojo\_binary\_project”. Das läuft bei mir jedoch in einen Fehler.

Hat jemand ein Anleitung, wie ich die vorhandenen Xojo-Threads (mit möglichst wenig Aufwand) in MBS-Threads umwandeln kann?

Gruß, Stefan Mettenbrink.

* * *

Christian Schmitz:

> [@](#):
>
> Threads in Xojo sind kooperativ, helfen also die GUI flüssig zu halten, wenn man nebenbei noch was längeres machen möchte.

So habe ich es inzwischen verstanden. Da funktioniert ja auch, der Anwender kann weiterarbeiten. Ist nur nicht, was ich mir wünschen würde. Gerade heute, wo eigentlich jeder Rechner mehrere Cores hat, hätte ich erwartet, dass die Threads dann auch darauf verteilt werden.

Ist das für irgendwann geplant?

> [@](#):
>
> Was ist bei dem CGImageSource Thumbnails Projekt bei dir kaputt?

MyThread.Run, line 12: This Item does not exist  
dim image as CGImageMBS = CGImageSourceMBS.CreateThumbnailMT(file, 0, options)

Kann es an einem veraltetem Plugin liegen? Ich glaube ich habe die letzten beiden Versionen ausgelassen.

[quote]Man kann die Threads auch nicht umwandeln.  
Man kann nur einzelne aufgaben durch Threaded Funktionen ersetzen, beim MBS Plugin oft durch MT im Namen gekennzeichnet.[/quote]

Ich hatte gehofft, dass ich lediglich anstelle von “NewThread as Thread” etwas wie “NewThread as ThreadMBS” nutzen könnte.

---

<div class="post-metadata">

**Author:** ![Christian\_Schmitz](https://forum.xojo.com/user_avatar/forum.xojo.com/christian_schmitz/32/158_2.png) [@Christian\_Schmitz](https://forum.xojo.com/u/Christian_Schmitz)\
**Post date:** [May 15, 2019, 2:37pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/2 "2019-05-15T14:37:33Z")

</div>

Verschiebe doch den Thread statt einen neuen auf zu machen!?

---

<div class="post-metadata">

**Author:** ![Christian\_Schmitz](https://forum.xojo.com/user_avatar/forum.xojo.com/christian_schmitz/32/158_2.png) [@Christian\_Schmitz](https://forum.xojo.com/u/Christian_Schmitz)\
**Post date:** [May 15, 2019, 2:38pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/3 "2019-05-15T14:38:34Z")

</div>

Oben rechts im Controls Menü dann auf Change Channel.

---

<div class="post-metadata">

**Author:** ![Christian\_Schmitz](https://forum.xojo.com/user_avatar/forum.xojo.com/christian_schmitz/32/158_2.png) [@Christian\_Schmitz](https://forum.xojo.com/u/Christian_Schmitz)\
**Post date:** [May 15, 2019, 2:39pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/4 "2019-05-15T14:39:33Z")

</div>

CGImageSourceMBS.CreateThumbnailMT ist von v19.1, also bitte auf aktuelles Plugin aktualisieren.

---

<div class="post-metadata">

**Author:** ![Ulrich\_Bogun](https://forum.xojo.com/user_avatar/forum.xojo.com/ulrich_bogun/32/1864_2.png) [@Ulrich\_Bogun](https://forum.xojo.com/u/Ulrich_Bogun)\
**Post date:** [May 15, 2019, 2:48pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/5 "2019-05-15T14:48:44Z")

</div>

Die MT-Methoden von Christian sind solche, die intern multithreaded laufen, also mit ihrem klassenspezifischen Code. Die kannst du nicht für andere Zwecke kidnappen.

Die einzig offiziell unterstützte Methode, in Xojo echtes Multithreading zu erreichen, besteht im Beschäftigen von Kommandozeilen-Hilfsapps. Diese können jeweils in einer interaktiven Shell laufen und mittels Shell.Write bzw. Print miteinander kommunizieren, oder per IPCSocket.

Eine echte präemptive Thread-Unterstützung in Xojo ohne diese Verrenkungen sehe ich persönlich nicht in den nächsten Jahren kommen. Thomas Tempelmann hat einiges dazu erforscht und auf der letzten MBS-Konferenz präsentiert, [ist aber auf wenig Interesse gestoßen](http://blog.tempel.org/2019/05/understanding-bugs-in-xojo-or-not.html).

---

<div class="post-metadata">

**Author:** ![Stefan\_Mettenbrink](https://forum.xojo.com/user_avatar/forum.xojo.com/stefan_mettenbrink/32/750_2.png) [@Stefan\_Mettenbrink](https://forum.xojo.com/u/Stefan_Mettenbrink)\
**Post date:** [May 15, 2019, 2:51pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/6 "2019-05-15T14:51:23Z")

</div>

> [@436533:@Christian Schmitz](#):
>
> CGImageSourceMBS.CreateThumbnailMT ist von v19.1, also bitte auf aktuelles Plugin aktualisieren.

Es funktioniert doch 😉  
OK, Xojo startet gerade mit den aktuellen Plugins.

> [@436531:@Christian Schmitz](#):
>
> Oben rechts im Controls Menü dann auf Change Channel.

Zu spät …

> [@436530:@Christian Schmitz](#):
>
> Verschiebe doch den Thread statt einen neuen auf zu machen!?

Die Aussage verstehe ich nicht.

---

<div class="post-metadata">

**Author:** ![Christian\_Schmitz](https://forum.xojo.com/user_avatar/forum.xojo.com/christian_schmitz/32/158_2.png) [@Christian\_Schmitz](https://forum.xojo.com/u/Christian_Schmitz)\
**Post date:** [May 15, 2019, 2:54pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/7 "2019-05-15T14:54:53Z")

</div>

Deine Frage im General Channel kannst du normalerweise per Controls Menü in einen anderen Kanal schieben, den für Deutsch.

---

<div class="post-metadata">

**Author:** ![Stefan\_Mettenbrink](https://forum.xojo.com/user_avatar/forum.xojo.com/stefan_mettenbrink/32/750_2.png) [@Stefan\_Mettenbrink](https://forum.xojo.com/u/Stefan_Mettenbrink)\
**Post date:** [May 15, 2019, 3:05pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/8 "2019-05-15T15:05:54Z")

</div>

> [@436537:@Ulrich Bogun](#):
>
> Die MT-Methoden von Christian sind solche, die intern multithreaded laufen, also mit ihrem klassenspezifischen Code. Die kannst du nicht für andere Zwecke kidnappen.

Ich hätte erwartet, dass Christian eine eigene Threadklasse anbietet, die einfach nur nutzen und mit meinem Code füllen muss.  
Inzwischen läuft CGImageSource Thumbnails Threaded (“Test Files” fehlt aber wohl). Dort ist nur einThread vorhanden mit der Super Eigenschaft “BackgroundThreadMBS”.  
Reicht es nicht, die Threads in meinem Projekt auf BackgroundThreadMBS umzustellen?

Muss ich mir mal in Ruhe ansehen, muss jetzt leider weg.

---

<div class="post-metadata">

**Author:** ![Christian\_Schmitz](https://forum.xojo.com/user_avatar/forum.xojo.com/christian_schmitz/32/158_2.png) [@Christian\_Schmitz](https://forum.xojo.com/u/Christian_Schmitz)\
**Post date:** [May 15, 2019, 3:11pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/10 "2019-05-15T15:11:24Z")

</div>

ThreadMBS gab’s Mal, aber das war ein Support Albtraum.

---

<div class="post-metadata">

**Author:** ![Christian\_Schmitz](https://forum.xojo.com/user_avatar/forum.xojo.com/christian_schmitz/32/158_2.png) [@Christian\_Schmitz](https://forum.xojo.com/u/Christian_Schmitz)\
**Post date:** [May 15, 2019, 3:12pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/11 "2019-05-15T15:12:11Z")

</div>

BackgroundThreadMBS is nur sinnvoll für die Aufrufe um etwas im Thread auszuführen.

---

<div class="post-metadata">

**Author:** ![Ulrich\_Bogun](https://forum.xojo.com/user_avatar/forum.xojo.com/ulrich_bogun/32/1864_2.png) [@Ulrich\_Bogun](https://forum.xojo.com/u/Ulrich_Bogun)\
**Post date:** [May 15, 2019, 3:14pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/12 "2019-05-15T15:14:18Z")

</div>

> [@436541:@Stefan Mettenbrink](#):
>
> Reicht es nicht, die Threads in meinem Projekt auf BackgroundThreadMBS umzustellen?

Die Klasse hatte ich bislang nie gesehen, danke für den Hinweis!  
Und für die genaue Klärung lasse ich sehr gerne Christian das Wort 😉

---

<div class="post-metadata">

**Author:** ![Christian\_Schmitz](https://forum.xojo.com/user_avatar/forum.xojo.com/christian_schmitz/32/158_2.png) [@Christian\_Schmitz](https://forum.xojo.com/u/Christian_Schmitz)\
**Post date:** [May 15, 2019, 3:28pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/13 "2019-05-15T15:28:44Z")

</div>

In der Doku zu [BackgroundThreadMBS](http://www.monkeybreadsoftware.net/class-backgroundthreadmbs.shtml) sieht man unten die 4 Call Aufrufe, wofür man das benutzen kann. Sonst kann man die nicht brauchen.

---

<div class="post-metadata">

**Author:** ![Sascha\_S](https://forum.xojo.com/user_avatar/forum.xojo.com/sascha_s/32/22328_2.png) [@Sascha\_S](https://forum.xojo.com/u/Sascha_S)\
**Post date:** [May 15, 2019, 3:34pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/14 "2019-05-15T15:34:49Z")

</div>

> [@436529:@Stefan Mettenbrink](#):
>
> Jetzt habe ich (eher zufällig) mitbekommen, dass die Threads in Xojo ein rein kooperatives Multitasking bieten. Es wird also nicht schneller, wenn ich Arbeit auf mehrere Threads aufteile. ☹

Mit Xojo kommst Du aktuell wohl nicht um Helper Apps herum wenn Du auf mehreren Kernen arbeiten möchtest. Aber es gibt häufig viele weitere Möglichkeiten Projekte für eine zügigere Verarbeitung zu optimieren.

Kann/Magst Du uns mehr über Dein(e) Projekt(e) erzählen? Evtl. gibt es andere Lösungsansätze als nur die Last breiter über den/die Prozessor(en) zu verteilen? 🙂

---

<div class="post-metadata">

**Author:** ![Beatrix\_Willius](https://forum.xojo.com/user_avatar/forum.xojo.com/beatrix_willius/32/282_2.png) [@Beatrix\_Willius](https://forum.xojo.com/u/Beatrix_Willius)\
**Post date:** [May 15, 2019, 4:09pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/15 "2019-05-15T16:09:54Z")

</div>

Mit HelperApps ist preemptives Multitasking möglich. Helperapps sind lästig. Das Debugging ist ebenfalls lästig. Das Übergeben von Daten ist ein kritischer Punkt. Da gibt es ein MemoryMappingMBS oder SharedMemoryMBS (Name?) im allseits beliebten Plugin. Damit stopft man Daten auf der einen Seite rein und die kommen sofort auf der anderen Seite heraus.

Ich hatte mal ein Proof-of-Concept für die Kommunikation meines Hauptprogramms mit einem Hilfsprogramm gemacht, um Daten aus AppleMail zu holen. Das Hauptprogramm hat das Schreiben in die Datenbank gemacht, während das Hilfsprogramm die Daten der nächsten Mail geholt hat. Wahr schon ein gutes Stück schneller. Ich konnte nur nicht dem Benutzer die aktuelle Mailbox sperren, sonst hätte ich das gerne verwendet.

---

<div class="post-metadata">

**Author:** ![Stefan\_Mettenbrink](https://forum.xojo.com/user_avatar/forum.xojo.com/stefan_mettenbrink/32/750_2.png) [@Stefan\_Mettenbrink](https://forum.xojo.com/u/Stefan_Mettenbrink)\
**Post date:** [May 16, 2019, 3:41pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/16 "2019-05-16T15:41:37Z")

</div>

[quote=436547:@Sascha S]  
Kann/Magst Du uns mehr über Dein(e) Projekt(e) erzählen? Evtl. gibt es andere Lösungsansätze als nur die Last breiter über den/die Prozessor(en) zu verteilen? :)[/quote]

Kein Problem.  
Meine App ist ein Programm zur Ahnenforschung. Da habe ich also haufenweise Datensätze mit Personendaten. Da gibt es eine Plausibilitätsprüfung, die beispielsweise prüft, ob eine Person vor den Eltern geboren wurde, ob es ein Frühgeburt ist, ob als Vater und Mutter dieselben Personen angegeben wurden, etc.  
Also haufenweise Prüfungen für alle Datensätze. Diese Prüfung habe ich bereits auf mehrere Threads verteilt, weil ich annahm, das würde dann von unterschiedlichen Prozessorkernen berechnet. Ich sehe hier auch nicht, wo ich hier optimieren kann.

Hier auf eine HelperApp auszulagern, ist auch nicht wirklich das, was ich möchte.

---

<div class="post-metadata">

**Author:** ![Beatrix\_Willius](https://forum.xojo.com/user_avatar/forum.xojo.com/beatrix_willius/32/282_2.png) [@Beatrix\_Willius](https://forum.xojo.com/u/Beatrix_Willius)\
**Post date:** [May 16, 2019, 3:57pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/17 "2019-05-16T15:57:10Z")

</div>

Machst Du das für Millionen von Datensätzen mit aufwendigen Algorithmen??? Wie lange dauert so eine Prüfung denn typischerweise?

---

<div class="post-metadata">

**Author:** ![Sascha\_S](https://forum.xojo.com/user_avatar/forum.xojo.com/sascha_s/32/22328_2.png) [@Sascha\_S](https://forum.xojo.com/u/Sascha_S)\
**Post date:** [May 16, 2019, 7:30pm UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/18 "2019-05-16T19:30:29Z")

</div>

Gibt es Möglichkeiten Ergebnisse zwischen zu speichern und als Cache für weitere Prüfungen zu verwenden?

In meinem größten Projekt (ein Inhouse Tausendsassa auf dem der Großteil unserer Arbeit im Unternehmen basiert), habe ich abhängig davon wie oft Daten sich ändern und wie oft diese benötigt werden, verschiedenste Caches (Dictionaries, Memory SQLite Datenbanken, etc.) im Einsatz und konnte damit z.B. dafür sorgen das sich die Arbeit mit 6 (mySQL & MSSQL) Datenbanken und REST & Co API’s, wie Arbeit auf dem lokalen Rechner “anfühlt”. Einige komplexe Vorgänge konnte ich so um den Faktor 200x (kein Scherz) beschleunigen.

Was ich damit sagen möchte ist:

- stelle sicher das die Prüfungen keine unnötigen Prozesse durchlaufen
- das keine Prüfung mehr als 1x ausgeführt werden muss
- speichere Daten zwischen, die weiteren Prüfungen helfen, bis sie nicht mehr benötigt werden oder veraltet sind
- wenn das Programm nicht vom Benutzer aktiv genutzt wird, nutze die Zeit für weitere Prüfungen mit Thread in höherer Priorität
- möglicherweise muss nicht jede Prüfung sofort erledigt werden
- zu “schwierige” Prüfungen oder “unsichere” Ergebnisse könnten evtl. mit Unterstützung des Benutzers gelöst werden

---

<div class="post-metadata">

**Author:** ![Stefan\_Mettenbrink](https://forum.xojo.com/user_avatar/forum.xojo.com/stefan_mettenbrink/32/750_2.png) [@Stefan\_Mettenbrink](https://forum.xojo.com/u/Stefan_Mettenbrink)\
**Post date:** [May 17, 2019, 4:39am UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/19 "2019-05-17T04:39:28Z")

</div>

> [@436740:@Beatrix Willius](#):
>
> Machst Du das für Millionen von Datensätzen mit aufwendigen Algorithmen??? Wie lange dauert so eine Prüfung denn typischerweise?

Das sind keine Millionen Datensätze (ich weiß von einem Anwender, der etwa 100.000 Datensätze hat). Da dauert es dann etwa drei Minuten. Aber egal wie lange es dauert, wenn es schneller gehen könnte, möchte man nicht warten.

Vor allem bin ich davon ausgegangen, dass für jeden Thread ein eigenes “Programm” (HelperApp) erzeugt wird und dieses auf einem anderen Core läuft (sofern noch vorhanden). Deshalb habe ich die Datensätze auf 8 Threads verteilt, in der Hoffnung, bei einem 8-Core-Prozessor die Cores gleichmäßig auszulasten und die Berechnungsdauer zu verkürzen.

> [@436780:@Sascha S](#):
>
> Gibt es Möglichkeiten Ergebnisse zwischen zu speichern und als Cache für weitere Prüfungen zu verwenden?

Nein.  
Es sind zwar immer dieselben Prüfungen, aber immer mit anderen Ausgangsdaten.  
Selbst wenn dem so wäre. Mir geht es darum, dass ich bisher nicht verstanden habe, dass alle Threads immer auf demselben Core laufen. Wie schon gerade beschrieben, hatte ich erwarte, dass ich mit einem neuen Thread ein “eigenständiges Programm” erzeuge, welches dann auf dem Core läuft, der gerade am wenigsten zu tun hat.

Das Beispiel “CGImageSource Thumbnails Threaded” nutzt auch nur einen Thread. Ich verstehe deshalb noch nicht, wieso das dadurch schneller werden sollte. Verstanden habe ich das Beispiel noch nicht. Das muss ich mir noch mal genauer ansehen. Vor allem, mal die Prozessorauslastung beobachten.

---

<div class="post-metadata">

**Author:** ![Beatrix\_Willius](https://forum.xojo.com/user_avatar/forum.xojo.com/beatrix_willius/32/282_2.png) [@Beatrix\_Willius](https://forum.xojo.com/u/Beatrix_Willius)\
**Post date:** [May 17, 2019, 5:25am UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/20 "2019-05-17T05:25:06Z")

</div>

Hast Du schon nachgeschaut, was am lngsten dauert? Hast Du schon Instruments zum Code-Profilen eingesetzt? Der Profiler von Xojo ist recht einfach. Instruments ist nicht wirklich schwierig zu bedienen. Damit sind Bottlenecks recht einfach zu erkennen. So ist z.B. ReplaceLineEndingsMBS entstanden.

Was auch immer hilft, ist ein Fortschrittsfenster. Wenn jemand 100.000 Ahnen hat (wie kommt man zu so vielen Personen???), der mu halt etwas lnger warten.

---

<div class="post-metadata">

**Author:** ![Sascha\_S](https://forum.xojo.com/user_avatar/forum.xojo.com/sascha_s/32/22328_2.png) [@Sascha\_S](https://forum.xojo.com/u/Sascha_S)\
**Post date:** [May 17, 2019, 5:46am UTC](https://forum.xojo.com/t/preemptives-multitasking/48537/21 "2019-05-17T05:46:35Z")

</div>

> [@436854:@Stefan Mettenbrink](#):
>
> Mir geht es darum, dass ich bisher nicht verstanden habe, dass alle Threads immer auf demselben Core laufen.

Verstehe, aber das ist leider ein Fakt der sich mit Xojo wohl auch mittelfristig nicht ändern wird. Also versuchen wir Anregungen für Alternative Ansätze zu geben. 🙂

[Next page](https://forum.xojo.com/t/preemptives-multitasking/48537.md?page=2)
