Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   [Prism] Interner Fehler bei for parallel - Schleife (https://www.delphipraxis.net/127222-%5Bprism%5D-interner-fehler-bei-parallel-schleife.html)

BloodySmartie 9. Jan 2009 11:53


[Prism] Interner Fehler bei for parallel - Schleife
 
Hallo zusammen!

Ich wollte nach gründlichem Testen der für mich als Delphi Win32 Benutzer "normalen" Möglichkeiten der Sprache von Delphi Prism mal mit den neuen tollen Features beschäftigen. In diesem Fall mit einer parallelen for-schleife. Ich habe also ein neues Projekt für eine Windows Forms Anwendung angelegt, nen Button auf die Form gesetzt und in den Eventhandler des Click-Ereignisses folgenden ersten und sinnlosen Code geschrieben:

Delphi-Quellcode:
method MainForm.Button1_Click(sender: System.Object; e: System.EventArgs);
var j:Integer;
begin
 j:=0;
 for parallel i:Integer:=0 to 10000 do begin
  j:=j+1;
 end;
end;
Das Projekt kann dann dann nicht kompiliert werden. Der Compiler sagt "(CE7) Internal Error (D03)" in RemObjects.Oxygene.targets. Außerdem gibts in der gleichen Datei einige Warnungen.

Die Bibliothek System.Threading(Aus der Parallel Extensions CTP 2008), Version 1.0.3058.34407, habe ich referenziert und in der uses-Klausel des Codes der Form angegeben.

Der Fehler lässt sich ohne weiteres reproduzieren. Lasse ich das Schlüsselwort "parallel" weg, funktioniert alles wie erwartet.

Soll ich den internen Fehler nun darauf schieben, dass ich ne Betaversion von Prism(RO Oxygene 3.0.16.571) benutze oder gibts vielleicht etwas, das ich gegen den Fehler tun kann?

Danke :)

Dax 9. Jan 2009 12:06

Re: [Prism] Interner Fehler bei for parallel - Schleife
 
Ich würde mal denken, dass RO da ein wenig die Fehlermeldungen verbessern könnte (dein Schleifencode hängt von einer Variable ausserhalb der Schleife ab, da können ganz böse gleichzeitige Schreib/Lesezugriffe passieren - parallel startet Threads, immer dran denken).

BloodySmartie 9. Jan 2009 12:40

Re: [Prism] Interner Fehler bei for parallel - Schleife
 
Hier hab ich ganz offensichtlich mal wieder Nachholbedarf :)

Hmm, ohne "j" kompiliert das tatsächlich. Aber jetzt steh' ich erst recht aufm Schlauch. Kannst Du mir ein dreizeiliges Beispiel klappern, damit ich kapiere, wie ich Daten in die Schleife geben und Ergebnisse rausbekommen kann? (Oder kannst Du mir das wenigstens erklären?)

Elvis 9. Jan 2009 13:09

Re: [Prism] Interner Fehler bei for parallel - Schleife
 
Zitat:

Zitat von BloodySmartie
Hier hab ich ganz offensichtlich mal wieder Nachholbedarf :)

Hmm, ohne "j" kompiliert das tatsächlich. Aber jetzt steh' ich erst recht aufm Schlauch. Kannst Du mir ein dreizeiliges Beispiel klappern, damit ich kapiere, wie ich Daten in die Schleife geben und Ergebnisse rausbekommen kann? (Oder kannst Du mir das wenigstens erklären?)

Eine Möglichkeit wäre es, den Wert in eine Referenz zu verpacken. Damit hat man was, das gesperrt werden kann:
Delphi-Quellcode:
var j := new class(Value := 0);
for parallel i : Integer := 0 to 10000 do
begin
  locking j do
    j.Value := j.Value + 1;
end;
Ich habe hier eine anonyme Klasse verwendet, das reduziert ein unnötiges Deklarieren einer Klasse nur dafür...
Natürlich ist der Code komplett irrsinnig. Schließlich sorgt das "locking" dafür, dass imer nur ein Thread auf einmal die Zahl inkrementiert... :mrgreen:

BloodySmartie 9. Jan 2009 13:33

Re: [Prism] Interner Fehler bei for parallel - Schleife
 
Deine Lösung ist interessant und leuchtet auch direkt ein, aber ich kann sie nicht umsetzen - es gibt dann wieder den selben Fehler.

Christian S. 9. Jan 2009 13:54

Re: [Prism] Interner Fehler bei for parallel - Schleife
 
Ich benutze eine ältere Beta-Version (Pre-RTM) und da kompiliert Roberts Code.

Dein Code auch, aber bei dem dürfte es dann zur Laufzeit knallen ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz