Hallo,
ich habe die Anforderung, das ich in einem Thread ein Array fülle, und dieses Array dann zurück bekommen muß. Jetzt könnte ich das als PUBLIC deklarieren, möchte ich aber wenn möglich vermeiden. Außerdem geht es hier offenbar auch darum, etwas zu verstehen.
Was ich im Moment mache: Ich übergebe an den Thread als Parameter zwei Arrays und den Browse, in dem das erste Array angezeigt wird: oThread:start("meineFunktion", @aArray1, @aArray2, @oBrowse). Array1 ist bereits fertig gefüllt, wird aber im Thread noch weiter ergänzt. Am Ende dieses Erweiterns kommt ein aArray2 := AClone(aArray1). Im Debugger sehe ich, das aArray2 alle gewünschten Daten enthält, also korrekt besteht. Aber im aufrufenden Code ist das immer noch leer. Andererseits ändere ich im Thread den oBrowse:cargo. Und diese Änderung bekomme ich sauber zurück. Und auch aArray1, das ja im Thread erweitert wird, ist nach dem Threaddurchlauf überall erweitert sichtbar.
Ich habe dann mal versucht, das mit oThread:result zu lösen. Aber danach ist aArray2 sogar einfach nur NIL.
Da ja der :cargo korrekt zurück gegeben wird, das also grundsätzlich klappt wenn ich die Variablen per Referenz übergebe - funkt mir da die spezifische Angewohnheit der Arrays dazwischen? Und wie bekomme ich das sauber hin, das ich ein korrekt gefülltes aArray2 bekomme?
Nachtrag: Natürlich ist es Blödsinn, die Arrays per Referenz zu übergeben. da die automatisch entsprechend übergeben werden. Aber auch wenn ich das raus nehme ändert das nichts am Resultat. aArray2 ist entweder {} oder NIL.
Jan
oThread:result [Erledigt]
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
oThread:result [Erledigt]
Zuletzt geändert von Jan am Fr, 21. Sep 2018 15:27, insgesamt 2-mal geändert.
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: oThread:result
OK, habs gefunden.
Wenn ich zwischen oThread:start und oThread:result ein oThread:synchronize(0) stelle, dann klappt das auch. Muß man erstmal drauf kommen.
Bleibt aber noch die Frage offen, warum das Array bei Übergabe als Parameter nicht korrekt gefüllt zurück kommt. Das andere, das erweitert wird, und der Browse aber doch.
Jan
Wenn ich zwischen oThread:start und oThread:result ein oThread:synchronize(0) stelle, dann klappt das auch. Muß man erstmal drauf kommen.
Bleibt aber noch die Frage offen, warum das Array bei Übergabe als Parameter nicht korrekt gefüllt zurück kommt. Das andere, das erweitert wird, und der Browse aber doch.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: oThread:result
Tja. Zu früh gefreut. :synchronize blockiert den aufrufenden Thread. Was ich überhaupt nicht gebrauchen kann.
Muß ich doch weiter suchen.
Jan
Muß ich doch weiter suchen.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: oThread:result
OK, jetzt aber. Das Problem war, das ich das aArray1 per AClone() nach aArray2 kopiert hatte. Irgendwie hatte ich im Hinterkopf, daß die dann nicht mehr verknüpft sind. Aber Pustekuchen. ACopy() kopiert nur 1 Dimension, AClone() mehrere. das ist der einzige Unterschied.
Also habe ich jetzt einfach eine FOR...NEXT-Schleife genommen, und die Arrayelemente von Hand rüber kopiert (ist immer nur ein DataObject drin, ist also einfach erledigt). Damit klappt das jetzt.
Jan
Also habe ich jetzt einfach eine FOR...NEXT-Schleife genommen, und die Arrayelemente von Hand rüber kopiert (ist immer nur ein DataObject drin, ist also einfach erledigt). Damit klappt das jetzt.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.