oThread:result [Erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

oThread:result [Erledigt]

Beitrag von Jan »

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
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.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: oThread:result

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: oThread:result

Beitrag von Jan »

Tja. Zu früh gefreut. :synchronize blockiert den aufrufenden Thread. Was ich überhaupt nicht gebrauchen kann.

Muß ich doch weiter suchen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: oThread:result

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten