![]() |
Re: AsyncCalls 2.9 - Asynchrone Funktionsaufrufe in Delphi
Zitat:
|
Re: AsyncCalls 2.9 - Asynchrone Funktionsaufrufe in Delphi
Nun hat mich der Delphi 2009 vor den Kopf gestoßen. AsyncCalls 2.9 ist nicht mit Delphi 2009 nutzbar, da bei einem "Make Project" ein interner Compiler Fehler auftritt. Und dass man seine Projekte immer mit "Build Project" erzeugt, halt ich für eine Zumutung.
|
Re: AsyncCalls 2.9 - Asynchrone Funktionsaufrufe in Delphi
Hi,
Zitat:
Übrigens mal ein großes, dickes Danke für Deine gute Arbeit! Gruß Assertor |
Re: AsyncCalls 2.9 - Asynchrone Funktionsaufrufe in Delphi
[quote="Assertor"]Da muß wohl noch an der Stabilität des neuen Compiler gearbeitet werden ;)
Bei der neuen Version 2.91, die ab jetzt verfügbar ist, habe ich sämtliche Generics auskommentiert. Ich hoffe, dass das "Delphi 2009 Update 1" bald kommt, da Generics so für mich nicht wirklich nutzbar sind. Da ich nicht gerne russisches Roulette spiele. Zitat:
|
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Hi,
so und um jetzt mal dem theoretischen Teil der Forschung und Entwicklung etwas mehr Breite zu verpassen, hier eine Thread Library für Delphi von Primoz, dem Autoren von OmniXML: ![]() Gruß Assertor |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Ich bin mir noch nicht ganz sicher ob es nicht doch an mir liegt, aber ich glaube ich habe einen Bug gefunden.
In der Execute-Prozedur eines Threads passiert u.a. folgendes:
Delphi-Quellcode:
Soweit ich das nun verfolgen konnte, hat c zunächst den erwarteten Wert - nämlich die Zahl der Datensätze aus meiner SQL-Abfrage. Nach LeaveMainThread hat c aber den Wert 0.
c:=qry.RecordCount;
setlength(self.Machines,c); qry.First; for I := 0 to c - 1 do begin tmps:=utf8toansi(qry.FieldByName('phonenumber').AsString); p:=localFindMachine(tmps); EnterMainThread; try p^.isDeleted:=true; p^.isactive:=false; finally LeaveMainThread; end; qry.Next; end; Vielleicht habe ich aber auch die Funktionsweise von EnterMainThread / LeaveMainThread falsch verstanden. |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Wo hast du c denn deklariert?
Wird noch von woanders darauf zu gegriffen? "for I := 0 to c - 1 do begin" Der Compiler braucht c nach dieser Zeile nicht mehr, da die Schleife rückwärts laufen kann. Der Debugger weiß das aber nicht und zeigt möglicherweise den Inhalt an, der zufälligerweise im CPU Register steht, das vorher für c benutzt wurde. |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
c ist lokal deklariert und ich greife weiter unten nochmal in einer Verzweigung darauf zu, in der ich Prüfe, ob c größer als 0 ist. Das schlug dauernd fehl, so bin ich auf das Problem gestoßen.
|
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Dein Compiler dürfte dir eine Warnung ausgeben: "c nach Schleifendurchlauf undefiniert" oder so ähnlich
|
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Eine solche Warnung bekomme ich auch nicht. Das verstehe ich jetzt sowieso nicht. Warum sollte mein Compiler denn c einfach wegwerfen, nur weil ich es in der Schleife verwende? besonders, wo es ein paar Zeilen weiter unten ja noch gebraucht wird. Das habe ich auch vorher noch nie beobachtet.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz