Seite 5 von 6

Verfasst: 20.11.2008 11:39
von Thorium
Toshy hat geschrieben: Das ist es was ich meinte, so aber leider auch noch icht in der Deutlichkeit laß.
Das heißt faktisch, das jeder so programmieren muß wie ich es gesagt habe. Komplett die gesammte Stringverwendung (Variablen, Befehle, Funkionen, denke auch mal Konstanten) muß mit einem einzigen Mutex gesichert sein. Dennoch kann dies bei Programmen die Geschwindigkeitsoptimiert sind sehr vorteilhaft sein. Und mit ein wenig "basteln" (Macros, Proceduren) kann man das recht leicht hinbekommen. Einzig vergessen darf man dann nix ;-)
Doch, doch. Das war sehr deutlich was du geschrieben hast und wir haben das auch alle verstanden und wie gesagt schon festgestellt. ^^
Aber das heisst nicht das jeder so programmieren muss. Das heisst einfach nur das man Threadsave aktivieren muss, wenn man mit Strings in Threads arbeitet. Ich gehe mal davon aus das ein Mutex langsamer ist als Threadsave. Könnte man aber mal testen.
Toshy hat geschrieben: @Freak:
ich denke einer von uns oder wir gemeinsam, sollten mal einen kurzen Text erstellen, der genau das was du jetzt geschrieben hast beinhaltet und dann mit in die PBhilfe unter Threads bzw. "threadsafe" eingefügt wird, damit es wirklich alle genau verstehen.
Ich bedanke mich mal wieder herzlichst bei dir für deine klare und gute Hilfe. (obwohl ich bis auf den globalen Speicherbereich ja schon aufgeklärt war)
Das wär mal ne Maßnahme. Weil die Andeutungen in der Hilfe sind einfach zu ungenau!

Verfasst: 20.11.2008 11:55
von Thorium
Toshy hat geschrieben: So z.B. habe ich eine Procedure, jetzt ein Macro das ich anstatt von addelement und creatememory usw. nutze. die meisten überprüfen nicht ob auch überall der speicher korrekt erstellt wurde (besonders wenn man oft speicher allokiert). bei mir wir wenigstens der Code so lange nicht weiter ausgeführt bis Speicher allokiert wurde. Und sei es noch so unwahrscheinlich das Addelement mal einen Fehler auslöst.
Wie sieht das Macro denn aus? Es wartet bis Speicher allokiert werden konnte, in einer Schleife? Wenn ja, würde ich nicht so machen. Wenn kein Speicher allokiert werden konnte über AddElement oder AllocateMemory bedeutet das, dass nicht genügend freier Speicher vorhanden ist. In dem Sinne wäre es besser eine entsprechende Fehlermeldung auszugeben und entweder die Prozedur oder das komplette Programm, jenachdem, zu beenden. Ansonsten könntest du dir damit ne Falle für ne Endlosschleife gestrickt haben.

Verfasst: 26.11.2008 18:15
von Toshy
@Thorium:
Hi. Du hast dich da etwas verlesen. Ich hab nicht geschrieben, daß ich nicht deutlich war, sondern daß ich die Aussage von Freak bezüglich PB noch nicht so deutlich gelesen hatte.

Und natürlich muß jeder so programmieren "wenn er nicht threadsafe" nutzt. Darum geht es ja hier und immer mal wieder. Bei Threads sollte man immer threadsafe nutzen, aber es geht ja darum es NICHT zu nutzen, wegen dem Geschwindigkeitsverlust. Und wer die Kompileroption threadsafe nicht nutzt, muß es halt so machen. Das hast du vermutlich nur überlesen.

Bezüglich der Hilfe komme ich aktuell nicht dazu, aber mal sehn, einer von uns kommt vielleicht dazu. Du hast schon recht das es nicht deutlich genug in der Hilfe steht. Wenigstens sowas in der Art von "Der Threadsafekompilermodus ist bei Verwendung von Threads immer zu verwenden. Experten (!!!) können diesen Modus abschalten falls ihnen die interne Stringverwaltung bekannt ist und die damit entstehenden Probleme. Eine Verwendung von Stringvariablen, -funktionen, -befehlen ohne die Kompileroption in Thread ist kompliziert und eröffnet viele Gefahrenquellen !!!" Das sollte schon ohne weitere Erklärung mindestens drinn stehen.

@Theorium:
Ja, könnte ne Endlosschleife sein, aber das ist nicht so schlimm, denn dies geschieht nur, wenn kein Speicher da ist. Und eine Endlosschleife (mit Delay) ist immer noch besser, als wenn das Programm crasht. Endlos ja auch nur in soweit, bis wieder Speicher da ist. Es kommt öfter vor als man denkt, das kein Speicher mehr da ist, aber oft halt nur für milisekunden. Wenn die Auslagerungsdatei angepaßt wird oder so kommt das schon öfter mal vor. Man kann aber nicht jede eventualität mit Code komplett auffangen, man kann dann nur ne art Warteschleife bauen bis diese Situation erledigt ist und dann weiter im Code machen.
Allerdings ist in dem Macro auch ne Ifoption drinn, die ab einer bestimmen Anzahl an durchläufen eine Errormeldung ausgibt. Aus geschwindigkeitsgründen aber aktuell auskommentiert.
Im Endeffekt heißt es bei mir also nur, das ein Thread mal hängt falls kein Speicher da ist, dafür aber nicht crasht oder gar fehlerhaft arbeitet. Wenn kein Speicher da ist, kann man eh im Grunde kein programm weiter laufen lassen bzw. Code erstellen der dies auffängt, da man ja eh früher oder später in dem "Auffangcode" wieder Speicher braucht.
Hast aber ansonsten mit deiner Überlegung recht.

(noch mal als Hinweis: KEIN SPEICHER kommt recht oft vor, Windows gibt sogar die Ereignismeldung raus, wenn die Auslagerungsdatei / der virtuelle Speicher angepaßt wird, das in dieser Zeit Speicheranforderungen abgelehnt werden können. Eine einfache Programmschleife überbrückt solche Dinge aber wunderbar (bei mir wird je durchlauf das "delay()" um eine milisekunde erhöht.))

Verfasst: 26.11.2008 20:09
von Thorium
Toshy hat geschrieben: (noch mal als Hinweis: KEIN SPEICHER kommt recht oft vor, Windows gibt sogar die Ereignismeldung raus, wenn die Auslagerungsdatei / der virtuelle Speicher angepaßt wird, das in dieser Zeit Speicheranforderungen abgelehnt werden können. Eine einfache Programmschleife überbrückt solche Dinge aber wunderbar (bei mir wird je durchlauf das "delay()" um eine milisekunde erhöht.))
Ah, sehr wertvolle Information. Wusste ich noch nicht, Danke. :allright:

Verfasst: 28.11.2008 12:37
von Thorium
Toshy hat geschrieben: Und natürlich muß jeder so programmieren "wenn er nicht threadsafe" nutzt. Darum geht es ja hier und immer mal wieder. Bei Threads sollte man immer threadsafe nutzen, aber es geht ja darum es NICHT zu nutzen, wegen dem Geschwindigkeitsverlust. Und wer die Kompileroption threadsafe nicht nutzt, muß es halt so machen. Das hast du vermutlich nur überlesen.
Um nochmal darauf zurückzukommen. Man muss Threadsave nutzen, alles andere ist Leichtsinn und Performance spart man mit Sicherheit nicht, wenn man alle Stringoperationen mit Mutex absichern muss. Im Schlimmsten Fall bedeutet das 1ms Verzögerung pro String-Operation. Wird natürlich so nicht in der Praxis vorkommen aber soweit ich weis, wartet ein Mutex minimum 1ms, wenn der Mutex bereits gesperrt ist.
Da ist mir der threadlocal storage Stringbuffer von der Performance her lieber. :wink:

Zudem hab ich noch was anderes in der MSDN gefunden, was mir sagt das Threadsave einfach immer aktiviert werden sollte, bei mehreren Threads.
HeapAlloc

Serialization ensures mutual exclusion when two or more threads attempt to simultaneously allocate or free blocks from the same heap. There is a small performance cost to serialization, but it must be used whenever multiple threads allocate and free memory from the same heap. Setting the HEAP_NO_SERIALIZE value eliminates mutual exclusion on the heap. Without serialization, two or more threads that use the same heap handle might attempt to allocate or free memory simultaneously, likely causing corruption in the heap. The HEAP_NO_SERIALIZE value can, therefore, be safely used only in the following situations:

* The process has only one thread.
* The process has multiple threads, but only one thread calls the heap functions for a specific heap.
* The process has multiple threads, and the application provides its own mechanism for mutual exclusion to a specific heap.
Ich will garnicht wissen was es noch alles so für Sachen gibt die von Haus aus nicht Threadsave sind. Da müsste man ja bald jeden PB-Befehl mit Mutex schützen. Was natürlich blödsinnig wäre. Da spart man nix an Performance.
Toshy hat geschrieben: (noch mal als Hinweis: KEIN SPEICHER kommt recht oft vor, Windows gibt sogar die Ereignismeldung raus, wenn die Auslagerungsdatei / der virtuelle Speicher angepaßt wird, das in dieser Zeit Speicheranforderungen abgelehnt werden können. Eine einfache Programmschleife überbrückt solche Dinge aber wunderbar (bei mir wird je durchlauf das "delay()" um eine milisekunde erhöht.))
Kannst du mir dazu noch nen Link geben? Weil in der MSDN kann ich nix dazu finden. Weder im Memory Managment noch in den einzelnen Funktionen wird soetwas erwähnt. Es gibt auch keinen Error-Code dafür.

Verfasst: 07.12.2008 23:55
von Toshy
Toshy hat Folgendes geschrieben:

(noch mal als Hinweis: KEIN SPEICHER kommt recht oft vor, Windows gibt sogar die Ereignismeldung raus, wenn die Auslagerungsdatei / der virtuelle Speicher angepaßt wird, das in dieser Zeit Speicheranforderungen abgelehnt werden können. Eine einfache Programmschleife überbrückt solche Dinge aber wunderbar (bei mir wird je durchlauf das "delay()" um eine milisekunde erhöht.))

Kannst du mir dazu noch nen Link geben? Weil in der MSDN kann ich nix dazu finden. Weder im Memory Managment noch in den einzelnen Funktionen wird soetwas erwähnt. Es gibt auch keinen Error-Code dafür.
Nein, leider nicht. Das habe ich auf Benutzerebene gelesen. Meine Rechner sind recht langsam und oft ausgelastet (1 Ghz,.....)
Hin und wieder kommt da mal eine "kleines gelbes Dreieck" in der Taskleiste von Windows. Klicke ich drauf (oder schaue danach mal in der Windowsverwaltung) dann steht dort als Meldung halt das der Virtuelle Speicher angepaßt wird und in der Zeit Speicheranfragen abgewiesen werden können (so in der Art). Kommt nicht oft vor, hab es aber schon etliche Male gelesen.
Wie auch immer, sicher ist sicher ;-)

Verfasst: 08.12.2008 00:34
von PMV
Hm ... hast du in der Zeit auch mal eine Fehlermeldung von einem
Programm bekommen, welches genau dieses Problem hatte?

MFG PMV

Verfasst: 09.12.2008 20:54
von Toshy
Hi. Diese Meldungen kommen NICHT "Userprogrammen", sondern die kommt direkt vom Betriebssystem "Windows XP". Irgend ein x-beliebiges Programm / Systemprogramm / Dienst fordert speicher an, den das System nicht mehr vergeben kann (vermutlich wenn man die Auslagerungsdatei begrenzt). Geschieht dies, wird die begrenzung der Auslagerungsdatei vom System wohl einfach übergangen und die Datei "zwangsvergrößert". Dann kommt es zu dieser Meldung. Soweit habe ich das beobachtet bzw. vermutet, genau kann ich dazu nichts mehr sagen, da es selten vorkommt und ich jetzt auch keine Lust habe zu versuchen das zwangsweise auszprobieren. Die Fehlernummer kann ich daher auch nicht sagen.

Ich mache aber vielleicht doch gleich mal mein zweites fast baugleiches altes Notebook an und schaue mal ob ich da so ne Fehlermeldung erzwingen kann. Blöd nur, das ich gerade vor 5 Minuten einen viel größeren Speicher eingebaut habe, weil der alte kaputt war. hehe.

Also bis später... ich editiere dann vielleicht diesen Beitrag..

[edit]
Ich konnte es jetzt reproduzieren, aber etwas anders als sonst. JEtzt kam die Meldung schon bevor ich mich als User anmelde. Genauer Text:
DialogTitel:
Windows - Nicht genügend virtueller Speicher
DialogText:
"Nicht genügend virtueller Speicher. Die Auslagerungsdatei wird vergrößert. Speicheranforderungen können während dieses Vorgangs abgelehnt werden. Weitere Informationen finden sie in der Hilfe."
Was mich aber sehr wundert ist, das diese Meldung kommt, obwohl ich gerade 512 MB Ram eingebaut habe und so viel beim Start laut Taskmanager nicht verbraucht wird. Sehr eigenartig.
Habe das mal als Bitmap gespeichert, weiß aber nicht wie ich es hier zeigen könnte.
GoogleSuche:
http://www.google.de/search?num=100&hl= ... uche&meta=

Verfasst: 09.12.2008 22:12
von PMV
Die Auslagerungsdatei hat äh ... nichts mit dem RAM zu tun ... die
befindet sich auf der Festplatte und die größe kannst du selber festlegen,
wenn Windows solchen mist macht. Und wenn dus falsch voreingestellt
hast ... erst recht ändern :wink:

Rechtsklick auf Arbeitsplatz -> Eigenschaften
-> Reihter Erweitert auswählen
-> unter Systemleistung auf Einstellungen klicken
-> Fenster "Leistungsoptionen" den Reihter Erweitert auswählen
-> unter Virtueller Arbeitsspeicher auf Ändern klicken
-> ich hab 1,5 GB als Mindestgröße angegeben, sicher ist sicher :mrgreen:

Und um auf meine Frage in dem Post vor dir zu kommen.
Damit mein ich natürlich NICHT Windows selber. :roll:
Mich interessierte, ob Programme aufgrund dessen abgeschmiert sind oder
Fehlermeldungen produziert haben. :|

MFG PMV

Verfasst: 09.12.2008 22:16
von Fluid Byte
PMV hat geschrieben:Die Auslagerungsdatei hat äh ... nichts mit dem RAM zu tun ...
Huh? :shock:

http://de.wikipedia.org/wiki/Auslagerungsdatei